计算机工程学院
Project2(GUI+SQL2005)
实习报告
选题名称:
专业: 计算机科学与技术(软件工程方向)
班级: 软件1092
姓名: 王伟剑
学号: 1091305220
指导教师: 冯万利 于长辉 高尚兵 庄军
2011 年 06 月 11 日
Project2(GUI+SQL2005)实习任务书
指导教师(签章):
年月
摘要:
随着现代工业的发展,计算机信息管理系统越来越受到企业的重视。本文主要分析介绍了仓库管理系统的一些基本功能和组成情况,包括系统的需求分析、系统结构、功能模块划分以及数据库模式分析等,重点对应用程序的实际开发实现作了介绍。达到了数据的一致性和安全性,且应用程序功能完备,符合了库存管理系统作为典型的信息管理系统(MIS)的要求。同时简单介绍了Visual Studio 2008编程环境和SQL数据库管理系统的功能特点,库存管理系统是企业物流管理中不可或缺的的一部分。本系统利用ASO三层架构,完成系统登录,注销,修改密码的基本功能,仓库入库登记,出库登记,仓库货物预警,仓库内货物盘点的主要功能。本系统并不复杂,主要完成通过GUI开发,利用关键字对数据库进行增删改查等操作。
关键词:仓库管理;数据库;信息管理;Visual Studio 2008
目 录
1 需求分析 ....................................................... 2
1.1 系统概述 ............................................................. 2
1.2系统总体需求 ......................................................... 2
1.3可行性分析 ........................................................... 2
2 概要设计 ....................................................... 3
2.1 E-R图 ............................................................... 3
2.2相关说明 ............................................................. 3
3 详细设计 ....................................................... 4
3.1数据库表定义 ......................................................... 4
3.2 GUI框架设计 ......................................................... 5
4 编码实现 ....................................................... 8
5 总结 .......................................................... 18
1
1 需求分析
1.1 系统概述
仓库存放的货物品种繁多,堆放方式以及处理过程也很复杂。随着业务量的增加,仓库管理者需要处理的信息量会大幅上升,因此往往很难及时准确的掌握整个仓库的运作状态。针对这一情况,本系统在满足仓库的基本管理功能基础上发挥信息系统的智能化,减轻仓库管理人员和操作人员的工作负担。
系统主要实现目标是监控整个仓库的运作情况;提供完整的计划任务功能,由整个操作系统的指令中心来安排进出任务,确认任务的开始,进货管理和出货管理按其指令执行即可;实时监控所有货物的在线运动的情况,实时提供仓库变化的信息。
1.2系统总体需求
根据详细的需求分析,企业在库存中面临的主要问题体现在:库存量大,库存资金周转慢,不能及时统计库存物料;库房人员重复工作多,效率低;不知道库存物资积压时间长短。系统输入繁琐,极易产生输入错误,缺少智能化输入功能,如:产品名称输入过程中,产品名称和产品代码不能够相互协调,易产生不匹配现象。另外,整个系统运行较慢,数据处理能力不够,进行一个查询往往需要等待很长时间。该系统还缺少通用库存管理理功能,货物组成条目都是经过手工计算的,工作量很大,且容易产生错误,有一个小错误,核对都需要花费很大的精力,换句话说,当前没有通用库存管理系统。
本系统从最初的采购到存储和出库,仓库管理将决定企业是否兑现其承诺。从仓库计划到仓库操作和交叉运输,优化的仓库将有助于大幅度减少企业的库存量和和货物成本,因为企业将能保持较低的库存货水平,优化入库,保管和出库活动,并且协调载货量。
1.3可行性分析
技术上可行:该系统所需硬件设备,市场上销售且价格较低,甚至可以使用原有的设备,软件上,操作系统采用Windows系列操作系统,数据库管理系统 2
采用Visual Studio 2008,这些软件在GUI开发中已被大量应用,技术上都比较成熟。因此在技术上是可行的。
2 概要设计
2.1E-R图
2.2相关说明
登录系统:账号密码均存储于SQL数据库中。输入账号及账号对应密码,即可 登录系统。
修改密码:需输入一次原密码,输入两次新密码相同即可修改。密码修改同步于 SQL数据库。
注销: 登录账号退出,返回登陆界面。
退出系统: 系统退出。
3
入库登记:输入产品ID,即可直接获得产品的相关信息,此时输入入库数量就 可以完成货物的入库操作,如果此时产品为新产品,需输入产品的 详细信息,就可以完成货物的入库操作。入库操作同步更新SQL数 据库。
出库登记:输入产品ID,即可直接获得产品的相关信息,此时输入出库数量就 可以完成货物的出库操作,入库操作同步更新SQL数据库。
仓库预警:输入预警数量,点击确定按钮,此时显示数据库中,货物数量小于预 警数量的货物总数和货物详细信息。
商品查询:显示仓库中所有货物的详细信息,可以输入产品ID和产品名称进行 货物查询,支持模糊查找。
3 详细设计
3.1数据库表定义
Users表(用户信息表)
Goods表(货物详情表)
4
Worehouses表(仓库信息表)
3.2GUI框架设计 1用户系统
2主菜单
5
3密码修改
4货物入库
6
5 货物出库
6 库存预警
7
7 商品查询
4 编码实现
登录系统
public static string pwd;
public static string pid;
private void button1_Click(object sender, EventArgs e)
8
{
pwd = this.textBox1.Text;
pid = this.textBox2.Text;
Logs l = new Logs();
if (int.Parse (l.isPassword(this.textBox2.Text,this.textBox1.Text).ToString () )== 1)
{
this.Hide();
Management m = new Management();
m.ShowDialog();
}
else
{
DialogResult dr = MessageBox.Show("请检查您的用户名和密码", "登录失败", MessageBoxButtons.YesNo);
if (DialogResult.No==dr)
{
Application.Exit();
}
}
}
private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}
主菜单
public partial class Management : Form
{
public Management()
{
InitializeComponent();
}
private void ChangeToolStripMenuItem_Click(object sender, EventArgs e)
{
ChangePassword cp = new ChangePassword();
cp.ShowDialog();
}
private void LogoutToolStripMenuItem_Click(object sender, EventArgs e)
{
DialogResult
MessageBoxButtons.YesNo);
if (dr == DialogResult.Yes) dr = MessageBox.Show("您确定要注销吗?","注销",
9
{
Application.Exit();
}
}
private void OutToolStripMenuItem_Click(object sender, EventArgs e) {
Application.Exit();
}
private void Management_Load(object sender, EventArgs e)
{
this.goodsTableAdapter.Fill(this.wmsDataSet.Goods);
}
private void Management_FormClosed(object sender, FormClosedEventArgs e) {
Application.Exit();
}
private void InputF2ToolStripMenuItem_Click(object sender, EventArgs e) {
InputWHForm iwh = new InputWHForm();
iwh.ShowDialog ();
}
private void Management_Activated(object sender, EventArgs e)
{
this.goodsTableAdapter.Fill(this.wmsDataSet.Goods);
}
private void OutF6ToolStripMenuItem_Click(object sender, EventArgs e) {
OutWHForm owh = new OutWHForm();
owh.ShowDialog ();
}
private void WarningToolStripMenuItem_Click(object sender, EventArgs e) {
Warning w = new Warning();
w.ShowDialog();
}
private void GoodsDetailsToolStripMenuItem_Click(object sender, EventArgs e) 10
{
this.goodsTableAdapter.Fill(this.wmsDataSet.Goods);
}
private void WareHouseDetailsToolStripMenuItem_Click(object sender, EventArgs e)
{
this.warehousesTableAdapter.Fill(this.wmsDataSet1.Warehouses);
}
private void SearchToolStripMenuItem_Click(object sender, EventArgs e)
{
Search s = new Search();
s.Show();
}
private void fillByToolStripButton_Click(object sender, EventArgs e)
{
try
{
this.goodsTableAdapter.FillBy(this.wmsDataSet.Goods);
}
catch (System.Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}
}
入库登记
public partial class InputWHForm : Form
{
public InputWHForm()
{
InitializeComponent();
}
private void InputWHForm_Load(object sender, EventArgs e)
{
// TODO: 这行代码将数据加载到表“wmsDataSet4.Goods”中。您可以根据需要移动或移除它。 this.goodsTableAdapter.Fill(this.wmsDataSet4.Goods);
11
}
private void button6_Click(object sender, EventArgs e)
{
this.Close();
}
public void SendToInput()
{
GoodsDetails s = new GoodsDetails();
s.GID = int.Parse(this.textBox1.Text);
s.GName = this.comboBox1.Text;
s.Gprice = float.Parse(this.textBox3.Text);
s.GProvider1 = this.comboBox1.Text;
s.GProvider2 = this.comboBox4.Text;
s.Wname = int.Parse (this.comboBox2.Text);
s.Count = SqlHelper.DefiniteCount(this.textBox1.Text) + int.Parse(this.textBox2.Text); SqlHelper.AddGoods(s);
}
private void button5_Click(object sender, EventArgs e)
{
SendToInput();
this.Close();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
GoodsDetails g = SqlHelper.Bind(this.textBox1.Text);
this.comboBox3.Text = g.GName;
this.textBox3.Text = g.Gprice.ToString ();
this.comboBox1.Text = g.GProvider1;
this.comboBox4.Text = g.GProvider2;
this.comboBox2.Text = g.Wname.ToString ();
}
}
出库登记
public partial class OutWHForm : Form
{
public OutWHForm()
{
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
12
{
this.Close();
}
private void button1_Click(object sender, EventArgs e)
{
SentToOutput();
this.Close();
}
private void SentToOutput()
{
GoodsDetails s = new GoodsDetails();
s.GID = int.Parse(this.textBox1.Text);
s.GName = this.comboBox1.Text;
s.Gprice = float.Parse(this.textBox3.Text);
s.GProvider1 = this.comboBox1.Text;
s.GProvider2 = this.comboBox4.Text;
s.Count = SqlHelper.DefiniteCount(this.textBox1.Text) - int.Parse(this.textBox2.Text);
SqlHelper.OutGoods(s);
}
private void OutWHForm_Load(object sender, EventArgs e)
{
// TODO: 这行代码将数据加载到表“wmsDataSet2.Goods”中。您可以根据需要移动或移除它。 this.goodsTableAdapter.Fill(this.wmsDataSet2.Goods);
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
GoodsDetails g = SqlHelper.Bind(this.textBox1.Text);
this.comboBox3.Text = g.GName;
this.textBox3.Text = g.Gprice.ToString ();
this.comboBox1.Text = g.GProvider1;
this.comboBox4.Text = g.GProvider2;
}
}
库存预警
public partial class Warning : Form
{
public Warning()
{
InitializeComponent();
}
13
private void button3_Click(object sender, EventArgs e)
{
this.listBox1.Items.Clear();
List<GoodsDetails> g = new List<GoodsDetails>();
g = SqlHelper.WarningBind(this.textBox2.Text);
int i = 0;
for ( i=0; i < g.Count();i++ )
{
this.listBox1.Items.Add(g[i].GID.ToString().PadLeft(4)
}
this.textBox1.Text = i.ToString();
}
} + g[i].GName.PadLeft(20) + g[i].Count.ToString().PadLeft(10) + g[i].GProvider1.PadLeft(20) + g[i].GProvider2.PadLeft(10));
货物查询
public partial class Search : Form
{
public Search()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
private void Search_Load(object sender, EventArgs e)
{
// TODO: 这行代码将数据加载到表“wmsDataSet5.Goods”中。您可以根据需要移动或移除它。 this.goodsTableAdapter.Fill(this.wmsDataSet5.Goods);
}
private void button2_Click(object sender, EventArgs e)
{
GoodsDetails g = SqlHelper.BindVague(this.comboBox3.Text);
this.textBox1.Text = g.GID.ToString();
this.textBox3.Text = g.Gprice.ToString();
this.comboBox1.Text = g.GProvider1;
this.comboBox4.Text = g.GProvider2;
this.comboBox2.Text = g.Wname.ToString();
14
this.textBox2.Text = g.Count.ToString();
}
private void button3_Click(object sender, EventArgs e)
{
GoodsDetails g = SqlHelper.Bind(this.textBox1.Text);
this.comboBox3.Text = g.GName;
this.textBox3.Text = g.Gprice.ToString();
this.comboBox1.Text = g.GProvider1;
this.comboBox4.Text = g.GProvider2;
this.comboBox2.Text = g.Wname.ToString();
this.textBox2.Text = g.Count.ToString();
}
}
数据库连接
public static void ChangeDBPassword(int p,string p2)
{
SqlConnection co = new SqlConnection(ConnectionString.con);
SqlCommand cmd = new SqlCommand(string.Format("update Users set Upassword='{0}' where UID='{1}'", p,p2), co);
co.Open();
var i = (int)cmd.ExecuteNonQuery ();
MessageBox.Show("密码修改成功");
co.Close();
}
public static void AddGoods(GoodsDetails g)
{
SqlConnection co = new SqlConnection(ConnectionString.con);
SqlCommand cmd3 = new SqlCommand(string.Format("select count(*) from Goods where 产品ID='{0}'", g.GID), co);
co.Open ();
int j=(int)cmd3.ExecuteScalar ();
if(j==0)
{
SqlCommand cmd2 = new SqlCommand(string.Format("insert into Goods values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}')",
g.GID ,g.GName ,g.Gprice,g.Count ,g.GProvider1 ,g.GProvider2 ,g.GDescribe,g.Wname ), co);
int i = (int)cmd2.ExecuteNonQuery();
MessageBox.Show("添加成功");
co.Close();
}
else
{
15
SqlCommand cmd1 = new SqlCommand(string.Format("update Goods set 产品名称='{1}',产品价格='{2}',仓库所剩数量='{3}',厂商='{4}',厂商='{5}',备注='{6}',收货仓库ID='{7}' where 产品ID='{0}'", g.GID, g.GName, g.Gprice, g.Count , g.GProvider1, g.GProvider2, g.GDescribe,g.Wname ), co);
int i = (int)cmd1.ExecuteNonQuery();
MessageBox.Show("更新成功");
co.Close();
}
}
public static void OutGoods(GoodsDetails g)
{
SqlConnection co = new SqlConnection(ConnectionString.con);
try
{
SqlCommand cmd1 = new SqlCommand(string.Format("update Goods set 产品名称='{1}',产品价格='{2}',仓库所剩数量='{3}',厂商='{4}',厂商='{5}',备注='{6}',收货仓库ID='{7}' where 产品ID='{0}'", g.GID, g.GName, g.Gprice, g.Count, g.GProvider1, g.GProvider2, g.GDescribe,g.Wname ), co);
co.Open();
int i = (int)cmd1.ExecuteNonQuery();
co.Close();
MessageBox.Show("仓库出库记录完成");
}
catch (SqlException)
{
MessageBox.Show("出库失败");
}
}
public static int DefiniteCount(string p)
{
SqlConnection co = new SqlConnection(ConnectionString.con);
SqlCommand cmd = new SqlCommand(string.Format("select 仓库所剩数量from Goods where 产品ID='{0}'", p), co);
SqlCommand cmd1 = new SqlCommand(string.Format("select count(*) from Goods where 产品ID='{0}'", p), co);
co.Open();
int i=0;
if ((int)cmd1.ExecuteScalar() == 1)
i = (int)cmd.ExecuteScalar();
co.Close();
return i;
}
public static GoodsDetails Bind(string p)
{
16
SqlConnection co = new SqlConnection(ConnectionString.con);
SqlCommand cmd = new SqlCommand(string.Format("select * from Goods where 产品ID='{0}'", p), co);
co.Open();
var i = cmd.ExecuteReader();
GoodsDetails g = new GoodsDetails();
while (i.Read())
{
g.GName = i[1].ToString();
g.Gprice = float.Parse(i[2].ToString());
g.GProvider1 = i[4].ToString();
g.GProvider2 = i[5].ToString();
g.GDescribe = i[6].ToString();
g.Count = (int)i[3];
g.Wname = (int)i[7];
}
return g;
}
public static List<GoodsDetails> WarningBind(string p)
{
SqlConnection co = new SqlConnection(ConnectionString.con);
SqlCommand cmd = new SqlCommand(string.Format ("select * from Goods where 仓库所剩数量<'{0}'",p), co);
co.Open();
var i = cmd.ExecuteReader();
List<GoodsDetails> gd = new List<GoodsDetails>();
while (i.Read())
{
GoodsDetails g = new GoodsDetails();
g.GName = i[1].ToString();
g.GProvider1 = i[4].ToString();
g.GProvider2 = i[5].ToString();
g.Count = (int)i[3];
g.Wname = (int)i[7];
gd.Add(g);
}
return gd;
}
public static GoodsDetails BindVague(string p)
{
SqlConnection co = new SqlConnection(ConnectionString.con);
SqlCommand cmd = new SqlCommand(string.Format("select * from Goods where 产品名称like '%{0}%'", p), co);
co.Open();
17
var i = cmd.ExecuteReader();
GoodsDetails g = new GoodsDetails();
while (i.Read())
{
g.GID = (int)i[0];
g.GName = i[1].ToString();
g.Gprice = float.Parse(i[2].ToString());
g.GProvider1 = i[4].ToString();
g.GProvider2 = i[5].ToString();
g.GDescribe = i[6].ToString();
g.Count = (int)i[3];
g.Wname = (int)i[7];
}
return g;
}
5 总结
在这次课程设计中,让我学到了很多在课堂和书本上学不到的知识,我在这次课程设计中最大的收获有以下几个方面:
一、领略到了数据库设计在计算机领域的重要性。数据库作为一个永久存储形式在应用中发挥着重要的作用。在数据库设计中,我明白了数据库设计中不是范式越高越好的。我们要根据我们的应用来决定,一切应该以需求为首要选择。
二、对变成环境、一些控件的使用和界面的美化方面更加熟悉。因为《仓库管理系统》中涉及到很多控件的使用,只有很好的使用这些控件才可以给出一个很好的界面呈现在用户的面前。这样更有利于数据库和用户之间的交流。这里就要涉及一些平时不太常见的控件的使用问题。为了更好的在系统中利用这些控件,我上网查询了一些关于控件使用的资料,最主要的是MSDN上面、还有借了一些这方面的书籍。在界面的美化方面,我了解了一些WINDOWS自定义界面的知识,现在的软件其实好多面向用户的时候用户首先看的就是一个软件的界面是否有好,是否漂亮。其实,界面美化是很重要的。因为美,是人一直追求的。主要知识有:自定义窗口形状,按钮的3D效果,控件的自定义等等。这些都是通过面向对象编程的一些特性实现的,又得是通过多态,又得是通过类的继承。
三、利用软件工程学开发系统。虽然这个《仓库管理系统》是一个小的系统,但只有从这些小的项目中就利用软件工程学的知识,这样可以开发在系统设计和实现中我们可以总结很多经验和教训。利用三层架构的框架设计,更好的展现了代码的清晰可辨。
四、系统的核心是入库、库存和出库三者之间的联系,每一个表的修改都将联动的影响其它的表,当完成入库或出库操作时系统会自动地完成库存的修改。查询功能也是系统的核心之一,在系统中即有单条件查询和多条件查询,也有精确查询和模糊查询,系统不仅有静态的条件查询,也有动态生成的条件查询,其目的都是为了方便用户使用。系统有完整的用户添加、删除和密码修改功能。体现了系统面向用户的方面。
18
致 谢 本次课程设计是在我的老师冯万利,于长辉等的亲切关怀和悉心指导下完成的。他们严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。从课题的选择到项目的最终完成,老师都始终给予我细心的指导和不懈的支持。两年多来,老师们不仅在学业上给我以精心指导,同时还在思想、生活上给我以无微不至的关怀,老师们一丝不苟的作风,严谨求实的态度,踏踏实实的精神,不仅授我以文,而且教我做人,虽历时三载,却给以终生受益无穷之道。对老师们的感激之情是无法用言语表达的。在此谨向老师们致以诚挚的谢意和崇高的敬意。
淮阴工学院,这里严谨的学风、优美的校园环境使我大学两年过的很充实和愉快。在这短短的两年时间里,我有幸和许多优秀的同学一起学习,听睿智的老师们讲授课程。虽然只有短短的两年时光,但我确实学到了很多有用的知识,尤其是对我思想和方法上的指导。这些有用的东西一直对我大学的学习和生活有很重要的指导作用,我相信,这些东西将伴随我走完整个人生的道路。我不能不感谢班里的每一位同学和老师,跟你们在一起学习、生活,那真是其乐融融,妙不可言!
在本次课程设计即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚的谢意!最后我还要感谢培养我长大含辛茹苦的父母,谢谢你们!
“路漫漫其修远兮,吾将上下而求索”,这是大二旅程的结束,也是未来道路的开始。未来的路极其漫长与艰辛,我将更加的努力,不负家人,老师,同学们的众望。
19
参 考 文 献
1 NIIT《使用C#进行面向对象编程》上海,安艾艾迪信息技术有限公司 2 NIIT《使用.NET Framework进行GUI应用开发》上海,安艾艾迪信息技术有限公司
3 NIIT《关系数据库系统介绍使用SQL Server 2005查询和管理数据》上海,安艾艾迪信息技术有限公司
4 NIIT《使用ADO.NET 和XML开发数据库应用程序》上海,安艾艾迪信息技术有限公司
5 NIIT《编程逻辑与技术信息搜索和分析技能》上海,安艾艾迪信息技术有限公司
20
信息系统分析与设计课程设计报告题目仓库管理系统专业信息管理与信息系统班级093221学号09322117姓名指导老师黄国辉20xx…
仓库管理系统需求分析报告1需求分析1.1系统的目的货物仓库管理系统主要针对于日常库存信息的管理,它针对仓库日常发生的业务,分为了两…
仓库管理系统分析报告简述物品仓库一直是本企业单位仓管部门的主要任务随着业务的不断发展加强成本管理与收入管理通过提高服务水平提升企业…
仓库管理系统分析报告仓库管理系统分析报告仓库管理系统分析报告第四组项目背景仓库管理系统是企业信息系统中一个相当重要的组成部分仓库管…
仓库管理系统可行性研究报告汽车与交通工程学院运输1101二O一一年二月1引言11编写目的为了以最小的代价在最短的时间内确定仓库管理…
数据库技术课程设计题目姓名学号班级时间目录1需求分析1111仓库管理系统的功能分析112仓库管理系统的功能图22概念结构设计33逻…
东南大学成贤学院毕业设计论文开题报告学生姓名仇璐佳学号01106106起讫日期20xx年3月13日设计地点指导教师二O一0年3月1…
信息系统分析与设计课程设计报告题目仓库管理系统专业信息管理与信息系统班级093221学号09322117姓名指导老师黄国辉20xx…
1需求分析11系统的目的货物仓库管理系统主要针对于日常库存信息的管理它针对仓库日常发生的业务分为了两大类即入库和出库用户通过相应的…
基于条形码的仓库管理系统可行性分析报告I引言11目地近年来生产的工业化速度迅速加快生产的产品数量猛增给传统的仓库管理方式手工作业带…
仓库管理系统数据库设计与实现一.实验时间、地点时间:第十三周(11月21日25日)地点:软件楼305二.实验目的通过本次课程设计让…