第一篇:ATM系统实现报告(VB)
面向对象方法设计与实现报告
—ATM机系统
软件0802班
高晓亮
200807040203
一、概要
根据ATM的需求分析,该系统设计为2个子系统:用户系统、银行工作人员系统。其中用户系统主要使用户在ATM上完成一些基本操作,例如:存款、取款、转账、查询余额、修改账户密码等银行工作人员系统主要用来管理用户账户、ATM机、事务。其具体功能和界面及代码将在下文叙述。
说明:该系统主要代码是用vb编写,数据库使用的是单机数据库access。
二、用户系统
A:主要界面介绍: 一)、待机界面:
1、功能:系统欢迎界面,点击模拟按钮开始模拟ATM机工作。
2、说明:由于没有找到合适的广告图片,所以待机默认先用蓝色背景代替。
3、界面文字动画代码如下:If Label5(0).Left > Me.ScaleWidth Then
Label5(0).Left = Me.Left100 End If
Label5(1).Move Label5(1).Left + 120
4、界面截图如下:
二)、登陆界面:
1、功能:a、密码框设置只能输入6位
B、密码输入3次错误,将冻结该账户
C、银行卡号不存在、冻结或密码错误,均不能进入系统
2、说明:因为各银行卡号位数不太一样,银行卡号位数并未设置。
3、登陆确认按钮代码如下: Private Sub Command27_Click()If Not Text7.Text = “" And Not Text8.Text = ”“ Then Dim sql As String sql = ”select * from 账户 where 银行卡号='“ & Trim(Text7.Text)& ”'“
Adodc1.RecordSource = sql
Adodc1.Refresh
If Adodc1.Recordset(”状态“)= ”冻结“ Then '判断该账户状态
MsgBox ”该账户已冻结!“
Text7.Text = ”“
Text8.Text = ”“
Else
sql = ”select * from 账户 where 银行卡号='“ & Trim(Text7.Text)& ”' and 密码=“ & Trim(Text8.Text)& ”“
Adodc1.RecordSource = sql
Adodc1.Refresh
If Adodc1.Recordset.EOF Then
MsgBox ”密码错误!“, 48, ”错误提示“
Text8.Text = ”“
count1 = count1 + 1
If count1 >= 3 Then '三次输入错误冻结该账户
Adodc1.Refresh
sql = ”select * from 账户 where 银行卡号='“ & Trim(Text7.Text)& ”'“
Adodc1.RecordSource = sql
Adodc1.Refresh
Adodc1.Recordset(”状态“)= ”冻结“
Adodc1.Recordset.Update
MsgBox(”三次输入错误,该账户已被冻结“)
End If
Else
Label10.Visible = False
Label11.Visible = False
Text7.Visible = False
Text8.Visible = False
Command27.Visible = False Command28.Visible = False Command14.Visible = True Command15.Visible = True Command16.Visible = True Command17.Visible = True Command18.Visible = True Command19.Visible = True Command24.Visible = True Ynum = Text7.Text Adodc2.Refresh ’添加事务 Adodc2.Recordset.AddNew
Adodc2.Recordset(”银行卡号“)= Ynum
Adodc2.Recordset(”事务类型“)= ”用户登录“
Adodc2.Recordset(”时间“)= Now()
Adodc2.Recordset(”事务描述“)= ”用户完成登陆“
Adodc2.Recordset.Update
Adodc2.Refresh Text7.Text = ”“ Text8.Text = ”“ End If End If Else MsgBox(”信息不全!请确认“)End If End Sub
4、界面截图如下:
三)、系统主界面
1、功能:ATM的主要功能陈列,供用户选择,其中包括存款、取款、转账、查询余额、修改密码、取卡、返回。当账户登录时,将在事务表中记录登录时间。
2、说明:由于所有按钮均只是用来调出对应的功能的界面,并没有实际功能,所以在此省略其按钮代码。
3、界面截图如下:
四)、存款界面
1、功能:a、只允许用户输入100的整数值
b、当文本框为空时报错
c、实现用户的存款功能
d、每存入一笔款,都将在事务表中记录该操作
2、存款代码如下:If Not Text12.Text = ”“ Then If Val(Text12.Text)Mod 100 = 0 Then Adodc1.Refresh Adodc1.Recordset(”余额“)= Adodc1.Recordset(”余额“)+ Val(Text12.Text)Adodc1.Recordset.Update Adodc1.Refresh Label15.Caption = ”存款成功“ ye = ye + Text12.Text Adodc2.Refresh Adodc2.Recordset.AddNew
Adodc2.Recordset(”银行卡号“)= Ynum
Adodc2.Recordset(”事务类型“)= ”存款“
Adodc2.Recordset(”时间“)= Now()
Adodc2.Recordset(”事务描述“)= ”用户存入“ & Text12.Text & ”元“
Adodc2.Recordset.Update
Adodc2.Refresh Text12.Text = ”“ Command33.Enabled = True Command32.Enabled = False Else MsgBox ”请输入100的整数“ End If Else Label15.Caption = ”无款可存“ End If End Sub
3、界面截图如下:
四)、取款界面
1、功能:a、用户按相对应数值的按钮进行取款
b、每个账户每天取款数不能超过2500
c、账户余额不足时,报错
d、用户每取走一笔款额,都将在事务表中记录取走金额和时间
2、说明:由于不同数值按钮的代码很相似,所以这里仅给出100按钮的代码
3、存款代码如下:Private Sub Command20_Click()Adodc1.Refresh If Adodc1.Recordset(”余额“)>= 100 Then Adodc1.Refresh Adodc1.Recordset(”余额“)= Adodc1.Recordset(”余额“)100 Adodc2.Refresh Adodc2.Recordset.AddNew
Adodc2.Recordset(”银行卡号“)= Ynum
Adodc2.Recordset(”事务类型“)= ”取款“
Adodc2.Recordset(”时间“)= Now()
Adodc2.Recordset(”事务描述“)= ”用户取走100元“
Adodc2.Recordset.Update
Adodc2.Refresh Else Label15.Caption = ”余额不足,取款失败“ End If End Sub
4、取款界面截图如下:
五)、查询余额界面
1、功能:实现用户查询对应账户的余额
2、查询余额代码如下:Private Sub Command17_Click()Command14.Visible = False Command15.Visible = False Command16.Visible = False Command17.Visible = False Command18.Visible = False Command19.Visible = False Label6.Visible = False Label7.Visible = False sql = ”select 余额 from 账户
where 银行卡号= '“ & Ynum & ”'“ Adodc1.RecordSource = sql Adodc1.Refresh Label8.Caption = Adodc1.Recordset.Fields(”余额“)Adodc2.Refresh Adodc2.Recordset.AddNew
Adodc2.Recordset(”银行卡号“)= Ynum
Adodc2.Recordset(”事务类型“)= ”查询余额“
Adodc2.Recordset(”时间“)= Now()
Adodc2.Recordset(”事务描述“)= ”查询余额“
Adodc2.Recordset.Update
Adodc2.Refresh Label9.Visible = True Label8.Visible = True End Sub
3、查询余额界面截图如下:
六)、转账界面
1、功能:a、实现用户转账
b、需2次确认账户信息,若信息输入不全,账户余额不足,2次输入不一样,均不可完成转账
c、用户每转一笔账,均将在事务表中记录转账金额和时间
2、转账代码如下:Private Sub Command30_Click()If Not Text11.Text = ”“ And Not Text10.Text = ”“ And Not Text9.Text = ”“ Then If Text10.Text = Text9.Text Then Adodc1.Refresh If Adodc1.Recordset(”余额“)>= Val(Text11.Text)Then Adodc1.Refresh Adodc1.Recordset(”余额“)= Adodc1.Recordset(”余额“)Me.picLOAD.Width)/ 2 'Me.picLOAD.Top = Me.ScaleHeight / 2Me.picLOAD.Width)/ 2 'Me.picLOAD.Top = Me.ScaleHeight / 2Me.picLOAD.Width)/ 2 'Me.picLOAD.Top = Me.ScaleHeight / 2-Me.picLOAD.Height Me.picLOAD.Visible = True 'DoEvents '释放控制权
Me.ListView1.ListItems.Clear Dim addLIST As ListItem Dim ss As String Dim sql As String ss = App.Path + ”datadata.mdb“ Adodc1.ConnectionString = ”Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=gxl;Persist Security Info=False;Data Source=“ & ss Adodc1.CommandType = adCmdText sql = ”select * from ATM“ Adodc1.RecordSource = sql Adodc1.Refresh '连接数据库
Do While Not Adodc1.Recordset.EOF Set addLIST = ListView1.ListItems.Add(, , Adodc1.Recordset!ATM机编号, , i)addLIST.SubItems(1)= IIf(IsNull(Adodc1.Recordset.Fields(”状态“).Value), Adodc1.Recordset.Fields(”状态“).Value)addLIST.SubItems(2)= IIf(IsNull(Adodc1.Recordset.Fields(”余额“).Value), Adodc1.Recordset.Fields(”余额“).Value)Adodc1.Recordset.MoveNext Loop Me.picLOAD.Visible = False End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)Select Case Button.Index
Case Is = 2 '
ZhZCfrm.Show 1
Case Is = 3
' ZHZXfrm.Show 1
Case Is = 4
Call addLIST End Select End Sub
3、界面截图:
”“, ”“,六)、单位信息界面
1、功能:显示单位信息
2、代码: Private Sub cmdBC_Click()'修改银行信息 Dim s As String If Not Text1(0).Text = ”“ And Not Text1(1).Text = ”“ And Not Text1(2).Text = ”“ And Not Text1(3).Text = ”“ And Not Text1(4).Text = ”“ Then
s = ”update 银行信息 set 银行名称='“ & Text1(0).Text & ”',银行地址='“ & Text1(1).Text & ”',邮政编号='“ & Text1(2).Text & ”',负责人='“ & Text1(3).Text & ”', 联系电话='“ & Text1(4).Text & ”'“
Adodc1.RecordSource = s
MsgBox(”修改成功“)
Adodc1.Recordset.Update
Else
MsgBox ”修改信息不全,请检查!“
End If End Sub
Private Sub Form_Load()Dim ss As String Dim sql As String ss = App.Path + ”datadata.mdb“ Adodc1.ConnectionString = ”Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=gxl;Persist Security Info=False;Data Source=“ & ss Adodc1.CommandType = adCmdText sql = ”select * from 银行信息“ Adodc1.RecordSource = sql Adodc1.Refresh '连接数据库 End Sub
3、界面截图:
七)、下面给出数据备份还原的代码 Private Sub a14_Click()On Error GoTo ERR_line newname = App.Path & ”datadata.mdb“ datapath = App.Path & ”backup“ & Date & ” 备份卡.bak“ FileCopy newname, datapath MsgBox ”数据已备份到
“ & datapath, 64, ”提示“ Exit Sub ERR_line: MsgBox ”不能完成数据备份!“, 48, ”运行错误“ End Sub
Private Sub a15_Click()On Error GoTo ERR_line
Me.CommonDialog1.ShowOpen
snewname = Me.CommonDialog1.FileName
sdatapath = App.Path & ”datadata.mdb“
If snewname <> ”“ Then
If MsgBox(”还原后将覆盖原有数据,确定还原吗?“, vbInformation + vbYesNo, ”提示“)= vbYes Then
FileCopy snewname, sdatapath
MsgBox ”数据已经成功还原!请重新登陆 “, 48, ”提示“
Unload Me
Formload.Show
Else
Exit Sub End If
End If Exit Sub
ERR_line: MsgBox ”不能完成数据还原,请进入系统后未做任何操作时进行!“, 48, ”运行错误" End Sub
四、数据库
本系统使用的是access数据库。数据库密码为gxl。本系统共有5张表,分别为:ATM,事务,系统用户表,银行信息,账户。
下面给出数据库的相关截图。
1、表图:
2、ATM的设计视图
3、事务的设计视图
4、系统用户表的设计视图
5、银行信息的设计视图
6、账户的设计视图
第二篇:VB人事管理系统[模版]
I 图书管理系统一、课程设计的目的与要求.......................................2
二、题目分析...................................................3
三、设计思路...................................................3
四、调试过程...................................................5 4.1、设计工程框架..........................................5 4.1.1、设计登录窗体....................................5 4.1.2、图书基本信息管理模块设计........................7 4.2、设计图书信息编辑窗体..................................8 4.3、图书信息管理窗体......................................9 4.4、图书借阅管理模块设计.................................11 4.4.1、设计借阅证件类型编辑窗体.......................11 4.4.2、设计借阅证件类型管理窗体.......................13 4.4.3、设计借阅证件编辑窗体...........................14 4.4.4、设计借阅证件管理窗体...........................14 4.4.5、设计图书借阅记录查看窗体.......................16 4.4.6、设计图书借阅信息编辑窗体.......................17 4.4.7、设计图书归还信息管理窗体.......................17 4.4.8、设计图书借阅管理窗体...........................18 4.4.9、设计用户信息编辑窗体...........................19
五、运行结果.................................................21
六、课程设计总结..............................................21
七、参考文献..................................................2I 图书管理系统
摘要
随着人类社会的发展,人类对知识的需求也不断地增长。在这种形势下,书籍就渐渐地成为人们获取并增长知识的主要途径,而图书馆就自然而然地在人们的生活中占据了一定的位置。绘本图书与其他普通图画书的区别在于绘本图书通常有独立的绘画著者,图画有个人风格,画面即情即景,可单幅成画,容易提高儿童读书的积极性。如何科学地管理绘本馆不但关系到读者求知的方便程度,也关系到绘本馆的发展,因此,开发一套完善的绘本图书馆管理系统就成不可少了,图书管理系统是典型的信息管理系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。
经过分析,使用 Microsoft公司的Visual Basic6.0为开发工具,利用其提供的各种面向对象的可视化开发平台作为开发工具,采用面向对象技术,图形化的应用开发环境,尤其是它有一个功能极其强大的集成环境提供级开发人员,使得开发人员可通过菜单、界面、图形浏览工具、对话框以及嵌入的各种生成器来轻松地完成各种复杂的操作。开发过程中不断修正和改进,直到形成用户满意的可行系统。
本文介绍了在Visual Basic6.0环境下采用“自上而下地总体规划,自下而上地应用开发”的策略开发本系统的详细过程,提出实现绘本图书馆信息管理、资源共享的基本目标,从而推动迈向数字化绘本图书馆的步伐,并阐述系统结构设计和功能设计,从绘本图书的入库登记到查询浏览,形成了一个整体自动化管理模式,从软件工程的角度进行了科学而严谨的阐述。图书管理系统
图书管理基本业务活动包括:对一本书的采编入库、清除库存、借阅和归还等等。试设计一个图书管理系统,将上述业务活动借助于VB数据库管理系统完成。
关键字:图书管理系统;SQL Server数据库;Visual Basic开发语言;管理信息系统。
一、课程设计的目的与要求
掌握VB的数据库编程技巧,及利用Access创建数据库的方法,利用VB的数据库控件与数据源建立连接,完成一个较为简单的数据库管理系统的设计。每种书的登记内容至少包括书号、书名、著者、现存量和总库存量等五项,对书目的相关信息均采用数据库存储。
系统应实现的操作及其功能定义如下:
1)采编入库:新购入一种书,经分类和确定书号之后登记到图书账目中去。如果这种书 在帐中已有,则只将总库存量增加。2)清除库存:某种书已无保留价值,将它从图书账目中注销。3)借阅:如果一种书的现存量大于零,则借出一本,登记借阅者的图书证号和归还期 限。
4)归还:注销对借阅者的登记,改变该书的现存量。5)显示:显示书库信息。图书管理系统
二、题目分析
图书管理系统需要的功能分析如下:
管理系统具有多个管理员,管理员可以使用不同的用户名和密码进入管理系统,并可以修改自己的密码;
(一)进入系统后可以重新登录该系统;
(二)在系统中可以对数据库进行简单的操作;
(三)最基本的功能还应具有可以编辑图书——录入、删除图书资料。图书分类信息的添加、修改、删除和查询。此功能为图书的分类管理提供依据。
(四)图书基本信息的添加、修改、删除和查询。
(五)借阅证件分类信息的添加、修改、删除和查询。不同类型的借阅证件可以借阅的最大数量、最大天数和续借天数不同。
(六)图书借阅证件的添加、修改、删除、挂失和查询。
(七)图书借阅管理,包括图书借阅、图书归还、图书续借、图书挂失和图书催还等。
三、设计思路
系统运作流程,该系统涉及到用户以及管理员,在两者之间进行一系列的操作。管理员对图书进行录入、删除等操作,和用户之间的交流则是进行借阅图书操作。运作流程图如图1所示: 3 图书管理系统
图1 运作流程图
图2所示,具体的操作流程: 图书管理系统
图2 具体的操作流程
四、调试过程 4.1、设计工程框架 4.1.1、设计登录窗体
登录窗体名称为FrmLogin,它的界面布局如图3所示: 图书管理系统
图3 界面布局
主窗体启动时,首先打开登陆对话框。主窗体代码如下: Private sub Form_load()Frmlogin.show1 End sub 如选的是退出系统菜单项时,触发mn_exit_click 事件,代码如下:
Private sub mn_exit_click()Dbapi_disconnect End End sub 通过身份认证时,则进入系统主界面如图4所示: 图书管理系统
图4 进入系统主界面
4.1.2、图书基本信息管理模块设计
图书基本信息管理模块可以实现以下功能: A、添加图书基本信息。B、修改图书基本信息。C、删除图书基本信息。D、查看图书基本信息。图书管理系统
4.2、设计图书信息编辑窗体
图书信息编辑窗体的名称为FrmBookEdit,窗体的布局如图5所示:
图5 窗体的布局
代码如下:
Private sub Cmd _OK_Click()With MyBookinfo BookNo=MakeStr(txtBookNo)‘图书编号 BookName=MakeStr(txtBookName)‘图书名称 Publisher=MakeStr(txtpulisher)
‘出版社 图书管理系统
Author=MakeStr(txtAuthor)‘作者 Location=MakeStr(txtLocation)‘存放位置 Price=Val(txtPrice)‘价格 Total=Val(txtTotal)‘数量 Typeld=nBookTypeld ‘图书分类 Descripition=MakeStr(txtDescripition)IfModify=False Then Insert Cmd_Ok.Enabled=False Else Call.UpDate(OnNo)End If End With Unload Me End Sub 4.3、图书信息管理窗体
如图6所示: 图书系统管理界面 图书管理系统
图6 图书系统管理界面
Private Sub TreeView1_Click()Focuskey=TreeView1_SelectdItem.Key CurBookTypeName=TreeView1.SelectdItem.Text CurBookTypeId=Val(Right(TreeView1.SelectdItem.Key,Len(TreeView1.SelectdItem.Key)-1))IfFocusKey=”a0” Then nTypeId=-1 Exit Sub End if bHaveSon=CurBookType.HaveSon(CurBookType.TypeId)10 图书管理系统
If bHaveSon=False Then TreeView1.SelectedItem.ExpandedImage=4 TreeView1.SelectedItem.Image=4 TreeView1.SelectedItem.SelectImage=5 nType=CurBookType.TypeId CurBookType.GetInfo(CurBookType.TypeId)GridRefresh End sub
4.4、图书借阅管理模块设计
图书借阅管理模块可以实现以下功能: a.借阅证件类型管理。b.借阅证件管理 c.图书借阅管理
4.4.1、设计借阅证件类型编辑窗体
借阅证件类型编辑窗体的名称为FrmCardTypeEdit,如图7所示: 图书管理系统
图7 阅证件类型编辑窗体
代码:
Private Sub Cmd_Ok_Click()With MyCardType TypeName=MakeStr(txtTypeName)MaxCount=Val(txtMaxCount)MaxDays=Val(txtMaxDays)AddDays=Val(txtAddDays)If Modify=False Then Insert End Call.Upate(tId)End if End with Unload Me End sub 图书管理系统
4.4.2、设计借阅证件类型管理窗体
借阅证件类型管理窗体的名称为FrmCardType,窗体布局如图8所示:
图8 借阅证件类型管理窗体
代码:
Private Sub GridRefresh()Adodc1.ConnectionString=conn ‘设置数据源
Adodc1.RecordSource=”SELECT ID AS编号,TypeNameAS 类型名称,MaxCount AS最大借阅数量,”+”MaxDays AS 最多借阅天数,AddDays As 续借天数 FROM CardType ORDER BY Id” Adodc1.Refresh‘设置列宽度 End sub 13 图书管理系统
4.4.3、设计借阅证件编辑窗体
借阅证件类型编辑窗体的名称为FrmCardsEdit,如图9所示:
图9 借阅证件类型编辑窗体
4.4.4、设计借阅证件管理窗体
设计借阅证件管理窗体的名称为FrmCardS,如图10所示: 图书管理系统
图10 设计借阅证件管理窗体
代码:
Private Sub GridRefresh()Adodc1.ConnectionString=com If ComboCardStatus.ListIndex=0 Then SchCnd=”” Else SchCnd=
”
AND
c.Status=
”+Trim(ComboCardStatus.Text)+”” End if Adodc1.RecordSource=”SELECT c.CardNo AS借书证号,c.Name AS 姓名,t.TypeName AS 类型,”+”c.Status AS 状态,t.MaxCount AS可借数量,t.MaxDays AS 借阅天数,c.WorkPlace AS工作单位,”+”c.IdCard AS 有效证件号码,c.CreateDate AS 发证日期” 图书管理系统
+”FROM Cards c,CardType t WHERE c.TypeId=t.Id”+SchCnd +”ORDER BY CardNo” Adodc1.Refresh ‘设置列宽度
If ComboCardStatus.ListIndex= 1 Then Cmd_Add.Enabled=Ture End if End sub
4.4.5、设计图书借阅记录查看窗体
用于查看指定借阅证件记录,窗体名为FrmRecord,窗体布局如图11所示:
图11 查看指定借阅证件记录 图书管理系统
4.4.6、设计图书借阅信息编辑窗体
设计图书借阅信息编辑窗体的名称为FrmBorrowEdit,此窗体的工作过程比较复杂,它的布局如图12所示:
图12 图书借阅信息编辑窗体
4.4.7、设计图书归还信息管理窗体
设计图书归还信息管理窗体的名称为FrmReturnEdit, 窗体布局如图13所示: 图书管理系统
图13 设计图书归还信息管理窗体
4.4.8、设计图书借阅管理窗体
设计图书借阅管理窗体的名称为FrmBorrow, 窗体布局如图14所示:
图14 设计图书借阅管理窗体 图书管理系统
如图15所示:
图15 设计图书借阅管理窗体
4.4.9、设计用户信息编辑窗体
用户信息编辑窗体可以用来添加和修改用户信息,窗体名称为FrmUserEdit,窗体布局如图16所示:
图16 用户信息编辑窗体
代码: 图书管理系统
Private sub Cmd_Ok_Click()With MyUser If
Modfiy=False
Or OriUser<>Trim(txtUserName)Then If.In_DB(MakeStr(txtUserName))=True Then MsgBox”用户名已经存在,请重新输入” txtUserName.SetFocus txtUserName.SelStart=0 txtUserName.SelLenght=Len(txtUserName)Exit sub End if.UserName=MakeStr(txtUserName).Pwd=MakeStr(txtPass)If Modify=False Then.Insert Else.Update(OriUser)If
OriUser=CurUserName Trim(txtUserName)<>OriUser Then CurUser.UserName=Trim(txtUserName)CurUser.GetInfo(CurUserName)
End if End if End With
And
图书管理系统
Unload Me End Sub
五、运行结果
如图17所示:
图17 运行结果
六、课程设计总结
通过本次课程设计,我们不仅加深了平时的学习并且了解到更多关于Visual Basic和SQL Server的使用,并且利用所学知识将各个对象的使用结合起来制作了一个完整的系统。这个图书馆系统可以使操作员进行一般的查询图书和会员信息、借阅和归还图书、整理图书包括录入和注销图书以及修改管理员密码以保护 21 图书管理系统
自己使用该系统的权利的功能。在结束了课程设计之后让我们对Visual Basic 的各个控件有了更好地掌握之外,也让我们了解了一个图书管理系统的基本模式,学习之余扩宽了知识面。虽然在平时的学习中通过老师的讲授已经基本掌握了Visual Basic的用法,但知识分散不牢固。通过本次设计,我们可以灵活的将VB中的基本控件结合起来,制作了这个完整的系统,并能准确地使用所学的编程语言来制作该系统。可以说完成课程设计之后让我们受益匪浅,同时也锻炼了我们的独立思考能力。相信通过本次实验,我们可以更好的使用VB来制作一些其他系统,能进一步学习和使用VB.当然,由于这是我们第一次进行制作,水平和经验限制了系统的功能。一些图书管理应有的功能暂时无法实现,需要更加完善。相信在这次实验之后我们可以对图书管理系统有进一步的学习和研究,以得到更好的发展。
七、参考文献
《Visual Basic程序设计》 谭浩强,清华大学出版社 《VB语言程序设计》 林卓然,电子工业出版社
《Visual Basic 6.0程序设计》 刘新民,清华大学出版社 《Visual Basic 程序设计教程》 罗朝盛,人民邮电出版社 《Visual Basic 6.0高级编程》 [美]Julia,清华大学出版社 《Visual Basic程序设计教程习题及习题解答》刘瑞新,机械工业出版杜
《全国计算机等级考试二级教程-Visual Basic语言程序设计》刘炳文,高等教育出版社 图书管理系统
附录(源程序代码)
权限设置的主要代码: Option Explicit Public constr As String '数据库连接信息 Public privilege As Integer '用户权限 Public rst As ADODB.Recordset '数据库内的记录 Public rst1 As ADODB.Recordset Public rst2 As ADODB.Recordset Public con As ADODB.Connection Public tablename As String Type userdata '用户信息,包括用户名,密码和对应的权限 user_id As String pwd As String right As Integer End Type Public Sub connect_db()constr = “Provider=Microsoft.Jet.OLEDB.4.0;” + “Data Source=” + App.Path + “dataComputerBookmanage.mdb” + “;Persist Security Info=False” '数据库引擎+路径
Set con = New ADODB.Connection '新建一个数据库连接
con.CursorLocation = adUseClient '用于客户端(ADOR)Recordset对象,游标
库属性必须为adUseClient 图书管理系统
con.ConnectionString = constr '连接信息 con.Open End Sub Function open_connection(table_name As String)Dim sqlstr As String Dim str As String Set con = New ADODB.Connection Set rst = New ADODB.Recordset con.CursorLocation = adUseClient sqlstr = “Provider=Microsoft.Jet.OLEDB.4.0;” + “Data Source=” + App.Path + “dataComputerBookmanage.mdb” + “;Persist Security Info=False” con.Open sqlstr str = “select * from ” & table_name & “" '执行SQL查询 rst.Open str, con, adOpenDynamic, adLockOptimistic rst.Requery End Function Public Sub check_privage(rightlevel As Integer)Dim right As Integer right = rightlevel Select Case right Case 1: '普通用户,只能查询图书信息和借阅信息 Form1.xpcmdbutton1.Enabled = False Form1.xpcmdbutton2.Enabled = False Form1.xpcmdbutton3.Enabled = False 图书管理系统
Form1.xpcmdbutton4.Enabled = False Form1.xpcmdbutton5.Enabled = True Form1.xpcmdbutton6.Enabled = True Form1.xpcmdbutton7.Enabled = False Form1.xpcmdbutton8.Enabled = False Form1.xpcmdbutton10.Enabled = False Form1.Show Unload frmLogin Case 2: '2级管理员,还可以借书和还书 Form1.xpcmdbutton1.Enabled = True Form1.xpcmdbutton2.Enabled = True Form1.xpcmdbutton3.Enabled = False Form1.xpcmdbutton4.Enabled = False Form1.xpcmdbutton5.Enabled = True Form1.xpcmdbutton6.Enabled = True Form1.xpcmdbutton7.Enabled = True Form1.xpcmdbutton8.Enabled = False Form1.xpcmdbutton10.Enabled = False Form1.Show Unload frmLogin Case 3: '3级管理员,可以录入图书 Form1.xpcmdbutton1.Enabled = True Form1.xpcmdbutton2.Enabled = True Form1.xpcmdbutton3.Enabled = True Form1.xpcmdbutton4.Enabled = False 图书管理系统
Form1.xpcmdbutton5.Enabled = True Form1.xpcmdbutton6.Enabled = True Form1.xpcmdbutton7.Enabled = True Form1.xpcmdbutton8.Enabled = False Form1.xpcmdbutton10.Enabled = False Form1.Show Unload frmLogin Case 4: '系统管理员 Form1.xpcmdbutton1.Enabled = True Form1.xpcmdbutton2.Enabled = True Form1.xpcmdbutton3.Enabled = True Form1.xpcmdbutton4.Enabled = True Form1.xpcmdbutton5.Enabled = True Form1.xpcmdbutton6.Enabled = True Form1.xpcmdbutton7.Enabled = True Form1.xpcmdbutton8.Enabled = True Form1.xpcmdbutton10.Enabled = True Form1.Show Unload frmLogin End Select End Sub 登陆后权限的分配主要代码如下:
If LCase(Trim(rst![登录名]))= LCase(Trim(Text1.Text))Then If Trim(rst![密码])= Trim(Text2.Text)Then 图书管理系统
privilege = rst![权限] Call check_privage(privilege)'权限分配读者管理主要代码:
Private Sub Command1_Click()'添加记录 Dim sql As String Dim param As ADODB.Parameter Dim cmd As ADODB.Command Set cmd = New ADODB.Command Set param = New ADODB.Parameter sql = ”select * from reader where [读者编号]= ? “ If Command1.Caption = ”添加记录“ Then Command1.Caption = ”确 定“ Command2.Enabled = False Command3.Enabled = False Command4.Enabled = False rst.AddNew Else If Text1.Text = ”“ Then frmMsg.Show frmMsg.notice.Visible = True frmMsg.Text1.Text = ”读者编号不能为空!“ Command2.Enabled = True Command3.Enabled = True Command4.Enabled = True Command1.Caption = ”添加记录“ 图书管理系统
Exit Sub End If With param.Direction = adParamInput.Type = adBSTR.Size = 8.Value = Text1.Text End With cmd.Parameters.Append param cmd.CommandText = sql cmd.CommandType = adCmdText Set cmd.ActiveConnection = con Set rst1 = cmd.Execute '检测读者编号是否存在防止主键冲突 If rst1.RecordCount > 0 Then frmMsg.Show frmMsg.notice.Visible = True frmMsg.Text1.Text = ”此读者编号已经存在!“ rst.Cancel Command2.Enabled = True Command3.Enabled = True Command4.Enabled = True Command1.Caption = ”添加记录“ Exit Sub End If 图书管理系统
rst.Update frmMsg.Show frmMsg.notice.Visible = True frmMsg.Text1.Text = ”添加成功!“ Command2.Enabled = True Command3.Enabled = True Command4.Enabled = True Command1.Caption = ”添加记录“ End If End Sub Private Sub Command2_Click()'删除纪录 Dim ans As String ans = Msgbox(”确定要删除此记录吗?“, vbYesNo, ”提示“)If ans = vbYes Then rst.Delete rst.Requery Else Exit Sub End If End Sub Private Sub Command3_Click()'上一记录 If rst.BOF Then frmMsg.Show frmMsg.info.Visible = True frmMsg.Text1.Text = ”已经到达记录顶端!“ 图书管理系统
Exit Sub Else rst.MovePrevious End If End Sub
Private Sub Command4_Click()'下一记录 If rst.EOF Then frmMsg.Show frmMsg.info.Visible = True frmMsg.Text1.Text = ”已经到达记录底端!“ Exit Sub Else rst.MoveNext End If End Sub Private Sub Command5_Click()Unload Me End Sub Private Sub Form_Load()Dim sql1 As String Set rst = New ADODB.Recordset sql1 = ”select * from reader“ '打开数据库并对窗体控件赋值 Call connect_db rst.Open sql1, con, adOpenDynamic, adLockOptimistic
图书管理系统
Set Text1.DataSource = rst Set Text2.DataSource = rst Set Text3.DataSource = rst Set Text4.DataSource = rst Set Text5.DataSource = rst Set Text6.DataSource = rst Set Text7.DataSource = rst Set Text8.DataSource = rst Text1.DataField = ”读者编号“ Text2.DataField = ”读者姓名“ Text3.DataField = ”性别“ Text4.DataField = ”电话号码“ Text5.DataField = ”家庭地址“ Text6.DataField = ”读者类别“ Text7.DataField = ”工作单位“ Text8.DataField = ”登记日期" End Sub Private Sub xptopbuttons1_Click()Unload Me End Sub Private Sub xptopbuttons2_Click()Me.WindowState = 1 End Sub Private Sub Frame1_DragDrop(Source As Control, X As Single, Y As Single)
图书管理系统
End Sub
第三篇:JAVA课程设计报告ATM存取款系统
目 录
1课程设计题目描述和基本设计要求...............................................................2 系统需求分析..................................................................................................2.1 功能需求分析 ······················································································
2.2 其他需求分析 ······················································································
3系统设计...........................................................................................................3.1 总体设计 ······························································································
3.2 ATM柜员机界面设计 ·········································································
3.3 各功能模块设计 ··················································································
3.3.1 登陆页面模块设计 ································································
3.3.2 选择服务模块设计 ································································
3.3.3 取款模块设计 ·······································································
3.3.4 退卡模块设计 ······································································· 3.4 异常处理情况说明 ·································································· 系统实现与测试..............................................................................................5总程序...............................................................................................................6 课程设计总结..................................................................................................6.1 遇到的问题及解决办法 ······································································
6.2 心得体会 ······························································································
ATM柜员机 课程设计题目描述和基本设计要求
ATM柜员机主要是由各个Windows窗口组成,它是由登录页面、选择服务、取款、查询余额、修改密码和退卡等功能。它的各种按钮的事件和功能可以简单的模拟ATM柜员机的要求。系统需求分析 2.1 功能需求分析
主要功能如下所述:
要求使用图形用户界面。当输入给定的卡号和密码(初始卡号为000000和密码为123456)时,系统能登录ATM柜员机系统,用户可以按照以下规则进行:
查询余额:初始余额为50000元
ATM取款:每次取款金额为100的倍数,总额不超过5000元,支取金额不允许透支。
ATM存款:不能出现负存款。
修改密码:只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。
2.2 其他需求分析
(1)性能描述
实时性好、灵活性强、易于不同年龄阶段的人操作。(2)设计约束
开发工具:JCrator ProV3.5.0 运行环境:Windows 2000以上 能实现用户所定义的各项需求。(3)界面要求
以Windows窗口形式显示,标题栏为ATM柜员机名称,右上角有最小化按钮、最大化按钮、关闭按钮,不同的窗口中有不同的按钮和选择菜单。系统设计 3.1 总体设计
我所设计的ATM柜员机主要是由登录页面模块还由选择服务模块组成,其中选择服务模块又由取款模块、查询余额模块、修改密码模块、退卡模块组成。其功能结构图如下所示:
图1
ATM功能结构示意图
3.2 ATM柜员机界面设计
一个系统界面的好坏直接影响到用户的操作,界面设计要求样式美观、简单明了、方便易操作。界面主要分为窗体、菜单、按钮和文本输入框几个部分,分别执行相应的操作。
(1)窗体的设计
窗体整个框架使用Frame类构造,Frame有自己的外边框和自己的标题,创建Frame时可以指定其窗口标题,我创建的窗口标题是各个不同功能的模块的名字,比如说查询余额,还有取款等。相应源代码为:WindowBox(String s,Account act){super(“ATM柜员机”);}、Selection(String s,Account act){ } super(s);向Frame窗口中添加组件使用add()。例如:button1 = new Button(“存款”);
p1.add(button1);this.add(p1);每个Frame在其右上角都有三个控制图标,分别代表将窗口最小化、窗口最大化和关闭的操作,其中最小化和最大化操作Frame可自动完成,而关闭窗口操作实现需要书写有关的代码,在我的程序中我采用的是对WINDOWS_CLOSING事件做出响应,调用dispose()方法关闭窗口。Frame也可以引发WindowsEvent类代表的窗口事件。相应源代码为:
addWindowListener(new WindowAdapter()//窗口侦听器,以从此窗口接收窗口事件 {public void windowClosing(WindowEvent e)//处理窗口关闭事件
{ System.exit(0);} });}(2)窗体的主要结构的设计
我所设计的窗口的主要结构的特点就是每个窗口都对应着一个特定的功能。比如说报各种各样的错,还有各种查询余额、取款、选择服务等,所以它们都是由各种按钮和文本框,标签组成的,而联系各个窗体成为一个整体的就是各个按钮的监听事件。所以整个设计就趋向简单化了。
为了定义各个按钮所对应的命令和操作,首先需要将各个按钮注册给实现了动作事件的监听接口ActionListener的监听者,然后为监听者定义actionPerformed(ActionEvent e)方法,在这个方法中调用e.getSource()或e.getActionCommand()来判断用户点击的菜单子项,并完成这个菜单子项定义的操作。
3.3 各功能模块设计 3.3.1 登陆页面模块设计
与ATM柜员机打交道比较多的,也是大家对安全比较关心的问题:密码。所以第一个界面就是要输入密码和卡号才能继续服务。
我定义了文本框累的对象tf1,tf2。抓药是用于输入单行的文本;文本区调用public String getText()方法,获取用户想要的字符串。用来判断输入的密码和卡号是否正确,如果不正确的话,则弹出密码或卡号错误的警告框,并用dispose()关掉窗口。
3.3.2 选择服务模块设计
在选择服务模块中,有各种ATM的服务功能,只要用户在该界面中选择按钮,它就会弹出各个相应的界面。每一个按钮都有监听器,在选择了按钮后,java.awt.event中的ActionEvent类创建一个事件对象,并将它传递给方法public void actionPerformed(ActionEvent e)中的参数e,监视器就会知道所发生的事件,对此事件进行处理。
3.3.3 取款模块设计
在取款模块中,和其他的界面也是同样的结构。也是有一个文本框和一个按钮还有标签组成的。用户在文本框中输入他想取的数额,但是必须是100的倍数,而且每一次最多只能取5000块。当然了取款的时候也不能超过卡里的余额,再就是卡里的余额不可以为负,否则就会弹出报错的窗口。3.3.4 退卡模块设计
在退卡模块设计中,这个方法就更加的简单了,它只是用了if(e.getSource()==button4){//退出
} System.exit(0);dispose();这个方法就可以实现了,这里就不再多说了。
3.4 异常处理情况说明
(1)打开、保存文件时的异常处理 需要处理的异常:IOException(2)数据库访问时的异常处理 需要处理的异常:SQLException(3)加载类时的异常处理
需要处理的异常:ClassNotFindException,当应用程序试图使用Class类中的forName方法通过字符串名加载类时,但是没有找到具有指定名称的类的定义。
(4)加载URL时的异常
需要处理的异常:MalformedURLException,抛出这一异常指示出现了错误的 URL。或者在规范字符串中找不到任何合法协议,或者无法分析字符串。系统实现与测试
(1)编译运行程序后,将会看到如下的界面,如图2所示。如果输入的密码或卡号不正确的话就会报右下图的错误。
图2 主界面—登陆页面
(2)选择服务界面效果
当输入的密码和卡号正确,单击确定后就会进入到选择服务的界面,如图3所示。然后就可以选择所需要的服务了。
图3 选择服务界面
(3)取款界面,如图4所示。
图4 取款界面
(4)查询余额界面,如图7所示。
图7 查询余额界面
图8 存款界面
图9 转账界面
经过测试,所有的功能基本上都实现了,而且运行正常。.总程序
package ZDC;//主菜单
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;import java.awt.event.*;class Panel1 extends JPanel{ JLabel label1,label2;
Panel1(){
setLayout(new GridLayout(4,1));
label1=new JLabel(“
”+“银行存取款系统”);label2=new JLabel(“
”+“欢迎你成为本行用户,你可以选择中文或英文方式”);
add(new JLabel());add(label1);add(label2);add(new JLabel());
} } class Panel2 extends JPanel{
JButton button1,button2;
Panel2(){
setLayout(new GridLayout(3,6));
button1=new JButton(“中文”);button2=new JButton(“英文”);
add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());
add(new JLabel());add(new JLabel());add(button1);add(new JLabel());add(new JLabel());
add(button2);add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());
add(new JLabel());add(new JLabel());add(new JLabel());
} } class Client extends JFrame implements ActionListener{
Panel1 panel1;Panel2 panel2;JFrame frame;
Client(String s){
super(s);
Container con=this.getContentPane();
con.setLayout(new GridLayout(2,1));
panel1=new Panel1();panel2=new Panel2();
con.add(panel1);con.add(panel2);
panel2.button1.addActionListener(this);
panel2.button2.addActionListener(this);
this.setVisible(true);this.pack();
}
public void actionPerformed(ActionEvent e){
if(e.getActionCommand()==“中文”){
this.setVisible(false);
new Client00(“输入密码”);
}
else if(e.getActionCommand()==“英文”){String inputValue = JOptionPane.showInputDialog(“Please input a value”);}
} } public class menu{
public static void main(String []args){
new Client(“用户取款系统”);
}} package ZDC;
// 输入密码界面
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;import java.awt.event.*;class Panel01 extends JPanel{
JLabel label1,label2,label3,label4;JPasswordField textA;JTextField textC;
static JTextField textB;char t[]=new char[4];
Panel01(){
setLayout(new GridLayout(4,4));
for(int i=0;i<4;i++){t[i]=(char)(Math.random()*26+'a');}
String mm=new String(t);
label2=new JLabel(“请输入卡号:”);label1=new JLabel(“请输入密码:”);
label3=new
JLabel();label4=new
JLabel(“
请
输
入
验
证”);label3.setBackground(Color.white);
码
:
label3.setForeground(Color.red);
textC=new JTextField(10);textC.setForeground(Color.blue);
label3.setText(mm);
textA=new JPasswordField(6);textA.setEchoChar('*');textB=new JTextField(“");
for(int i=0;i<5;i++){add(new JLabel());}
add(label2);add(textB);add(new JLabel());add(new JLabel());
add(label1);add(textA);add(new JLabel());add(new JLabel());
add(label4);add(textC);add(label3);
} } class Panel02 extends JPanel{ JButton button1,button2;
Panel02(){
setLayout(new GridLayout(3,6));
button1=new JButton(”确定“);button2=new JButton(”取消“);
for(int i=0;i<7;i++){add(new
JLabel());}add(button1);add(new JLabel());
add(button2);for(int i=0;i<6;i++){add(new JLabel());}
} } class Client00 extends JFrame implements ActionListener{
Panel01 panel1;Panel02 panel2;JFrame frame;int i=0,j=0;
Client00(String s){
super(s);
Container con=this.getContentPane();
con.setLayout(new GridLayout(2,1));
panel1=new Panel01();panel2=new Panel02();
con.add(panel1);con.add(panel2);
JLabel());add(new
panel2.button1.addActionListener(this);
panel2.button2.addActionListener(this);
this.setVisible(true);this.pack();
}
public void actionPerformed(ActionEvent e){
char[] passwords=panel1.textA.getPassword();String password=new String(”000000“);
//设置账号123456789的初始密码为112626,每输入一次都有提示,在连续输入三次不正确后系统自动退出。
”);}
if(e.getActionCommand().equals(“确定”))
if(panel1.textC.getText().equals(panel1.label3.getText())){
heshi();
}
else{JOptionPane.showMessageDialog(frame,“你输入的验证码有误,请重新输入。
else if(e.getActionCommand()==”取消“){this.setVisible(false);new Client08(”“);}
}
public void heshi(){
if(panel1.textA.getText().equals(”“)||panel1.textB.getText().equals(”“)){JOptionPane.showMessageDialog(frame,”
请输入账号、密码!“);return;} try{ Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//连接数据库 Statement sql=con.createStatement();
String ql=panel1.textB.getText();
ResultSet rs=sql.executeQuery(”select cnima from card where cno=“+ql+”“);
if(rs.next()){
String qerycmima=panel1.textA.getText();
String s=rs.getString(1);
if(qerycmima.equals(s)){
JOptionPane.showMessageDialog(frame,”
连接成功!“);
this.setVisible(false);new Client01(”用户取款系统“);
}else{ if(i!=2){i++;j=3-i;
JOptionPane.showMessageDialog(frame,”密码有误!你还有“+j+”次机会,请你再仔细想想.“);
panel1.textA.setText(”“);}
else {JOptionPane.showMessageDialog(frame,”对不起,你输入的密码次数达三次,下次再见。“);System.exit(0);}
}
con.close();frame.repaint();
}
else{JOptionPane.showMessageDialog(null,”
该用户不存在,重新输入!“,”警告!“, JOptionPane.YES_NO_OPTION);
panel1.textA.setText(”“);panel1.textB.setText(”“);panel1.textC.setText(”“);return;}
}catch(SQLException g){ System.out.println(”E Code“+g.getErrorCode());System.out.println(”E M“+g.getMessage());
} catch(Exception e){ e.printStackTrace();
}
} } class Inputpassword{
public static void main(String []args){
new Client00(”用户取款系统“);
}} package ZDC;//选择界面
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;import java.awt.event.*;class Panel03 extends JPanel{
”);
for(int i=0;i<7;i++){add(new
JLabel());}add(button1);add(new
JLabel());add(new
JButton button1,button2,button3,button4,button5;
Panel03(){
setLayout(new GridLayout(8,6));
button1=new JButton(“查询”);button2=new JButton(“取款”);
button3=new JButton(“转账”);button4=new JButton(“退出”);button5=new JButton(“存款JLabel());
add(button2);for(int
i=0;i<8;i++){add(new
JLabel());}add(button3);add(new JLabel());add(new JLabel());add(button5);
for(int i=0;i<17;i++){add(new JLabel());}add(button4);for(int i=0;i<7;i++){add(new JLabel());}
} } class Client01 extends JFrame implements ActionListener{
Panel03 panel1;JFrame frame;
Client01(String s){
super(s);
Container con=this.getContentPane();
panel1=new Panel03();con.add(panel1);
panel1.button1.addActionListener(this);panel1.button2.addActionListener(this);
panel1.button3.addActionListener(this);panel1.button4.addActionListener(this);panel1.button5.addActionListener(this);
this.setVisible(true);this.pack();
}
public void actionPerformed(ActionEvent e){
if(e.getActionCommand()==”取款“){
this.setVisible(false);
new Client02(”请选择取款金额“);
}
else if(e.getActionCommand()==”查询“){
this.setVisible(false);
new Client06(”查询服务“);
}
else if(e.getActionCommand()==”存款“){
this.setVisible(false);
new Client05(”请选择存款金额“);
}
else if(e.getActionCommand()==”转账“){
this.setVisible(false);
new Client04(”用户转账服务“);
}
else if(e.getActionCommand()==”退出“){ this.setVisible(false);new Client08(”“);}
} } class Selectfunction{
public static void main(String []args){
new Client01(”用户取款系统“);
new Client01(”用户存款系统“);
} } package ZDC;//查询功能
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;
import ZDC.Panel01;
import java.awt.event.*;class Panel06 extends JPanel{
JLabel label1,label2;JTextField textA;JFrame frame;
Panel06(){
setLayout(new GridLayout(4,4));label1=new JLabel(”你的余额为:“);
textA=new JTextField(6);
for(int i=0;i<5;i++){add(new JLabel());}
add(label1);add(textA);for(int i=0;i<9;i++){add(new JLabel());}
} } class Panel07 extends JPanel{
JButton button1,button2;
Panel07(){
setLayout(new GridLayout(3,6));
button1=new JButton(”继续“);button2=new JButton(”查询“);
for(int i=0;i<7;i++){add(new
JLabel());}add(button2);add(new JLabel());
add(button1);for(int i=0;i<7;i++){add(new JLabel());}
} } class Client03 extends JFrame implements ActionListener{
Panel06 panel1;Panel07 panel2;
Client03(String s){
super(s);
Container con=this.getContentPane();
con.setLayout(new GridLayout(2,1));
panel1=new Panel06();panel2=new Panel07();
con.add(panel1);con.add(panel2);
panel2.button1.addActionListener(this);
panel2.button2.addActionListener(this);
this.setVisible(true);this.pack();
}
JLabel());add(new
public void actionPerformed(ActionEvent e){
if(e.getActionCommand().equals(”继续“)){
this.setVisible(false);
new Client01(”选择服务种类“);
}
else if(e.getActionCommand()==”查询“)showcjine();
}
public void showcjine(){
//String
url
=
”jdbc:odbc:driver={Microsoft
Access
Driver(*.mdb)};DBQ=bankSystem.mdb“;//程序直接使用当前类目录下的数据库文件
try{
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);
Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//连接数据库 Statement sql=con.createStatement();String ql=Panel01.textB.getText();Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);ResultSet rs=sql.executeQuery(”select cjine from card where cno=“+ql+”“);
if(rs.next()){
String ucjine=rs.getString(1);
panel1.textA.setText(ucjine);
}
else{JOptionPane.showMessageDialog(null,”
该用户不存在“,”警告!“, JOptionPane.YES_NO_OPTION);}
con.close();
}catch(Exception ex){ ex.printStackTrace();
}
}
} class Searchfunction{
public static void main(String []args){
new Client03(”用户查询服务“);
}} package ZDC;
//查询信息
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;import java.awt.event.*;class Panel11 extends JPanel{
JButton button1,button2;
Panel11(){
setLayout(new GridLayout(10,5));
button1=new JButton(”查询余额“);
button2=new JButton(”查本卡信息“);
for(int i=0;i<=16;i++)add(new JLabel());
add(button1);
for(int i=0;i<=13;i++)add(new JLabel());
add(button2);
for(int i=0;i<=16;i++)add(new JLabel());} }
class Client06 extends JFrame implements ActionListener{
Panel11 panel11;JFrame frame;
Client06(String s){
super(s);
Container con=this.getContentPane();
panel11=new Panel11();
con.add(panel11);
panel11.button1.addActionListener(this);
panel11.button2.addActionListener(this);
this.setVisible(true);this.pack();}
public void actionPerformed(ActionEvent e){
if(e.getActionCommand()==”查询余额“){
this.setVisible(false);
new Client03(”用户查询服务“);
}
else if(e.getActionCommand()==”查本卡信息“){ this.setVisible(false);
new Client07(”本卡信息“);
} } } class Searchinformation{
public static void main(String []args){
new Client06(”查询服务“);
} } package ZDC;//转账功能
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;
import ZDC.Panel01;
import java.awt.event.*;class Panel08 extends JPanel{
JLabel label1,label2;JTextField textA,textB;
Panel08(){
setLayout(new GridLayout(4,4));
label1=new JLabel(”输入预转账号:“);label2=new JLabel(”输入预转金额:“);
textA=new JTextField(6);textB=new JTextField(6);
for(int i=0;i<5;i++){add(new JLabel());}
add(label1);add(textA);for(int i=0;i<6;i++){add(new JLabel());}
add(label2);add(textB);add(new JLabel());
} } class Panel09 extends JPanel{
JButton button1,button2;
Panel09(){
setLayout(new GridLayout(3,6));
button1=new JButton(”确定“);button2=new JButton(”取消“);
add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());
add(new JLabel());add(new JLabel());add(button1);add(new JLabel());add(new JLabel());
add(button2);add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());
add(new JLabel());add(new JLabel());add(new JLabel());
} } class Client04 extends JFrame implements ActionListener{
Panel08 panel1;Panel09 panel2;JFrame frame;
Client04(String s){
super(s);
Container con=this.getContentPane();
con.setLayout(new GridLayout(2,1));
panel1=new Panel08();panel2=new Panel09();
con.add(panel1);con.add(panel2);
panel2.button1.addActionListener(this);
panel2.button2.addActionListener(this);
this.setVisible(true);this.pack();
}
public void actionPerformed(ActionEvent e){
if(e.getActionCommand().equals(”确定“)){ zhuanzhang();//程序根据输入账号调用数据库,修改对应金额数。
this.setVisible(false);
new Client01(”用户取款系统“);
}
else if(e.getActionCommand()==”取消“){
this.setVisible(false);
new Client01(”用户取款系统“);}
}
public void zhuanzhang(){
if(panel1.textA.getText().equals(”“)||panel1.textB.getText().equals(”“)){JOptionPane.showMessageDialog(frame,”
请输入欲转账号、金额!“);return;} //String url = ”jdbc:odbc:driver={Microsoft Access Driver(*.mdb)};DBQ=bankSystem.mdb“;//程序直接使用当前类目录下的数据库文件
try{
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);
Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//连接数据库 Statement sql=con.createStatement();String cno=panel1.textA.getText();String ql=Panel01.textB.getText();
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);
ResultSet ss=sql.executeQuery(”select cno from card where cno=“+cno+”“);String yjine=panel1.textB.getText();
int shjin=Integer.parseInt(yjine);
if(ss.next()){
ResultSet rs=sql.executeQuery(”select cjine from card where cno=“+ql+”“);if(rs.next()){ String queryjine=rs.getString(1);
int qyjine=Integer.parseInt(queryjine);
if(shjin String newjine=String.valueOf(newcjine);String newjine2=String.valueOf(newcjine2); sql.executeUpdate(”update card set cjine='“+newjine+”'where cno=“+ql+”“); sql.executeUpdate(”update card set cjine='“+newjine2+”'where cno=“+cno+”“);JOptionPane.showMessageDialog(frame,” 操作已成功,谢谢使用!“);this.setVisible(false);new Client01(”用户取款系统“); } else{JOptionPane.showMessageDialog(null,” 请重新输入金额!“,”警告!“, JOptionPane.YES_NO_OPTION); panel1.textB.setText(”“);return; } con.close();frame.repaint(); } con.close();frame.repaint(); } else{JOptionPane.showMessageDialog(null,” 警告!“, JOptionPane.YES_NO_OPTION);panel1.textA.setText(”“);} }catch(Exception ex){ ex.printStackTrace(); } } } class Transferfunction{ public static void main(String []args){ new Client04(”用户转账服务“);}} package ZDC;//用户取款 import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement; 该用户不存在,请重新输入。”,“ import javax.swing.*; import ZDC.Panel01; import java.awt.event.*;class Panel04 extends JPanel{ JButton button1,button2,button3,button4; Panel04(){ setLayout(new GridLayout(4,6)); button1=new JButton(”100“);button2=new JButton(”200“); button3=new JButton(”300“);button4=new JButton(”500“); for(int i=0;i<7;i++){add(new JLabel());}add(button1);add(new JLabel());add(new JLabel()); add(button2);for(int i=0;i<8;i++){add(new JLabel());}add(button3);add(new JLabel()); add(new JLabel());add(button4);add(new JLabel()); } } class Panel05 extends JPanel{ JButton button1,button2,button3,button4; Panel05(){ setLayout(new GridLayout(4,6)); button1=new JButton(”800“);button2=new JButton(”1000“); for(int i=0;i<7;i++){add(new JLabel());}add(button1);add(new JLabel());add(new JLabel()); add(button2);for(int i=0;i<13;i++){add(new JLabel());} } } class Client02 extends JFrame implements ActionListener{ Panel04 panel1;Panel05 panel2;JFrame frame; Client02(String s){ super(s); Container con=this.getContentPane(); con.setLayout(new GridLayout(2,1)); panel1=new Panel04();panel2=new Panel05(); con.add(panel1);con.add(panel2); panel1.button1.addActionListener(this);panel1.button2.addActionListener(this); panel1.button3.addActionListener(this);panel1.button4.addActionListener(this); panel2.button1.addActionListener(this);panel2.button2.addActionListener(this); this.setVisible(true);this.pack(); } public void actionPerformed(ActionEvent e){ if(e.getActionCommand()==”100“){ this.setVisible(false); qukuan();//程序根据输入金额和输入卡号,修改数据库。 new Client01(”用户取款系统“); } else if(e.getActionCommand()==”200“){ else if(e.getActionCommand()==”300“){ this.setVisible(false); qukuan(); new Client01(”用户取款系统“);} this.setVisible(false); qukuan(); new Client01(”用户取款系统“);} else if(e.getActionCommand()==”500“){ this.setVisible(false); qukuan(); new Client01(”用户取款系统“);} else if(e.getActionCommand()==”800“){ this.setVisible(false); qukuan(); new Client01(”用户取款系统“);} else if(e.getActionCommand()==”1000“){ } public void qukuan(){ try{ Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//连接数据库 Statement sql=con.createStatement();String ql=Panel01.textB.getText(); this.setVisible(false); qukuan(); new Client01(”用户取款系统“);} ResultSet rs=sql.executeQuery(”select cjine from card where cno=“+ql+”“);if(rs.next()){ String mm=rs.getString(1);int nn= Integer.parseInt(mm); String qerycjine=panel1.button1.getActionCommand(); int queryjine=Integer.parseInt(qerycjine);if(queryjine if(updateMima==1){ JOptionPane.showMessageDialog(frame,” 操作已成功,谢谢使用!“);} this.setVisible(false); new Client01(”用户取款系统“); } else{JOptionPane.showMessageDialog(null,” 你的卡余额已不足,请注意!“,”警告!“, JOptionPane.YES_NO_OPTION); } con.close(); frame.repaint(); } }catch(SQLException g){ System.out.println(”E Code“+g.getErrorCode());System.out.println(”E M“+g.getMessage()); } catch(Exception e){ e.printStackTrace(); } } } class Withdraw{ public static void main(String []args){ new Client02(”请选择取款金额“); } } this.setVisible(false);new Client01(”用户取款系统“);package ZDC; //存款功能 import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*; import ZDC.Panel01; import java.awt.event.*;class Panel10 extends JPanel{ JButton button1,button2,button3,button4; Panel10(){ setLayout(new GridLayout(4,6)); button1=new JButton(”100“);button2=new JButton(”200“); button3=new JButton(”300“);button4=new JButton(”500“); for(int i=0;i<7;i++){add(new JLabel());}add(button1);add(new JLabel());add(new JLabel()); add(button2);for(int i=0;i<8;i++){add(new JLabel());}add(button3);add(new JLabel()); add(new JLabel());add(button4);add(new JLabel()); } } class Panel14 extends JPanel{ JButton button1,button2,button3,button4; Panel14(){ setLayout(new GridLayout(4,6)); button1=new JButton(”800“);button2=new JButton(”1000“); for(int i=0;i<7;i++){add(new JLabel());}add(button1);add(new JLabel());add(new JLabel()); add(button2);for(int i=0;i<13;i++){add(new JLabel());} } } class Client05 extends JFrame implements ActionListener{ Panel04 panel1;Panel05 panel2;JFrame frame; Client05(String s){ super(s); Container con=this.getContentPane(); con.setLayout(new GridLayout(2,1)); panel1=new Panel04();panel2=new Panel05(); con.add(panel1);con.add(panel2); panel1.button1.addActionListener(this);panel1.button2.addActionListener(this); panel1.button3.addActionListener(this);panel1.button4.addActionListener(this); panel2.button1.addActionListener(this);panel2.button2.addActionListener(this); this.setVisible(true);this.pack(); } public void actionPerformed(ActionEvent e){ if(e.getActionCommand()==”100“){ this.setVisible(false); cunkuan();//程序根据输入金额和输入卡号,修改数据库。 new Client01(”用户存款系统“); } else if(e.getActionCommand()==”200“){this.setVisible(false);new Client01(”用户存款系统“);} //这里当点击取款金额200时,程序返回上层操作界面。 } public void cunkuan(){ try{ Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//连接数据库 Statement sql=con.createStatement();String ql=Panel01.textB.getText();ResultSet rs=sql.executeQuery(”select cjine from card where cno=“+ql+”“); if(rs.next()){ String mm=rs.getString(1);int nn= Integer.parseInt(mm); String qerycjine=panel1.button1.getActionCommand(); int queryjine=Integer.parseInt(qerycjine);int newjine=nn+queryjine;String newjin=String.valueOf(newjine);int updateMima=sql.executeUpdate(”update card set cjine='“+newjin+”'where cno=“+ql+”“); if(updateMima==1){ JOptionPane.showMessageDialog(frame,” 操作已成功,谢谢使用!“);} this.setVisible(false); new Client01(”用户存款系统“); } else{JOptionPane.showMessageDialog(null,” 请注意!“,”警告!“, JOptionPane.YES_NO_OPTION); this.setVisible(false);new Client01(”用户取款系统“);} con.close(); frame.repaint(); }catch(SQLException g){ System.out.println(”E Code“+g.getErrorCode());System.out.println(”E M“+g.getMessage()); } catch(Exception e){ e.printStackTrace(); } } } class Depositfunction{ public static void main(String []args){ new Client05(”请选择存款金额“); } } package ZDC;//显示用户信息 import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*; import ZDC.Panel01; import java.awt.event.*; class Panel12 extends JPanel{ JLabel label1,label2,label3,label4; JButton button1,button2;JTextField text1,text2,text3,text4; Panel12(){ setLayout(new GridLayout(9,6)); label1=new JLabel(”显示用户名:“);label2=new JLabel(”显示性别:“); label3=new JLabel(”显示身份证:“);label4=new JLabel(”显示卡号:“); button1=new JButton(”查询“);text1=new JTextField(”“);text2=new JTextField(”“); button2=new JButton(”取消“);text3=new JTextField(”“);text4=new JTextField(”“); for(int i=0;i<8;i++)add(new JLabel());add(label1);add(text1); for(int i=0;i<4;i++)add(new JLabel());add(label2);add(text2); for(int i=0;i<4;i++)add(new JLabel());add(label3);add(text3); for(int i=0;i<4;i++)add(new JLabel());add(label4);add(text4); for(int i=0;i<15;i++)add(new JLabel());add(button1); add(new JLabel());add(new JLabel());add(button2); for(int i=0;i<7;i++)add(new JLabel());} } class Client07 extends JFrame implements ActionListener{ Panel12 panel12;JFrame frame; Client07(String s){ super(s); Container con=this.getContentPane(); panel12=new Panel12(); con.add(panel12); panel12.button1.addActionListener(this); panel12.button2.addActionListener(this); this.setVisible(true);this.pack();} public void actionPerformed(ActionEvent e){ if(e.getActionCommand()==”查询“)showCard(); else if(e.getActionCommand()==”取消“){ this.setVisible(false); new Client01(”用户取款系统“); } } public void showCard(){ String url = ”jdbc:odbc:driver={Microsoft Access Driver(*.mdb)};DBQ=bankSystem.mdb“;//程序直接使用当前类目录下的数据库文件 try{ Connection con=DriverManager.getConnection(url);Statement sql=con.createStatement();String ql=Panel01.textB.getText();Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);ResultSet rs=sql.executeQuery(”select * from user where ucno=“+ql+”“); if(rs.next()){ String uname=rs.getString(1); String usex=rs.getString(2); String uid=rs.getString(3); String ucno=rs.getString(4); panel12.text1.setText(uname); panel12.text2.setText(usex); panel12.text3.setText(uid); panel12.text4.setText(ucno);} else{JOptionPane.showMessageDialog(null,” 该用户不存在“,”警告!“, JOptionPane.YES_NO_OPTION);} con.close(); } catch(Exception ex){ ex.printStackTrace(); } } } class Dislayuserinformation{ public static void main(String []args){ new Client07(”本卡信息“); } } package ZDC;//退出功能 class Client08{ static Athread threadA; Client08(String s){ threadA=new Athread(); threadA.start(); } } class Athread extends Thread{ static int j=1;public void run(){ for(;j<2;){ new Client08(”提示退出对话框“);try{sleep(30000);j++;} catch(InterruptedException e){} } System.exit(0);} } public class Exit{ public static void main(String []args){ new Client08(”“); } } package ZDC;//退卡 import java.awt.*;import java.sql.Connection; import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*; import java.awt.event.*;class Panel13 extends JPanel{ JLabel label; Panel13(){ label=new JLabel(” 此卡! “); setLayout(new GridLayout(10,1));add(new JLabel()); add(label);for(int i=0;i<6;i++)add(new JLabel());} } class Client09 extends JFrame{ Panel13 panel13; Client09(String s){ super(s); Container con=this.getContentPane(); panel13=new Panel13(); con.add(panel13); this.setVisible(true);this.pack();} } class bankSystem09{ 谢谢使用,请在30秒内退出 JLabel());add(new JLabel());add(new public void main(String []args){ new Client08(”提示退出对话框"); } } 6课程设计总结 6.1 遇到的问题及解决办法 在此次课程设计中,我遇到了一些问题,如:对于面向对象的方法了解不够透彻,运用到实际的软件开发中存在着困难;对于Java语言,只学习到了一些最基本的知识,这导致编写程序时经常出现一些语法错误,而且要在短时间内用Java语言来设计一个具体的系统是一个较大的挑战。对于以上的问题,自己有清楚的认识,解决办法是需要大量阅读相关的书籍,对于书上以及网站上下载的资料中的Java实例必须有清楚的理解。对于实际动手能力与系统开发的流程的适应,必须多进行实际的练习与操作,才能有大的进步。 6.2 心得体会 在这次的课程设计中,我主要运用了Java语言的界面设计、异常处理、、Awt控件、Swing控件,输入输出流等,综合运用了Java语言。我深刻感受到了面向对象语言中类库的强大功能,掌握了运用Java中的类实现某些基本功能,并学会了自己查询使用类的方法,为以后的面向对象语言的自学奠定了基础。在以后的学习当中,我会更加努力的学习好专业知识,并将所学的知识用于实践当中去,以便牢固掌握知识。 UML建模报告 (2010 / 2011 学年 第 2学期) 题 目: 基于UML的ATM自动 柜员机系统 专 业: 成员: 指 导 教 师: 基于UML的ATM自动柜员机系统建模报告 一、需求分析 (1)功能需求: 1.登陆:客户通过输入正确的登陆密码即可登陆ATM。 2.取款:允许客户取出自己账户中的现金。3.客户存款:允许客户把现金存入自己账户。4客户查询余额:允许客户查询自己的账户余额。 5客户转账:允许客户将自己账户中的金额转移至另一账户。6客户更改密码:允许客户修改自己的登录密码。 (2)系统操作要求: 1.要求用户每次取款数额为50的整数倍; 2.要求用户一次取款数额不得大于1000元; 3.要求用户一天取款数额不得超过5000元; 4.要求用户每次取款数额不得大于账户余额; 5.要求用户设置的登录密码为6位。 (3)系统性能要求: 1.要求反应时间不得大于10秒钟; 2. 系统设计目标: ATM自动取款机可以提供24小时不间断服务,操作简单,可以很方便为用户提供取款、转账/汇款、查询账户余额等服务。 (4)实现手段: 使用ASP.NET进行界面设计,建立一个数据库保存客户的账户信息,使用C#语言功能函数并对数据库中的账户信息进行操作。 二、总体设计 本系统总共分为登陆、查询、存款、取款、转账、修改密码等6个功能模块。 1.登录模块:登陆模块使用字符匹配算法,要求用户在输入账号之后输入登陆密码,只有输入正确的密码才能登陆自己的账户。否则提示密码错误。 2.查询模块:用户输入正确的密码后就可登陆自己的账户并接受服务。查询功能允许用户查得自己账户上的余额信息。 3.存款模块:允许客户向自己的账户中存入现金。 4.取款模块:允许客户从账户中取走现金,要求取出的金额不能大于所剩余款,否则提示余额不足。 5.转账模块:允许客户将自己账户中的金额转移至另一账户。要求所转的金额不能多于所剩余款,否则提示余额不足。 6.修改密码模块:允许用户修改自己的登陆密码,密码仍然是6位数的,修改之后,下次登陆就应该用新密码。 三、详细设计 用例图: 类图: 客户取钱的协作图: 其他功能的协作图与此类似。 账目类的状态图: ATM系统的部署图: 四、测试报告 我们在客户数据库中建立四个账户,如下: 其中四个属性分别是客户名、账号、密码、账户余额。打开网页,进入初始页面: 若选择取回磁卡,显示如下: 1.登录功能测试 我们选择继续以进行测试,单击测试进入如下页面: 若输入不存在的账号,则出现提示: 现在我们输入正确的账号,这里以08060112为例: 单击确认,系统将提示客户输入密码,正确的密码是“123456”,我们输入“333333”以进行测试,系统提示密码错误: 我们输入正确的密码“123456”,单击确认,则进入交易界面: 2.查询功能测试 单击查询,显示如下 与数据库表中的number值比较可得,结果正确。3.取款功能测试 选择返回,回到主菜单,单击取款,系统提示客户输入取款金额: 我们输入300单击确认,显示如下 单击确定回到主菜单,单击查询,显示如下: 余额为700,说明取款成功,取款功能顺利实现。4.转账功能测试 单击返回,回到主菜单,单击转账,系统提示用户输入转入账号,我们以转入08060119为例: 单击确认,系统提示转账金额,我们输入300: 单击确认,提示转账成功: 单击确定回到主菜单,这时我们单击查询08060112的余额: 结果正确,我们再通过数据库查询08060119的余额,打开表格,右击,执行,显示如下: 结果也正确,说明转账功能也已顺利实现。5.存款功能测试 单击返回回到主菜单,单击“存款”,我们通过输入数值来模拟放入现金: 单击确认,系统提示操作成功: 单击“确定”回到主菜单,单击查询,显示如下: 结果正确。 6.修改密码功能测试 单击返回回到主菜单,单击“修改密码”,系统提示如下: 我们将密码修改为“555555”,输入“555555”后,提示操作成功: 单击确定就回到主菜单。这时我们取回磁卡重新登录以测试密码是否已经修改。依旧输入卡号08060112,单击确认,输入旧密码“123456”,提示密码错误: 单击确定,重新输入新密码“555555”,单击确认,则可顺利登录到主菜单 可见,密码已经修改成功,另一方面,我们查看数据库中的数据,右击,执行,显示如下: 可以看到账户08060112的password属性已经变为“555555”,因此,修改密码功能也能顺利实现。至此,ATM系统的六大功能都已通过测试并正确无误。 五、总结 通过这次UML建模的学习,我们学会了很多知识。之前我对UML建模一无所知,但现在我已学会了一些UML建模的基本知识,并学会了建立一些简单的模型。 虽然只有短短的几个礼拜,但收获却是很大的。首先是分析问题的能力,刚拿到这个题,总觉得无从下手,不知道题目到底要我们做什么,心里只是干着急,不知道该干嘛。经过一周的迷茫,我们开始静下心来,分析题目,找参考书,尝试性地进行编程。到第三周,我们终于做出了一个成果并且编译没有错误。之后就是尝试运行,运行的过程中出现很多问题。比如转账,修改密码等,但经过我们细心的测试、排查,还是找到了错误的原因并进行了纠正。因此,我们的查错改错的能力也得到了提高。最重要的是,我们通过这次实习学会了互相合作,俗话说“三个臭皮匠顶个诸葛亮”,也许我们单独做很难完成这个程序。但是只要我们团结一致就没有克服不了的困难。这次实习在我们的大学生活乃至整个人生中都有着非常重要的意义,是一笔不小的财富,难忘的经历。我们会以此为基础走好人生的每一步。 以上是我们对UML建模的学习的一点总结,同时也是为自己的未来整理好思路,为以后的学习做好准备。UML建模,教会了我很多,而我要做的,就是在以后的学习与生活中更加努力的学习来迎接它带来的知识与挑战。 摘要 库存管理系统是典型的信息管理系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强.数据安全性好的库。而对于后者则要求应用程序功能完备,易操作易使用等特点。 经过分析如此情况,我决定使用微软公司的Visual Basic 6为开发工具,利用其提供的各种面向对象的开发工具,尤其是ADO,是能方便而简洁操纵数据库的智能化对象,短期内就可以开发出用户满意的可行系统。 主题词:仓库管理;数据库;VB6;ADO 第 i 页 目录 摘要.................................................................................................................i ABSTRACT..........................................................................错误!未定义书签。第一章 绪论......................................................................................................1 1.1 选题背景...........................................................................................................1 1.2 设计目标...........................................................................................................1 第二章 相关理论基础.......................................................................................2 2.1 Visual Basic 6.....................................................................................................2 2.1.1 Visual Basic 6的功能特点.....................................................................2 2.1.2 Visual Basic 6中的基本概念.................................................................3 2.2 Access2000数据库............................................................................................4 2.2.1 Access的总体结构.................................................................................4 2.2.2 VB6和Access的连接...........................................................................5 第三章 需求分析...............................................................................................6 3.1 需求分析...........................................................................................................6 3.1.1 系统数据流程图....................................................................................7 3.1.2 功能需求及设计思想............................................................................7 第四章 系统设计.............................................................................................11 4.1 系统功能设计.................................................................................................11 4.1.1 系统功能模块图..................................................................................11 4.1.2 系统各模块说明..................................................................................11 4.2 数据库设计.....................................................................................................12 4.2.1 创建数据库..........................................................................................12 4.2.2 数据表结构..........................................................................................12 4.2.3 数据库中各表的关系..........................................................................16 第五章 仓库管理原型系统实现.......................................................................16 5.1 数据库实现.....................................................................................................16 5.1.1 连接数据库..........................................................................................17 5.1.2 建立数据表..........................................................................................18 5.2仓库管理系统主要界面及使用说明..............................................................18 5.2.1 系统登录界面......................................................................................19 5.2.2 系统主界面..........................................................................................19 5.2.3 系统管理模块......................................................................................20 第 ii 页 5.2.4 仓库管理模块......................................................................................22 5.2.5 物料管理模块......................................................................................25 5.2.6 报表查询模块......................................................................................29 5.4 系统测试.........................................................................................................31 5.4.1 菜单测试..............................................................................................32 5.4.2各功能模块测试...................................................................................32 5.4.3 数据跟踪测试......................................................................................32 第六章 小结与展望.........................................................................................33 6.1 成绩及不足.....................................................................................................33 6.1.1 成绩......................................................................................................33 6.1.2 不足......................................................................................................33 6.2 展望.................................................................................................................34 致 谢..............................................................................................................36 参考文献...........................................................................................................37 第 iii 页 第一章 绪论 1.1 选题背景 随着计算机技术的发展,计算机管理已越来越多地运用到了各个领域。在现代企业的各个环节已离不开计算机了。各种各样的管理软件也应运而生。 企业的库存物资管理往往是很复杂、很繁琐的。由于所掌握的物料种类众多,订货、管理、发放的渠道各有差异,各个企业之间的管理体制不尽相同,各类统计报表繁多,因此仓库管理必须编制一套仓库管理信息系统,实现计算机化操作,而且必须根据企业的具体情况制定相应的方案。 一般仓库管理系统,总是根据所掌握的物资类别,相应分成几个部门来进行物料的计划,订货,核销托收,验收入库,根据企业各个部门的需求来发送物资设备,并随时按期进行库存盘点,作台帐,根据企业管理的需要按月、季度、进行统计分析,产生相应报表。根据我公司的实际情况分析,一般的仓库管理系统并不能满足公司的需求,而且每套系统的成本也过高。因此有必要开发一套特定的仓库管理系统来提高公司的工作效率,减少因人为因素而导致的物料损失。通过对这些情况的仔细调查,我开发了下面的仓库管理系统。 1.2 设计目标 仓库管理系统可主要实现下列目标: 操作简单方便、界面简洁美观。 能完成仓库的各种日常操作。 能很好的预防各自人为因素产生的错误操作 能够为用户提供多种条件的查询操作,为物料管理提供准确及时的数据 可实现盘点报表及盘点后的物料调整 具有很好的安全性,以保证数据的正确性 可追溯数据的历史信息,为系统完善提供依据 第 1 页 第二章 相关理论基础 本系统主要采用VB6 + Access2000相结合的技术来进行开发,用户界面的设计是用VB6来进行的,后台数据库使用Access2000。与数据库的连接则使用ADO的相关功能来完成的。 在系统需涉及的一些相关技术概述如下。 2.1 Visual Basic 6 Visual意为“可视化的”,指的是一种开发图形用户界面的方法,所以Visual Basic是基于Basic的可视化的程序设计语言。在Visual Basic中,一方面继承了Basic所具有的程序设计语言简单易用的特点,另一方面在其编程系统中采用了面向对象、事件驱动的编程机制,用一种巧妙的方法把Windows的编程复杂性封装起来,提供了一种所见即所得的可视化程序设计方法。VB6是指Visual Basic 6.0的版本。 2.1.1 Visual Basic 6的功能特点 A)具有面向对象的可视化设计工具:在VB中,应用面向对象的程序设计方法(OOP),把程序和数据封装起来视为一个对象,每个对象都是可视的。程序员在设计时只需用现有工具根据界面设计要求,直接在屏幕上“画”出窗口、菜单、按钮、滚动条等不同类型的对象,并为每个对象设置属性。程序员的编程工作仅限于编写相关对象要完成的功能程序,因而程序设计的效率可大大提高。 B)事件驱动的编程机制:事件驱动是非常适合图形用户界面的编程方式。在图形用户界面的应用程序中,是由用户的动作即事件掌握着程序运行的流向,每个事件都能驱动一段程序的运行。程序员只要编写响应用户动作的代码,而各个动作之间不一定有联系。 C)提供了易学易用的应用程序集成开发环境:在VB集成开发环境中,用户可设计界面、编写代码、调试程序,直至把应用程序编译成可执行文件在Windows中运行,使用户在友好的开发环境中工作。 D)结构化的程序设计语言:VB6具有丰富的数据类型和结构化程序结构,作为一种程序设计语言,它还有如下一些特点:强大的数值和字符串处理功能;丰富的图形指令,可方便地绘制各种图形;提供静态和动态数组,有利于简化内存的管理;过程可递归调用,使程序更为简练;支持随机文件和顺序文件的访问;提供了一个可供应用程序调用的包含多种类型的图标库;具有完善的运行出错处 第 2 页 理。 E)支持多种数据库系统的访问:利用数据控件可访问的数据库系统有:Microsoft Access、SQL server、DBASE、Microsoft FoxPro和Oracle等,也可以访问Microsoft Excel、Lotus1-2-3等多种电子表格。 F)支持动态数据交换(DDE)、动态链接库(DLL)和对象的链接与嵌入(OLE)技术。 G)完备的HELP联机帮助功能:与Windows环境下的软件一样,在VB中,利用帮助菜单和F1功能键,用户可以随时方便地得到所需要的帮助信息。VB帮助窗口中显示了有关的示例代码,通过复制、粘贴操作可获取大量的示例代码,为用户的学习和使用提供了极大的方便。 VB程序设计的概念就是面向对象的概念,对象就是数据(DATA)和代码(CODE)互相结合的综合体。Windows上面的每一个图标,包括窗口本身都是对象,如果没有任何事情发生,对象处于停顿状态。当存在外来事件时,程序段执行,它的执行是由外来事件决定的。因此是“事件”驱动的。 编写VB程序较为简单,首先将各个对象放在空白窗体上,然后将程序代码分别添加给对象或图标,将它们组合起来就可以随意运行了。 在VB中,窗体实际上是一个对象,VB的窗体含有许多内嵌特性,这使得用户界面部分的建立像是从一个目录中挑选一个个合适的控件,而不是从零开始一步一步地建立控件。这种开发者能亲眼看到的程序设计过程就是“可视化程序设计”(Visual Programming)。 2.1.2 Visual Basic 6中的基本概念 对象:面向对象编程(OOP)的提法大家一定也很耳熟,虽然Visual Basic并不是完全的面向对象编程,但也利用了对象编程技术。对象简单地说就是大家经常看到的各种窗口、按钮、文本框甚至打印机等。 属性:如同电视有黑白、彩色之分一样,作为对象的Windows中的窗口也是有大有小,文本框的位置不可能完全一样,菜单要显示出不同的功能,这些都是由对象的属性决定的。不同对象的属性可能不同。属性一般决定了对象的位置、大小、显示等情况。 方法:就是对象能够做的事,如打印机对象就有打印(Print)方法、窗口对象支持隐藏(Hide)方法、很多对象支持移动(Move)方法等。 事件:就是对象对用户各种操作的反映情况。如用户用鼠标按一下按钮,就会触发按钮的“按”(Click)事件。 第 3 页 控件:控件就是Visual Basic提供的编程用的模块,与对象有直接的联系,如同积木的木块,使用这样的控件,就可以像拼图或堆积木一样“搭”、“拼”你的程序界面。Visual Basic中使用控件,简化了Windows中的窗口、按钮等对象的编程设计。每个控件都有各自的属性、事件及方法。只需修改这些特征你就可以随心所欲地编程了。最重要的是,你可以利用成千上万的各种扩充的控件来快速构造几乎能满足你任何要求的程序。例如,如果你不满意Windows简陋的媒体播放器,你就可以使用VB的多媒体控件在1小时以内设计一个完全自己风格的能够播放CD、VCD的多媒体播放器,而功能完全与之相当。 2.2 Access2000数据库 作为Microsoft的office套件产品之一,Access已经成为世界上最流行的桌面数据库系统。Access与许多优秀的关系数据库一样,可以让你很容易地连接相关的信息而且还对其他的数据库系统有所补充。它能操作其它来源的资料,包括许多流行的PC数据库程序(如dBase,Paradox,Microsoft FoxPro)和服务器、小型机及大型机上的许多SQL数据库。Access还完全支持Microsoft的OLE技术。 Access还提供windows操作系统的高级应用程序开发系统。Access与其它数据库开发系统之间相当显著的区别就是:您不用写一行代码,就可以在很短的时间里开发出一个功能强大而且相当专业的数据库应用程序,并且这一愉快的过程是完全可视的!如果您能给它加上简短的VBA代码,那么您的程序决不比专业程序员潜心开发的程序差。 2.2.1 Access的总体结构 Access将所有有名字的东西都成为对象(object),在Access 2000中,最重要的对象有表,查询,窗体,报表,宏和模块。 表:用户定义的存储资料的对象。每一个表都包含有关某个主体的信息。表包括存储不同种类资料的字段(列),而记录(行)则收集特定主体实例的所有信息。 查询:为来自一个或多个表的资料提供定制视图的对象。在Access中,可以利用图形化的实例查询机制(QBE)或通过SQL语句来建立查询。你可以在查询中选择、更新、插入或删除资料,也可以用查询来建立新表。 窗体:窗体是主要的人机接口。大量的操作(几乎所有)都要通过窗体完成。窗体通过运行宏(macro)或Visual Basic for Applications(VBA)过程,来响应大 第 4 页 量的事件。Access 2000为我们提供了强大的(同时也是相当方便的向导)来建立标准的Windows窗体。 报表:为格式化、计算、打印选定资料而设计的对象。它是衡量一个优秀的数据库的重要标准(有时甚至是唯一的标准)。 宏:为了响应已定义的事件,需要让Access去执行一个或多个操作,而宏就是对这些操作的结构化的定义对象。它可以让你像堆积木一样建立一个功能强大的程序,而无须写大量的代码。 模块:包括用VBA编码的定制过程的一个对象。模块提供了独立的动作流以捕获错误,而宏做不到。模块能直接响应窗体或报表事件,也可以从应用程序的任何地方被调用。 2.2.2 VB6和Access的连接 在进行系统开发时,一个很重要的步骤就是建立数据库的连接,即访问数据库。VB6提供了多种方式访问数据库,其中以ODBC与ADO应用最多。早期还有RDO,DAO等。 2.2.2.1 ODBC连接数据库 ODBC(Open Database Connectivity,开放数据库连接)是微软开放服务结构中有关数据库的一个组成部分。它建立了一组规范,并提供了一组应用程序调用接口。用这样一组接口建立的应用程序,对数据库的操作不依赖于任何数据库管理系统,不直接与任何DBMS打交道,由此可实现应用程序对不同DBMS的共享。数据库操作的“数据源”对应用程序是透明的,所有的数据库操作由对应DBMS的ODBC驱动程序(ODBC Driver)完成。有了ODBC驱动程序,数据源就变得十分广泛,它可以是本机的某种数据库格式的文件(如本机DOS目录下的Access文件*.mdb),也可以是远程数据库文件(如Microsoft SQL Server);它可以是目前已知的某种DBMS格式,也可以是一种全新的数据库格式。 在ODBC方式中,不管底层网络环境如何,也无论采用何种DBMS,用户在程序中都使用同一套标准代码,源程序可以不因底层的变化而重新编建或修改,从而减轻了开发维护的工作量,缩短了开发周期。但ODBC访问数据库的速度较慢,而且需为每个客户端配置ODBC数据源。 2.2.2.2 ADO连接数据库 微软公司的ADO(ActiveX Data Objects)是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发 第 5 页 人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。 ADO包含一些顶层的对象: 连接,代表到数据库的连接 记录集,代表数据库记录的一个集合命令,代表一个SQL命令 记录,代表数据的一个集合流,代表数据的顺序集合 错误,代表数据库访问中产生的意外 字段,代表一个数据库字段 参数,代表一个SQL参数 属性,保存对象的信息 ADO向VB程序员提供了很多好处。包括易于使用,熟悉的界面,高速度以及较低的内存占用。同传统的数据对象层次(DAO和RDO)不同,ADO可以独立创建。因此你可以只创建一个“Connection”对象,但是可以有多个,独立的“Recordset”对象来使用它。ADO针对客户/服务器以及WEB应用程序作了优化。 ADO 是基于OLE DB的访问接口,它是面向对象的OLE DB技术,继承了OLE DB的优点。属于数据库访问的高层接口。开发人员在使用ADO时,其实就是在使用OLE DB,不过OLE DB更加接近底层。ADO向我们提供了一个熟悉的,高层的对OLE DB的Automation封装接口。 VB应用程序Microsoft.Jet.OLEDBAccess2000数据库 图2.1 VB应用程序与数据库的连接 第三章 需求分析 3.1 需求分析 第 6 页 软件需求分析是软件开发周期的第一个阶段,也是关系到软件开始成败的关键步骤。准确、完整和规范化的软件需求是软件开发成功的关键。 3.1.1 系统数据流程图 在研究了用户提供的原始资料及要求后,画出了系统的数据流程图如下所示。 增料操作产品管理物料管理订单管理供应商管理仓位管理退料操作查询仓库收料仓库发料生产计划盘点报表 图3-1 数据流程图 3.1.2 功能需求及设计思想 3.1.2.1 总体架构思想 本仓库管理系统是利用Client/Server结构,即客户机/服务器模式。这种CS模式适用于局域网、安全性可以得到可靠的保证。它为数据提供了更安全的存取模式。响应速度快。程序开发具有很强的针对性,因此,操作界面漂亮,形式多样,可以充分满足客户自身的个性化要求。 第 7 页 VB应用程序Access2000数据库 图3-2 C/S结构示意图 3.1.2.2 物料管理模块 首先我们为每一个物料制定出唯一的一个代码,在整个物料管理过程中都将以这个代码来管理物料。设计代码如下:1 Y Y Y – X X X X;其中1代表是物料。YYY代表序列号,XXXX由系统自动给出。每增加一个物料时,系统都会给出此物料的代码。 对于物料数量上的控制采用最大最小数量法。如果当前数量小于最小数量,则需出订单去采购,如果大于最大数量则不允许再出订单。自动订单是根据这个原则产生的。 物料根据其价值分为A,B,C三类,可以为每一种类型的物料制定不同的控制方法。 A类物品:高值──价值占库存总值70-80%的相对少数物品。通常为物品的15-20%。 B类物品:中值──总值占库存总值的15-20%。物品数居中,通常占物品的30-40%。 C类物品:低值──库存总值几乎可以忽略不计,只占5-10%。是物品的大多数,通常占60-70%。 3.1.2.3 供应商管理模块 供应商管理模块记录公司所有供应商的情况,以保证每个供应商都是经过认证的。并且为每个供应商编制一个统一的代码。以代码来代表供应商,可以减少数据库中的数据量。 供应商管理模块还包括公司的物料在供应商处的代码。就像我们去买东西,我们不但要知道去哪里买,还要知道买什么。供应商代码只提供我们去哪里买,第 8 页 而物料在供应商的代码则是解决了要买什么的问题。 系统为了统一管理,加强控制。将这两个信息结合在一起给出一个综合代码。例如我们去人民商场买一件衣服给出一个综合代码为4000-0001,而去长发商场去买同一件衣服则给出的综合代码为4000-0002,这样处理有利于更好的分清每个物料及供应商之间的关系。为生产线提供更多的更全的数据。 3.1.2.4 产品管理模块 物料是指公司从供应商处买来的,是半成品。产品是公司生产的。同样,我们也需为公司的每一个产品编制一个代码。方便管理。另一方面,还需建立产品与物料之间的联系。即产品组成表。表示某个产品是由哪些物料组成的。在制作生产计划时,只需给出生产的产品代码,而无需给出每一个物料的代码。 3.1.2.5 订单管理模块 订单管理主要任务是产生订单。产生定单的方法有两种,一种是自动定单。一种是手工下单。自动定单是系统根据当前的物料状况及物料控制方法来对每一个物料进行分析,如果符合下单条件则自动产生一个订单,经确认后就为有效订单。在确认过程中,可以对订单进行各种操作。手工下单就是人为地去采购某一种物料,并且把这个订单记录到系统中去。自动订单可以一次下多个定单,手工下单只能一个一个产生订单。 订单是仓库进行收料操作的基础。 3.1.2.6 仓库收料 仓库根据系统发出的订单进行收料。 3.1.2.7 生产计划管理模块 此模块主要是管理生产计划。根据产品及生产数量,日期等不同将生产分为一批一批,利用生产计划号,即工单号来区分。每次计划产生前,系统会根据产品组成表提供的信息来检验当前的物料状况,如果物料不能满足此次生产,则不能成功产生生产计划。 仓库的发料也是根据生产计划来进行的。每个生产计划都会自动产生一个发料清单。 3.1.2.8 仓位管理模块 第 9 页 仓位管理记录了仓库每个仓位存放的物料。 3.1.2.9 仓库发料 仓库根据生产计划给出的工单号来进行发料。发料时,即可以一次性发多个料,即按工单发料;也可以按物料一个一个来发。可自由选择。也可以两种方法结合在一起来发料。 3.1.2.10 生产增料和退料 生产增料代表了生产损耗。为了核算每批产品的生产成本,因此增料操作需按生产计划号来进行。即每个生产增料都需确定到每个计划号,因此增料是以生产计划号为基础的。 生产退料是生产线将好的物料退回给仓库。 3.1.2.11 盘点管理 仓库每月,每季及每年都要进行盘点。盘点时需提供盘点报表及盘点调整。 3.1.2.12 报表与查询 需提供根据各种条件来得到查询结果。条件即可以是单个条件也可以组合条件。查询结果分为三个部分,一部分是基本信息,另一部分是订单信息,以及生产计划信息。 3.1.2.13 操作日志 记录系统内主要的数据的操作,以便日后查询所需。 第 10 页 第四章 系统设计 在进行了需求分析、确定了设计思想之后,就要进行系统的功能设计和数据库的设计。 4.1 系统功能设计 4.1.1 系统功能模块图 在仔细分析了公司的物料数据图后,决定将整个系统分为四大模块,每个模块又有若干个子模块。整个系统功能模块如下图所示: 仓库管理系统系统管理模块仓库管理模块物料管理模块报表查询模块重登录修改密码用户管理退出入库操作出库操作退料操作增料操作仓位管理盘点损益物料管理产品管理供应商管理生产计划订单管理查询出库操作盘点报表图4-1 系统功能模块图 4.1.2 系统各模块说明 4.1.2.1 系统管理模块 在此功能模块,用户可以进行用户间的切换,修改密码,及退出。对于管理员和超级用户还可以进行用户管理。 4.1.2.2 仓库管理模块 仓库管理模块可完成仓库的主要日常操作。包括收料,发料,增料,退料。同时还有仓库的仓位管理及盘点调整。 第 11 页 4.1.2.3 物料管理模块 物料管理模块可完成附加功能,利用这些功能可很好的防止由于人为因素造成的数据错误。具体有物料管理,产品管理,供应商管理,订单管理和生产计划管理。 4.1.2.4 报表查询模块 在此功能模块,用户可以进行各种条件的查询。实时了解整个公司的物料状况。为决策提供依据。具体有查询,操作日志及盘点报表。 4.2 数据库设计 大多数应用系统都需要后台数据库地支持。在Windows操作系统中,Access和SQL Server是最常见地网络后台数据库。本系统是采用Access数据库存储数据。 4.2.1 创建数据库 本系统采用了Access作为数据库管理系统。先启动Access2000程序,然后创建名为“WMS”的数据库。并为此数据库设置密码。 4.2.2 数据表结构 本仓库管理系统的数据库共包括12张数据表。4.2.2.1 用户信息表 用户信息表(Users)用来保存用户(管理员,用户)的信息,该表的结构如表4-1所示。 表4-1 Users(用户信息)表的结构 Users 表结构序号12345字段user_nameuser_pwduser_leveluser_dateremark描述用户名用户密码用户权限用户建立日期备注类型和长度主键TextTextTextText是否否否可空否否否否是默认值没有没有没有没有没有Date/Time否 4.2.2.2 物料代码表 物料代码表(Materials)用来存放企业所需用的所有的物料。该表的结构如表 第 12 页 4-2所示。 表4-2 Materials(物料代码)表的结构 Materials表结构序号123456字段PartNumberDescriptionPartTypeDateAddByRemark描述物料代码物料描述物料类型物料建立日期物料建立者备注类型和长度主键TextTextTextTextText是否否否否可空否否否否否是默认值没有没有没有没有没有没有Date/Time否 4.2.2.3 产品代码表 产品代码表(Productions)用来保存公司生产的所有产品的信息,该表的结构如表4-3所示。 表4-3 Productions(产品代码)表的结构 Productions表结构序号12345字段ProductionPNProductionDescDateAddByRemark描述产品代码产品描述产品建立日期产品建立者备注类型和长度主键TextTextTextText是否否否可空否否否否是默认值没有没有没有没有没有Date/Time否 4.2.2.4 产品组成表 产品组成表(BoMs)用来记录公司生产的产品是由哪些物料组成的。为仓库发料提供依据。该表的结构如表4-4所示。 表4-4 BoMs(产品组成)表的结构 BoMs表结构序号1234字段ProductionPNMaterialPNMaterialQTYRemark描述产品代码物料代码物料数量备注类型和长度主键TextTextTextText否否否否可空否否否是默认值没有没有没有没有 4.2.2.5 供应商代码表 供应商代码表(Suppliers)用来保存公司供应商的信息。该表的结构如表4-5所示。 表4-5 Suppliers(供应商代码)表的结构 第 13 页 Suppliers表结构序号1234567字段SupplierNumberSupplierNameSupplierAddressSupplierTelDateAddByremark描述供应商代码供应商名称供应商地址供应商电话供应商建立日期供应商建立者备注类型和长度主键TextTextTextTextTextText是否否否否否可空否否否否否否是默认值没有没有没有没有没有没有没有Date/Time否 4.2.2.6 物料供应商联系表 物料供应商联系表(AVLs)用来保存物料在供应商处的有关信息。也是系统产生订单时的必要信息。该表的结构如表4-6所示。 表4-6 AVLs(物料供应商联系)表的结构 AVLs表结构序号12345678字段AVLNumberPartNumberSupplierNumberSupplierPNPriceDateAddByRemark描述物料供应商综合代码物料代码供应商代码供应商物料代码单价加入系统日期加入系统者备注类型和长度主键TextTextTextTextCurrencyTextText是否否否否否否可空否否否否否否否是默认值没有没有没有没有没有没有没有没有Date/Time否 4.2.2.7 订单管理表 订单管理表(POs)用来保存公司给供应商买料的订单,也是仓库收料的依据。该表的结构如表4-7所示。 表4-7 POs(订单管理)表的结构 POs表结构序号12345678字段PONumberPartNumberQtyAVLNumberCloseDateCloseByStatusRemark描述订单号码物料代码数量供应商的综合信息收料人收料日期订单状态备注类型和长度主键TextTextTextTextTextTextText是否否否否否否可空否否否否否否否是默认值没有没有没有没有没有没有没有没有Date/Time否 4.2.2.8 生产计划产品管理表 生产计划产品管理表(PP_Produciton)用来保存生产计划的有关信息。该表的结构如表4-8所示。 表4-8 PP_Produciton(生产计划产品管理表)表的结构 第 14 页 PP_Produciton表结构序号12345678字段PlanNumProducitonDateProductionNumQTYStatusAddDateAddByRemark描述生产计划号计划生产日期生产的产品代码生产的产品数量此生产计划的状态生产计划制定日期生产计划制定者备注类型和长度主键TextTextNumberTextTextText是否否否否否Date/Time否可空否否否否否否否是默认值没有没有没有没有没有没有没有没有Date/Time否 4.2.2.9生产计划物料管理表 生产计划物料管理表(PP_Material)用来保存生产计划中的每一颗物料的使用状况。此表是由生产计划产品管理表和产品组成表通过计算而得到的。该表的结构如表4-9所示。 表4-9 PP_Material(生产计划物料管理)表的结构 PP_Material表结构序号1234567字段PartNumPlanNumQtyOutByOutDateStatusRemark描述物料代码生产计划号数量发料人发料日期此次计划的物料状态备注类型和长度主键TextTextNumberTextTextText否否否否否否可空否否否否否否是默认值没有没有没有没有没有没有没有Date/Time否 4.2.2.10 物料现状表 物料现状表(NowMaterials)用来保存当前的物料状况,同时为订单的产生及生产计划的制定提供物料依据。该表的结构如表4-10所示。 表4-10 NowMaterials(物料现状)表的结构 NowMaterials表结构序号12348字段PartNumberCurrentQtyMinQtyMaxQtyRemark描述物料代码当前数量最小数量最大数量备注类型和长度主键TextNumberNumberNumberText是否否否否可空否否否否是默认值没有没有没有没有没有 4.2.2.11 仓库仓位管理表 仓库仓位管理表(Locations)用来管理仓库的各个仓位信息。该表的结构如表4-11所示。 表4-11 Locations(仓库仓位管理)表的结构 第 15 页 Locations表结构序号1234字段LocationTypeLocationNumPartNumRemark描述仓位类型仓位编号物料代码备注类型和长度主键TextTextTextText否是否否可空否否否是默认值没有没有没有没有 4.2.2.12 操作日志表 操作日志表(DailyDate)用来保存用户的所有操作信息。以便以后发现问题时查询所需。该表的结构如表4-12所示。 表4-12 DailyDate(操作日志)表的结构 DailyData表结构序号1234字段OP_DateOP_ActionOP_ByRemark描述操作日期操作内容操作者备注类型和长度主键Date/Time否TextTextText否否否可空否否否是默认值没有没有没有没有 4.2.3 数据库中各表的关系 数据库中各表之间的关系如图4-2所示。 图4-2 数据库中各表的关系 第五章 仓库管理原型系统实现 5.1 数据库实现 第 16 页 5.1.1 连接数据库 在进行系统开发前,一个很重要的步骤就是建立数据库的连接,即访问数据库。VB6提供了多种方式访问数据库,其中以ODBC与ADO应用最多。具体ODBC及ADO详见相关理论部分。本系统采用ADO方式访问数据库。ADO数据库连接主要分两步进行:一是引用ADO,二是使用ADO连接数据库。 1.引用ADO 在VB6菜单“工程”“引用”-从中选择 Microsoft ActiveX Data objects 2.8 library和 Microsoft ActiveX Data objects recordset 2.8两个组件,这是在连接数据库前所必做的工作。 图5-1 引用ADO 第 17 页 图5-2 选择ADO控件 2.使用ADO连接数据库 本系统采用的是无源的数据库连接方法,因为整个系统都会使用到这个数据库,所以将数据库的连接定义为全局变量。 Public Cn As New ADODB.Connection ‘定义数据源 Dim db_path As String ‘用于存放数据库的路径 Dim db_cn As String ‘连接数据源字符串 db_path = App.Path & “DataWMS.mdb” ‘指定数据库文件 db_cn = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & db_path & “;Jet OLEDB:database password=123321;” ‘数据库连接字符串 Cn.Open db_cn ‘打开数据源 5.1.2 建立数据表 本系统采用了Access作为数据库管理系统。先启动Access2000程序,然后创建名为“WMS”的数据库。并为此数据库设置密码。在数据库中建立各表。表名称及表结构详见系统设计中数据表的设计。 5.2仓库管理系统主要界面及使用说明 第 18 页 本系统按用户类别及使用功能可以分为管理员登录、普通用户登录及超级用户登录三种。不同类型的用户具有不同的权限。所有用户的主操作界面相同,区别在于个别功能的使用权限。 5.2.1 系统登录界面 设计思路与要点:用户运行程序后,输入用户名与密码,程序根据用户名到后台数据库查询用户名和密码是否正确,如果正确,则根据用户名给出用户所属的级别,并根据级别给出相应的权限。如没有通过验证,则给出没有通过验证的原因。 系统登录界面如图5-3所示。 图5-3 仓库管理系统登录界面 如果用户名或密码错误,系统会分别提示,防止非法用户进入系统操作。 图5-4 仓库管理系统密码错误界面 5.2.2 系统主界面 设计思路与要点:用户登录通过后,进入系统的主界面。主界面的菜单如果 第 19 页 是灰色显示,则表明此用户没有权限操作此功能。在主界面的状态栏会显示当前用户名和用户权限。 界面如图5-5所示。 图5-5 仓库管理系统主界面 5.2.3 系统管理模块 系统管理模块主是功能是进行本系统的一些常用管理工作,共有四个子模块:重新登录,修改密码,用户管理,退出。 5.2.3.1 重新登录功能 进入系统后,可选择重新登录在不现用户之间进行切换。界面如图5-6所示。 图5-6 系统重登录界面 5.2.3.2 修改密码功能 设计思路和要点:用户如需修改自己的登录密码,需输入旧密码与新密码,程序在数据库中修改用户的密码。 第 20 页 界面如图5-7所示。 图5-7 修改密码界面 5.2.3.3 用户管理功能 设计思路和要点:用户管理是对使用此系统的所有用户进行管理。分为增加,删除以及修改用户信息。此功能只有管理员和超级用户才能使用。普通用户不能执行此操作。 界面如图5-8所示。 图5-8 用户管理界面 5.2.3.4 退出功能 退出即退出本系统。选择系统管理下的退出即可。如图5-9所示。 第 21 页 图5-9 退出系统菜单 5.2.4 仓库管理模块 仓库管理模块是本系统的核心模块。根据仓库的日常操作共分有六个子模块,分别是:入库操作,出库操作,退料操作,增料操作,仓位管理和盘点损益。已基本包括了仓库管理的主要功能。 5.2.4.1 入库操作 设计思路和要点:入库操作即仓库的收料,系统规定收料只能根据订单来进行。没有订单就不能完成收料。每个订单都对应一个入库操作。这样可以大大减少因人为因素产生的错误。规范化仓库收料操作。选择订单号码后,相关的订单信息已会显示出来。订单号码是由订单管理模块产生。仓库人员没有权限产生订单。 界面如图5-10所示。 图5-10 入库操作界面 5.2.4.2 出库操作 设计思想和要点:出库操作即仓库的发料,本系统规定仓库的发料需根据生产计划来进行。没有生产计划则不能发料。生产计划的产生由专门模块实现。生 第 22 页 产计划用工单来区分。每个工单的发料可有两种方式,一种是按工单发料,即一次性将一个工单的全部所需物料全部发至生产线。另一种是按物料,即根据生产状况,一个一个将物料发至生产线。选择选择发料类型,按工单或按物料。按工单的话,则选择工单号即生产计划号,系统自动将此工单的所有料发至生产线。 界面如图5-11和图5-12所示。 图5-11 出库操作按工单界面 图5-12 出库操作按物料界面 5.2.4.3 退料操作 设计思路和要点:退料操作是针对生产线由于各种原因产生的生产中多领的物料退回仓库。退料时需选择所退物料的料号及数量。程序会根据这些信息在数据库中作出相应的调整。 第 23 页 界面如图5-13所示。 图5-13 退料操作界面 5.2.4.4 增料操作 设计思路和要点:增料操作即由于生产损耗而需要增料。为了核算成本,增料需根据生产计划号来进行增料操作,这样就可以清楚列出每次生产的损耗。 界面如图5-14所示。 图5-14 增料操作界面 5.2.4.5 仓位管理 设计思路与要点:仓位管理是对仓库的各个仓位进行分配与管理。可以增加新的仓位和修改仓位存放的物料。 界面如图5-15所示。 第 24 页 图5-15 仓位管理界面 5.2.4.6 盘点损益 设计思路和要点:每次盘点后,需根据盘点结果进行某些物料的调整。调整分为收益和亏损。 界面如图5-16所示。 图5-16 盘点损益界面 5.2.5 物料管理模块 此模块的主要功能是对仓库和生产及仓库和物料的一些接口数据的管理。在现代企业中,每个系统之间都有一定的联系。仓库系统也不例外,为了更好的管理仓库,得到更全的数据,减少因为人为因素而发生的错误,仓库与其他系统也 第 25 页 有一定的数据联系。此模块共有五个子模块:物料管理,产品管理,供应商管理,生产计划和订单管理。 5.2.5.1 物料管理 设计思路和要点:物料管理模块是管理企业的所有的物料,系统为每个物料给出一个代码。在企业内部以这个代码来进行收料,发料等操作。物料代码是整个企业物料管理的基础。因此物料代码的管理是非常重要的。综合公司的具体情况,决定物料代码由程序根据一定的规则自动产生。物料采用最大最小数量来控制。 界面如图5-17所示。 图5-17 物料管理界面 5.2.5.2 产品管理 设计思路和要点:产品管理模块主是对公司的所有产品进行编码及记录产品的组成情况。相应地分两部分,一个是产品代码管理,另一个是产品组成物料清单管理。产品代码是由程序根据一定的规则产生。而产品组成物料清单则是由物料管理中的物料组成的。产品与物料最大的不同点在于产品是由公司生产出来的,而物料是由公司直接买来的。 界面如图5-18和图5-19所示。 第 26 页 图5-18 产品管理界面 图5-19 产品物料组成清单界面 5.2.5.3 供应商管理 设计思路和要点:供应商管理也分两部分,一个是供应商代码管理,另一个是供应商物料代码管理。供应商代码管理是为了方便对供应商进行调整。供应商 第 27 页 加上供应商的物料代码组成了一个综合信息。我们为每个综合信息进行编号,方便管理。 界面如图5-20和图5-21所示。 图5-20 供应商代码管理界面 图5-21 供应商物料代码管理界面 5.2.5.4 生产计划管理 设计思路和要点:生产计划管理需根据当前的物料状况来进行。每次生产计划以编号来划分。编号由系统产生。计划产生时系统会检查物料状况。如物料状况不允许则不能成功产生生产计划。 第 28 页 界面如图5-22所示。 图5-22 生产计划管理界面 5.2.5.5 订单管理 设计思路和要点:订单可以系统自动产生,也可以手工产生。自动产生时,根据物料的管理办法,产生订单可以是多个也可以是一个。而手工定单的产生只能是一个。定单产生后需进行确认才能生效。 界面如图5-23所示。 图5-23 订单管理界面 5.2.6 报表查询模块 此模块的主要功能是查询及报表。5.2.6.1 查询 第 29 页 设计思路和要点:根据各种查询条件查询物料信息。物料信息包含三部分,一为基本信息,二为订单信息,三为生产计划信息。适合所有使用者。 界面如图5-24所示。 图5-24 查询界面 5.2.6.2 查询日常操作 设计思路与要点:对系统的每一次操作能应及时地记录下来,以便日后查询。因此在数据库中单独创建一张表,用于记录系统的日常操作,即仓库的各种日常操作。通过此功能,可能追溯系统数据的整个变化过程。使整个系统的运行都在控制之内。 界面如图5-25所示。 第 30 页 图5-25 操作日志界面 5.2.6.3 盘点报表 设计思路和要点:盘点报表可以根据盘点的需要,按物料编码或按仓位生成。盘点报表将列出当前时刻,仓库中所有物料的数量及存放地点,以便盘点时参考。同时此报表还可以输出成各种格式,以方便用户使用。 界面如图5-26所示。 图5-26 盘点报表界面 5.4 系统测试 第 31 页 一般情况下,我们千辛万苦开发出的程序总会存在一些问题,这就需要进行测试。对于此系统的测试从以下几方面进行入手。 5.4.1 菜单测试 检查每个菜单是否有效。5.4.2各功能模块测试 设计一些数据,利用各个模块提供功能进行测试。并检查程序的防呆性,即程序是否能够有效地防止一些明显有错误数据进入系统。 5.4.3 数据跟踪测试 打开后台数据库,检查各项数据是否与输入的一致。及各个表及表中数据是否一致。 第 32 页 第六章 小结与展望 整个仓库管理考试系统主要包括上面所写的模块及功能,基本上已经能够覆盖了仓库日常管理中的主要操作。内容也较为详尽。由于时间、所学以及精力的关系,该系统还处于原型设计阶段,许多预想的模块还没有能够及时添加进去。就是写进系统的也有部分模块还可以更加好的进行完善。 6.1 成绩及不足 本仓库管理系统的设计和分析到目前为止还只是一个初始阶段,在这段时间的设计过程中,从中得到了一些成绩,也有一些不足。 6.1.1 成绩 能够比较好的进行需求分析,可行性分析以及系统设计,来独立开发一个较为小型的MIS系统; 完成了仓库管理中日常使用最多的最主要的功能。 具有很好的防呆功能。 对数据的处理也有一定的联系,可减少人为因素带来的影响。 较少的键盘输入,大多数功能可只用鼠标来完成操作。 模块化编程,为以后的改进提供了方便。 6.1.2 不足 系统只提供了键盘和鼠标的输入,没有提供条码扫描的输入。 系统没有提供打印输出的功能,如果需要打印还需借助其他的软件。 系统只是提供了一个简单的功能,与现代化的公司仓库定理还有不小的差距。 系统的一些模块的功能是理论化的,在实际中还有许多更复杂的情况并没有考虑进去。在以后实际作用过程中很有很多地方需改进。 第 33 页 6.2 展望 对于一个公司的仓库管理来说,该系统还只是一个雏形,没有完成的事情还很多。有了现有的系统原型,还要与用户沟通,将他们实际操作中的一些问题考虑进去,逐步改进上面谈到的一些不足点,完善整个系统。另外还需参照公司的其他系统,开发出与其他系统的接口。 第 34 页 结 束 语 通过紧张忙碌的三个多月的毕业设计,我的个人能力得到了很大的提高。获益匪浅,专业知识上也上了一个新台阶,对整个软件设计开发的流程也有了更深刻的理解。 在我以前的工作中,总是先考虑编码,然后再考虑其他的问题,导致在工作过程中经常需调整用户需求和进度上的安排不尽如人意,经常需加班来赶进度。而在这次毕业设计中,我按照软件工程的要求进行,先进行编码前的前期工作,并按照老师为我们制定的进度进行,顺利地完成了制定的任务。在整个工作过程中,感觉没有像以前那样匆忙,整个过程也很轻松。通过这次毕业设计,将使我的工作习惯有一个很大的改进。这些提高是终身受益的。 总之,通过这次毕业设计是使我各方面的知识得以融汇贯通,为我将来的工作开了一个好头。我认为这种改变是质的飞跃。 由于时间仓促,以及本人水平有限,只对该系统做了简单的开发,设计中还存在一些不足之处,尚有待完善。最后,希望大家多多批评指导, 敬请老师批评指正。 第 35 页 致 谢 在本次毕业设计中,我从指导赵老师身上学到了很多东西。特别是对系统化的软件工作对我影响最大,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助。在此表示衷心的感谢! 同时,感谢三年来对我关心帮助的所有任课老师和同学,特别是赵睿老师和我们的班主任老师在三年的学习给我的帮助。以及要感谢我们班的其他同学,虽然我是一个人做毕业设计的,但在我遇到问题时,我们是一起讨论解决的。 总之一句话,感谢所有关心和帮助我的人。 第 36 页 参考文献 参考文献表 [1] 史济民,软件工程——原理、方法与应用,机械工业出版社,2002 [2] [美]Gary Cornell,VB6从入门到精通,北京希望电子出版社,1999 [3] 陈恩义,SQL Server 2000开发指南,清华大学出版社,2002 [4] 赵松涛,Visual Basic + SQL Server 2000 系统开发实录,2007 [5] 卢湘鸿,Access 数据库与程序设计,电子工业出版社,2006 [6] 戴建耘,Access 2003数据库教程,电子工业出版社,2007 第 37 页第四篇:uml建模报告ATM自动柜员机系统
第五篇:基于VB技术的仓库管理系统的设计与实现