VB邮局信息管理.docx
- 文档编号:9396195
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:36
- 大小:2.99MB
VB邮局信息管理.docx
《VB邮局信息管理.docx》由会员分享,可在线阅读,更多相关《VB邮局信息管理.docx(36页珍藏版)》请在冰豆网上搜索。
VB邮局信息管理
邮局信息管理系统
1.课程设计的目的
邮局信息管理是一项工作量大、繁琐、复杂而要求又十分细致、精确的工作。
邮购是一种长久以来人们都在使用的购物方式,这种方式是可以在远距离之间进行商业活动的方式,方便了人们的购物和联系,使人们的生活方式更加的丰富多彩。
早期的邮局信息管理基本上是靠大量人工来实施的,那么必然会带来数据操作效率低、易丢失等麻烦,由于人员的增加不仅增加财务花费,而且往往由于抄写不慎,或者由于记账的疏忽容易出现操作错误。
因此设计了邮购公司信息记录管理系统,可以实现的主要功能是对邮编信息、雇员信息、客户信息、库存信息、订单信息、进行管理,即数据的检索和维护,并可以实现简单的计算,可以查询总账和月份帐的营业额,订单量,客户信息和员工业绩的排序。
除此之外用户还可以打印各种信息的报表。
该系统能够提高邮购公司的管理效率,以及加快客户可快速查找的效率,所以此次设计将对我们的生活有着重要的意义。
2.功能介绍
2.1功能模块划分
设计邮购公司信息记录管理系统,其功能模块划分如下:
(1)邮编信息管理
邮政编码管理中包括邮编和地区两个属性列,并对这两个属性进行插入,修改,删除以及数据表的显示工作。
(2)雇员管理
雇员管理中包括雇员编号,雇员姓名,邮政编码,雇用日期几项,用户可以对雇员信息进行查看,删除,插入以及修改的操作。
(3)库存信息管理
在库存管理中有部件编号,部件名称,库存量,产品单价,订购级别这几个项目,可以实现用户对库存信息的检索和更新,该模块是和后台数据库的parts表建立连接,在前台的各项操作最后都会转存到后台的数据库中。
(4)订单信息管理
在订单信息管理模块中有订单号,客户号,雇员号,订购时间和货物发出时间几项,可以进行添加,删除,修改等操作,并与数据库的orders表建立连接。
(5)客户信息管理
在客户信息管理中有客户号,客户姓名,街区和电话几项可以进行添加,删除,修改等操作,并与数据库的customers表建立连接
(6)订单详情管理
订单详情管理其中有订单号,部件号,订购数量几项,用户可以对雇员信息进行查看,删除,插入以及修改的操作。
(7)员工业绩
员工业绩模块是进行统计员工业务的功能模块,在里面有两个子查询一个是总账查询一个是分账查询,在总账查询中是对员工总体的查询,有员工的总营业额,总订单数,客户信息,售出部件的信息等查询。
(8)报表
报表则是在数据需要打印时用到的模块。
2.2系统数据库设计
客户信息、邮编信息、雇员、库存,这些管理是用来显示和储存数据实体,在订单信息存在着数据的冗余问题,使表结构的存储查询效率下降。
所以在这里把它分为订单和订单详情,并为订单设立订单号作为主键,把订单设为一个实体,目的就是减小数据的冗余度问题。
实体之间的关系E-R图,如图1所示:
图1实体间关系E-R图
将上面E-R图转化关系模式,关系的主码用双下划线标识,外码用粗线标识。
邮政编码表:
(邮编,地区)
雇员表:
(员工编号,员工姓名,邮编,入职日期)
库存表:
(部件编号,部件名称,库存数量,产品单价,订购级别)
客户信息表:
(客户号,客户姓名,电话,邮编,街区)
订单表:
(订单号,雇员号,客户号,定货时间,发货时间)
订单详情表:
(订单号,部件编号,零件数量)
其中订单详情表的零件号和部门号分别都是外码。
分别建立基本表模型和实例,如以下各表和图所示。
(1)邮政编码表的设计,如表1所示。
表1邮政编码表
字段名
字段类型
字段说明
备注
zip
Int
邮编
主码
city
Varchar
地区
(2)雇员表的设计,如表2所示。
表2雇员表
字段名
字段类型
字段说明
备注
eno
Int
员工编号
主码
ename
Varchar
员工姓名
zip
Int
邮编
外码
hdate
char
入职日期
(3)库存表的设计,如表3所示。
表3库存表
字段名
字段类型
字段说明
备注
pno
Int
部件编号
主码
pname
Varchar
部件名称
qoh
Varchar
库存数量
Qoh>=0
price
integer
产品单价
Price>=0.0
olevel
integer
订购级别
(4)客户信息表的设计,如表4所示。
表4客户信息表
字段名
字段类型
字段说明
备注
cno
Int
客户号
主码
cname
Varchar
客户姓名
phone
Char
电话
zip
Int
邮编
street
Varchar
地区
(5)订单表的设计,如表5所示。
表5订单表
字段名
字段类型
字段说明
备注
ono
Int
订单号
主码
cno
Int
雇员号
eno
Int
客户号
received
Char
订货时间
shipped
Char
发货时间
(6)订单详情表的设计,如表6所示。
表6订单详情表
字段名
字段类型
字段说明
备注
ono
Int
订单号
非空
pno
Int
部件编号
非空
qty
integer
零件数量
Qty>0
(7)邮编表的创建,如图2所示。
图2邮政编码表
(8)雇员表的创建,如图3所示。
图3雇员表
(9)库存表的创建,如图4所示。
图4库存表
(10)客户信息表的创建,如图5所示。
图5客户信息表
(11)订单表的创建,如图6所示。
图6订单表
(12)订单详情表的创建,如图7所示。
图7订单详情表
3.详细设计
3.1系统功能模块图
图8系统功能模块图
3.2登录模块设计
登录模块的详细设计主要是用户登录的一个界面,判断登录的用户是管理员还是普通用户,进入后将面对的是主界面,从而进行相关的操作。
登录的界面主要由用户名和密码的信息,还有一些标题设置,确定和取消的按钮组成。
通过标题可以知道此系统的大概内容,由此,登录界面的设计完成,如图9所示。
图9登陆界面
在此界面中,输入用户名“lsm”和用户密码“123456”,然后选择“进入”按钮,就会弹出消息框,提示用户可以进入主窗体操作界面,如图10所示。
图10消息框界面1
如果输入的用户姓名或者用户密码有误,将弹出消息框提示用户重新输入密码和用户名,如图11所示。
图11消息框界面2
3.3主窗体模块详细设计
在这个界面中创立的是一个MDIForm窗体和如图13所示的一些菜单选项。
在窗体上点击右键选择菜单编辑器,在弹出的菜单编辑器界面里建立菜单的结构,如图12所示。
图12菜单编辑器界面
PrivateSubkehu_Click()
Form5.Show
EndSub
PrivateSubkhbbiao_Click()
Form13.Show
EndSub
以上代码是起始界面的菜单栏中调用显示客户管理窗体和调用显示客户报表的程序代码,在点击每个菜单时,触发Click事件,激活每个窗体,将焦点转给当前应用的窗体,其余各个菜单的程序代码同客户表的程序代码。
图13主窗体操作界面
在该MDIform窗体菜单中另外添加了各个表的报表,它们通过右键菜单来显示。
3.4各项子模块详细设计
3.4.1数据库连接控件和数据环境的创建
在对各项子模块详细设计之前,须要通过VB中的菜单栏的“工程”、“部件”选项来添加所需的数据库连接控件和创建Dataenvironment。
(1)Adodc的创建及与数据库连接的设计
首先点击“工程”,“部件”,弹出“部件”对话框中选择“控件”选项,显示ActiveX控件列表如图14所示在列表框中选中要添加的控件“MicrosoftADODataControl6.0”,单击控件名称左侧的复选框,然后单击“确定”按钮即可。
图14控件列表界面
在窗体上添加Adodc数据控件,默认名为Adodc1。
右键Adodc1控件在弹出菜单中选择“Adodc属性”如图15所示。
单击生成弹出如图16所示的窗体,选取SQLserver2005数据库的正确路径。
在单击测试连接,确定连接后,单击确定,如图17所示。
图15Adodc属性界面
图16数据连接属性界面1
图17数据连接属性界面2
然后选择“数据源”选项卡,如图18所示,选择“2-abCmdTable”表示在“表或存储过程名称”里面选取主要查询的表,单击确定。
但是在查询中要选择“8-abCmUnkonwn”,表示不在“表或存储过程名称”里面选择项目。
图18属性页1界面
(2)数据绑定控件DataGrid控件的添加
在控件列表框中选择“MicrosoftDataGridContronl6.0(OLEDB)”,单击控件名左称左侧的复选框,然后单击“确定”按钮即可,如图19所示。
图19数据绑定控件创建界面
(3)DataEnvironment的创建
单击菜单“工程”,“添加DataEnvironment”,创建了数据环境DataEnvironment1以及Connection对象Connection1,如图20所示。
图20DataEnvironment的创建界面
右击Connection1并选择“属性”,弹出“数据连接属性”对话框,在“提供者”选项卡中选择“MicrosoftOLEDBProviderForSOLServer”操作界面同图17所示,右键单击Connection1选择“添加命令”选项,会在数据环境界面中出现命令按钮Command1,然后再右键单击Command1选择“属性”选项,通过该选项可以选择Command1的数据对象,如图21所示。
图21Command1属性界面
3.4.2各个子模块的详细设计
(1)各个表的修改、删除、添加
单击“邮编管理”项弹出如图22所示的运行界面,在文本框中输入邮编和地区,在单击“添加”件就可以新增一条记录,而数据的修改则要在右边的表里修改,删除数据则是选中某项记录然后点击Delete键,这样设计的好处在于可以把更直观的数据项呈现给用户,而不是让用户去输入要删除或修改的项目,这样的设计既简单又实用。
图22运行界面1
添加按钮的代码如下:
PrivateSubCommand1_Click()
Adodc1.Recordset.AddNew
Adodc1.Recordset.Fields("zip")=Text1.Text
Adodc1.Recordset.Fields("city")=Text2.Text
Adodc1.Recordset.Update
Form2.Combo1.AddItemText1.Text
Form5.Combo1.AddItemText1.Text
EndSub
在窗体上添加如图的这些控件用Adodc连接数据库,在DataGrid控件中设置DataSource属性的值为Adodc1,这样DataGrid控件才能与数据库关联起来,在把DataGrid的AllowAddNew、AllowArrows、AllowDelete、AllowUpdata这四个属性值设为True,这样才可也实现在DataGrid控件里边添加,修改和删除。
在这段代码中“Adodc1.Recordset.Fields("zip")=Text1.Text”语句是用来向数据库添加数据的,窗体有两种输入记录的方式,这样做的目的在于方便用户的输入,还有就是在向带有外码的数据表插入数据时可以在其中选取数据,更加的方便。
Form2.Combo1.AddItemText1.Text则是为其他窗体的下拉菜单中添加选项的。
单击雇员管理选项,运行界面如图23所示,这是员工信息的界面,在邮编的添加
中设计了“ComboBox”因为该表的邮编是外键而在邮编表里是主键。
图23运行界面2
在这个窗体中有“Adodc1.Recordset.Fields("zip")=Combo1.Text”这条语句是与“邮政管理”不同的地方,这是指把combo1的之添加到数据库中,在模块设计的时候为了实现相关功能的内聚把一个系统的管理集成在了一起,向“高内聚,低耦合”的方向发展。
其它的模块实现起来都是相同的。
以下是其余各个表运行界面,如图24、25、26、27、28所示。
图24运行界面3
图25运行界面4
图26运行界面5
图27运行界面6
(2)员工业绩管理
单击“员工业绩”弹出如图28所示的界面,在其中选择“总账查询”,界面如图29所示。
图28运行界面7
首先在雇员号文本框中输入所要查询的“雇员号”,然后在总账查询界面中单击“零件信息”按钮,将会在DataGird控件中显示出与雇员号相对应零件信息,如图29所示。
图29运行界面8
在总账查询界面中单击“客户信息”按钮,将会查询出雇员号为“1000”的客户信息,如图30所示。
图30运行界面9
在总账查询界面中单击“订单总数”按钮,将会查询出雇员号为“1000”所对应的客户订单总数,如图31所示。
图31运行界面10
在总账查询界面中单击“总营业额”按钮,将查询出雇员号为“1000”的总营业额,如图32所示。
图32运行界面11
以上这些都是必须要在文本框中输入员工的编号之后,才能实现各项功能的,因为在代码中Text1.Text是一个必要的量,SQL语句也是由它来组成的,没有它的话,SQL就不是一个完整的语句,也就运行不出来想要的结果。
可在点击“营业额排序”的时候可以不写员工的编号。
在点击“营业额排序”时会显示有业绩的员工的总营业额从高到底的排序,在显示的同时还会显示一下基本的员工信息,如员工的编号,姓名和总营业额,运行界面如图32所示。
在这里由于这是课程设计的缘故,所以只添加了两个有业绩的员工,所以只显示两个人的信息。
总账查询中的各个按钮的代码如下:
PrivateSubCommand1_Click()
a=Text1.Text
Adodc1.RecordSource="selectsum(parts.price*odetails.qty)fromodetails,parts,orderswhereorders.ono=odetails.onoandodetails.pno=parts.pnoandorders.eno='"&a&"'"
Adodc1.Refresh
EndSub
PrivateSubCommand2_Click()
a=Text1.Text
Adodc1.RecordSource="selectcount(ono)fromorderswhereeno='"&a&"'"
Adodc1.Refresh
EndSub
PrivateSubCommand3_Click()
a=Text1.Text
Adodc1.RecordSource="selectdistincto,amefromorders,customerswhereo=oandeno='"&a&"'"
Adodc1.Refresh
EndSub
PrivateSubCommand4_Click()
a=Text1.Text
Adodc1.RecordSource="selectparts.pno,parts.pnamefromparts,odetails,orderswhereorders.ono=odetails.onoandparts.pno=odetails.pnoandorders.eno='"&a&"'"
Adodc1.Refresh
EndSub
图33运行界面12
在选择分账查询的时候界面如图33所示,在里面输入一个员工的编号和所要查询的月份就可以在进行相关的查询工作,针对某个月份的查询工作。
在输入月份和员工编号后点击“月营业额”会显示该员工的这个月份的营业额如图34所示。
图34运行界面13
鼠标单击“月订单数”会显示该员工的这个月的接到的订单数目如图35所示。
图35运行界面14
在选择月份后,直接单击“月营业额排序”不用在输入员工编号,可以显示这个月的按照营业额高低的顺序的排序,可是由于这只是课程设计所以在插入数据的时候没有插入太多的数据可以供分月排序之用,所以在输入员工编号“1000”,月份“12月”时只显
一条数据,说明这个月只有他一个人又订单信息和营业额。
分账查询的各个按钮的代码如下:
PrivateSubCommand1_Click()
a=Text1.Text
c=Combo1.Text
Adodc1.RecordSource="selectcount(ono)fromorderswhereeno='"&a&"'andreceivedlike'___"+c+"%'"
Adodc1.Refresh
EndSub
PrivateSubCommand2_Click()
a=Text1.Text
c=Combo1.Text
Adodc1.RecordSource="selectsum(parts.price*odetails.qty)fromodetails,parts,orderswhereorders.ono=odetails.onoandodetails.pno=parts.pnoandorders.eno='"&a&"'andreceivedlike'___"+c+"%'"
Adodc1.Refresh
EndSub
PrivateSubCommand3_Click()
c=Combo1.Text
Adodc1.RecordSource="selectemployees.eno,employees.ename,sum(parts.price*odetails.qty)fromodetails,parts,orders,employeeswhereorders.ono=odetails.onoAndodetails.pno=parts.pnoAndemployees.eno=orders.enoandreceivedlike'___"+c+"%'groupbyemployees.eno,employees.enameorderbysum(parts.price*odetails.qty)desc"
Adodc1.Refresh
EndSub
不同的查询是通过不通过SQL语句实现的,其他的流程都是一样的,都是用变量a代替Text1中的内容,用b变量代替combo1中的内容,由Adodc1的记录集对象RecordSource来操作表中的数据,后接SQl语句来实现不同的查询功能,在由下面就分别介绍一个每个查询的SQl语句。
在“总营业额”的查询时的SQl是"selectsum(parts.price*odetails.qty)fromodetails,parts,orderswhereorders.ono=odetails.onoandodetails.pn=parts.pnoandorders.eno='"&a&"'"其中的a是输入的员工编号,在a的两边是用“&”连接符号来连接的与SQL语句的其他部分组成一个完整的SQL语句的字符串。
在“总订单”的查询中的SQl语句是"selectcount(ono)fromorderswhereeno='"&a&"'"其中使用了聚集函数“count”目的是统计订单的数目。
在“对应客户信息”的查询的SQl语句是"selectdistincto,amefromorders,customerswhereo=oandeno='"&a&"'"由于在客户的信息和员工的信息存储在两个不同的表中,所以要将两个不同的表进行连接操作,才可以实现基于连个表的查询操作。
由于一个员工可以接受一个客户的多次订单,所以在查询的结果中会出现一个库户多次出现的情况。
正因为这些情况的出现是我们不像看到的,所以在结果的显示过程中添加了关键字“distinct”来消除重复列。
在“售出零件信息”的查询中用到的SQL语句是"selectparts.pno,parts.pnamefromparts,odetails,orderswhereorders.ono=odetails.onoandparts.pno=odetails.pnoandorders.eno='"&a&"'",这里的查询需要三个表的连接查询,这样多个表的连接其实是不可取的,因为在连接查询的时候是先将多个表做广义笛卡尔集,然后在进行查询工作,这样的运算机制就导致了,运算的时间复杂度会很高,在大量数据中的连接时是非常费时间的,建议使用嵌套查询的方式来进行查询,这样的效率会提高,因为它不用进行复杂的笛卡尔运算,但是要用嵌套来实现复杂的查询是非常困难的,对编写人员的技术要求很高。
正所谓写法的复杂性会带来性能的高效性。
本程序的数据库表结构比较简单,数据内容也很少,用连接查询的方式不会带来太大的麻烦。
“营业额排序”的SQl语句是"selectemployees.eno,employees.ename,sum(parts.price*odetails.qty)fromodetails,parts,orders,employeeswhereorders.ono=odetails.onoAndodetails.pno=parts.pnoAndemployees.eno=orders.enogroupbyemployees.eno,employees.enameorderbysum(parts.price*odetails.qty)desc"这里一样用到了多表的连接,还有分组和排序,在查询结束要关键字“group”来实现分组,后面的“employees.eno,employees.ename”是说明要按照员工的编号和,名字来分组,这样就可以把员工的总营业后统计起来后在按照不同的员工进行分组,分组后在按照语句“orderbysum(parts.price*odetails.qty)desc”将总的营业额按降序排列。
值得一提的是是在计算的时候用到的求总和的聚集函数“sum”和一个乘法运算来求出总的营业额。
在“分账查询”的选项里面实现的查询计算方法和“总账查询”里面的方法大致相同的。
不同得地方在于添加了按照不同月份来查询。
在“分账查询”里面多添加了一个Comdo的控件在里面添加了1月
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB 邮局 信息管理
![提示](https://static.bdocx.com/images/bang_tan.gif)