《VB+Access设计图书管理系统-源码+图示.docx》由会员分享,可在线阅读,更多相关《VB+Access设计图书管理系统-源码+图示.docx(28页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、一、需求分析在进行一个项目的设计之前,先要进行必要的需求分析。现某图书馆需要管理其各种人员和图书信息,希望实现办公的信息化,通过建立一个图书管理系统来管理图书。其完成的功能如下:(1) 可以实现图书的登记、借阅和赔偿的管理。(2) 可以实现对图书的各种信息的查询,包括逐个浏览,以及对图书信息的增加、删除和编辑操作。另外,可以根据输入的信息来检索某个图书的信息。(3) 可以实现对管理人员的投诉管理。(4) 可以实现对值班人员的管理。系统的功能模块图如图1所示。本实例根据上面的设计规划出的实体有图书登记实体、图书借阅实体、图书赔偿实体、查询输出实体、值班管理实体、投诉管理实体。各个实体具体的描述E
2、-R图如下。图书登记实体E-R图如图2所示。图书借阅实体E-R图如图3所示。 图1 系统的功能模块图图2 图书登记实体E-R图图3 图书借阅实体E-R图图书赔偿实体E-R图如图4所示。图4 图书赔偿实体E-R图投诉管理实体E-R图如图5所示。 图5 投诉管理实体E-R图值班管理实体E-R图如图6所示。图6 值班管理实体E-R图查询输出实体E-R图如图7所示。图7 查询输出实体E-R图 二、结构设计根据上面的需求分析,设计好数据库系统,然后开发应用程序可以考虑的窗体的系统,每一个窗体实现不同的功能,可以设计下面的几个模块。 图书管理模块:用来实现图书的登记、借阅、赔偿。 图书资料模块:用来实现图
3、书的查询输出。 值班管理模块:用来实现管理人员的值班浏览。 投诉管理模块:用来实现对管理人员的投诉管理。 系统管理模块:用来实现用户的增加、删除和修改等操作。三、数据库设计这里的数据库采用Access,用ADO作为连接数据对象。1、建立Access 数据库启动Access,建立一个空的数据库book.mdb,如图8所示。使用程序设计器建立系统需要的表格如下。图书登记表,如图9所示。 图8 建立数据库book.mdb 图9 图书登记表图书借阅表,如图10所示。图书赔偿表,如图11所示。 上一 图10 图书借阅表 图11 图书赔偿表图书资料表,如图12所示。系统管理表,如图13所示。 图12 图书
4、资料表 图13 系统管理表投诉管理表,如图14所示。图14 投诉管理表值班管理表,如图15所示。图15 值班管理表2、连接数据在Visual Basic环境下,选择“工程”“引用”命令,在随后出现的对话框中选择“Microsoft ActiveX Data Objects 2.0 Library”,然后单击“确定”按钮,如图16所示。图16 引用ADO连接数据库在程序设计的公共模块中,先定义ADO连接对象。语句如下:Public conn As New ADODB.Connection 标记连接对象然后在子程序中,用如下的语句即可打开数据库:Dim connectionstring As St
5、ringconnectionstring = provider=Microsoft.Jet.oledb.4.0; data source=book.mdbconn.Open connectionstring3、设置ODBCVB的ADO对象是通过ODBC来访问数据库,所以还要建立ODBC数据引擎接口。打开控制面板中的“管理工具”“数据源”(ODBC),出现如图17所示的对话框。图17 ODBC对话框单击“添加”按钮,出现“创建新数据源”对话框,如图18所示。图18 “创建新数据源”对话框选择Microsoft Access Driver(*.mdb),单击“完成”按钮,出现如图19所示对话框。图
6、19 设置连接数据源在“数据源名”文本框中添加一个名字,单击“确定”按钮完成系统默认连接设置。然后在ODBC对话框中单击“确定”按钮完成ODBC设置。 界面设计设计好的界面如图20所示。图20 图书管理系统界面这是一个多文档界面(MDI)应用程序,可以同时显示多个文档,每个文档显示在各自的窗体中。MDI 应用程序中常有包含子菜单的“窗体”选项,用于在窗体或文档之间进行切换。菜单应用程序中,有5个菜单选项,每个选项对应着E-R图的一个子项目。1、创建主窗体首先创建一个工程,命名为图书管理系统,选择“工程”“添加MDI窗体”命令,则在项目中添加了主窗体。该窗体的一些属性如表1所示。表1 主窗体的属
7、性属 性值 Caption 图书管理系统 Name Main Menu Mainmenu1 Windowstate MaxsizeWindowstate的值为Maxsize,即程序启动之后自动最大化。将“菜单”组件从“工具箱”拖到窗体上。创建一个 Text 属性设置为“文件”的顶级菜单项,且带有名为“关闭”的子菜单项。类似地创建一些菜单项,如表2所示。表2 菜 单 项 表菜 单 名 称 Text属性功 能 描 述 MenuItem1 图书管理顶级菜单,包含子菜单 MenuItem2 图书登记调出图书登记窗体 MenuItem3 图书借阅调出图书借阅窗体 MenuItem4 图书赔偿调出图书赔偿
8、窗体 MenuItem5 图书资料顶级菜单,包含子菜单 MenuItem6 查询输出调出查询输出窗体 MenuItem7 值班管理顶级菜单,没有子菜单 MenuItem8 投诉管理顶级菜单,没有子菜单 MenuItem9 系统管理顶级菜单,包含子菜单 MenuItem10 增加用户调出用户窗体 MenuItem11 修改密码调出密码窗体 MenuItem12 退出系统退出主窗体如图21所示。图21 主窗体2、创建各子窗体选择“工程”“添加窗体”命令,添加子窗体。在新建Visual Basic工程时自带的窗体中,将其属性MIDChild改成True,则这个窗体成为MID窗体的子窗体。在这个项目中
9、,要创建的子窗体如表3所示。表3 所有子窗体子 窗 体 名 Text 图书登记 frmdengji 图书借阅 frmjieyue 图书赔偿 frmpeichang 增加新用户 frmadduser 查询输出 frmfind 登录系统 frmlogin 修改密码 frmchangepwd下面分别给出这些子窗体,以及它们所使用的控件。(1) 图书登记子窗体如图22所示,其控件如表4所示。图22 图书登记子窗体表4 图书登记子窗体控件控 件 类 别控件Name 控件Text Label Label1 编号 Label2 书名 Label3 类型 Label4 购买日期 Label5 定价 TextB
10、ox Text1 (空) Text2 (空) Text3 (空) Text4 (空) Text5 (空) CommandButton Command1 增加记录 Command2 删除记录 Command3 下一条 Command4 上一条 Command5 第一条 Command6 最后一条 Command7 退出 ADO DataAdodc1 (空) DataGrid DataGrid1 (空)图书借阅和图书赔偿子窗体分别如图23和图24所示,因为它们的控件与图书登记子窗体的雷同,在此不作介绍。图23 图书借阅子窗体图24 图书赔偿子窗体(2) 增加用户子窗体如图25所示,其控件如表5所示
11、。图25 增加用户子窗体表5 增加用户子窗体控件控 件 类 别控件Name 控件Text Label Label1 输入用户名 Label2 输入密码 Label3 确认密码 Label4 选择权限 TextBox Text1 (空) Text2 (空) Text3 (空) ComboBox Comb1 (空) CommandButton Commandl 确定 Command2 取消(3) 修改密码子窗体如图26所示。图26 修改密码子窗体(4) 库房管理子窗体如图27所示。图27 库房管理子窗体其控件如表6所示。表6 库房管理子窗体控件控 件 类 别控件Name 控件Text TextBo
12、x Text1 (空) ComboBox Combo1 MSFlexGrid MSFlexGrid1 (5) 查询子窗体如图28所示,其控件如表7所示。图28 查询子窗体表7 查询子窗体控件控 件 类 别控件Name 控件Text OptionButton Option1 按编号查询 Option2 按购买日期查询 Label Label1 从 Label2 到 Label3 从 Label4 年 Label5 月 Label6 日 Label7 到 Label8 年 Label9 月 Label10 日 Combo(0) ComboBox Combo1 (空) Combo(1) ComboB
13、ox Combo1 (空) Comboy(0) ComboBox Comboy (空) Comboy(1) ComboBox Comboy (空) Combom(0) ComboBox Combom (空) Combom(1) ComboBox Combom (空) Combod(0) ComboBox Combod (空) Combod(1) ComboBox Combod (空) CommandButton Command1 查询 Command2 取消(6) 用户登录子窗体如图29所示。(7) 值班管理子窗体如图30所示,其控件如表8所示。 图29 用户登录子窗体 图30 值班管理子窗体
14、(8) 投诉管理子窗体如图31所示,其控件如表9所示。图31 投诉管理子窗体建立公共模块1、显示目录建立公共模块可以提高代码的效率,同时使得修改和维护代码都很方便。创建公共模块的步骤如下:(1) 在菜单中选择“工程”“添加模块”命令,则出现模块对话框,如图32所示。(2) 选择模块图标后,单击“打开”按钮,则模块已经添加到项目中了。默认情况下名为Module1。图32 模块对话框(3) 在模块中定义整个项目的公共变量。Public conn As New ADODB.Connection 标记连接对象Public userID As String 标记当前用户IDPublic userpow
15、As String 标记用户权限Public find As Boolean 标记查询Public sqlfind As String 查询语句Public rs_data1 As New ADODB.RecordsetPublic findok As BooleanPublic frmdata As BooleanPublic Const keyenter = 13 enter键的ASCII码在主窗体添加完菜单之后,就要为各个子菜单创建事件处理程序。 主窗体代码在本项目中,子菜单事件都是Click事件,这里先给出主窗体部分的代码。下面是响应“增加用户”子菜单Click事件,调出增加用户窗体代
16、码。Private Sub adduser_Click()frmadduser.ShowEnd Sub下面是响应“查询输出”子菜单Click事件,调出查询输出窗体代码。Private Sub chaxunshUChu_Click()frmfind.ShowEnd Sub下面是响应“退出”子菜单Click事件,调出退出窗体代码。Private Sub exit_Click()Unload MeEnd Sub下面是响应“图书登记”子菜单Click事件,调出图书登记窗体代码。Private Sub checkin_Click()frmdengji.ShowEnd Sub下面是响应“修改密码”子菜单C
17、lick事件,调出修改密码窗体代码。Private Sub changepwd_Click()frmchangepwd.ShowEnd Sub下面是响应“图书借阅”子菜单Click事件,调出图书借阅窗体代码。Private Sub borrow_Click()frmjieyue.ShowEnd Sub下面是响应“图书赔偿”子菜单Click事件,调出图书赔偿窗体代码。Private Sub tushupeichang_Click()frmpeichang.Show 1End Sub下面是响应“值班管理”菜单Click事件,调出值班管理窗体代码。Private Sub zhibanguanli_C
18、lick()frmzhiban.Show 1End Sub下面是响应“投诉管理”子菜单Click事件,调出投诉管理窗体代码。Private Sub tousuguanli_Click()frmtousu.Show 1End Sub2、各子窗体的代码在各个子窗体建立好后,就可以根据各个子窗体的功能给它们添加相应代码了。(1) 图书登记子窗体代码本窗体用来填写图书登记的信息,用ADO来连接数据库,是本窗体的重点。采用MDI的子程序,所以运行后,它出现在主程序的界面下,如图33所示。图33 图书登记子窗体按钮控件要求先填写基本信息,然后与数据库信息比较。Private Sub Command1_Cl
19、ick()On Error GoTo adderrText1.SetFocusAdodc1.Recordset.AddNewExit Subadderr:MsgBox Err.DescriptionEnd SubPrivate Sub Command2_Click()On Error GoTo deleteerrWith Adodc1.RecordsetIf Not .EOF And Not .BOF ThenIf MsgBox(删除当前记录吗?, vbYesNo + vbQuestion) = vbYes Then.Delete.MoveNextIf .EOF Then .MoveLastE
20、nd IfEnd IfEnd WithExit Subdeleteerr:MsgBox Err.DescriptionEnd SubPrivate Sub Command3_Click()Adodc1.Recordset.MoveNextIf Adodc1.Recordset.EOF ThenMsgBox 这是最后一条记录, vbOKCancel + vbQuestionAdodc1.Recordset.MoveLastEnd IfEnd SubPrivate Sub Command4_Click()Adodc1.Recordset.MovePreviousIf Adodc1.Recordse
21、t.BOF ThenMsgBox 这是第一条记录, vbOKCancel + vbQuestionAdodc1.Recordset.MoveFirstEnd IfEnd SubPrivate Sub Command5_Click()If Adodc1.Recordset.EOF ThenMsgBox 记录空, vbOKCancel + vbQuestionEndElseAdodc1.Recordset.MoveFirstExit SubEnd SubPrivate Sub Command6_Click()If Adodc1.Recordset.RecordCount = 0 ThenMsgBo
22、x 空记录, vbOKCancel + vbQuestionEndElseAdodc1.Recordset.MoveLastEnd IfEnd SubPrivate Sub Command7_Click()MDIForm1.Showfrmdengji.HideEnd Sub图书借阅和图书赔偿子窗体运行后如图34和图35所示,因为它们的代码和图书登记子窗体的代码雷同,在此不做重复。图34 图书借阅子窗体运行效果图35 图书赔偿子窗体运行效果(2) 增加用户子窗体代码增加用户子窗体是用来增加用户的用户名、密码和权限的。其运行效果如图36所示。单击“确定”按钮后,还要返回一个信息框,提示成功信息,如
23、图37所示。 图36 增加用户子窗体运行效果 图37 成功信息框窗体部分代码的思路是,收集输入的表中的字符串,然后与数据库中的系统的用户数据比较,如果不存在,则允许添加。Private Sub Command1_Click()Dim sql As StringDim rs_add As New ADODB.RecordsetIf Trim(Text1.Text) = ThenMsgBox 用户名不能为空, vbOKOnly + vbExclamation, Exit SubText1.SetFocusElsesql = select * from 系统管理rs_add.Open sql, co
24、nn, adOpenKeyset, adLockPessimisticWhile (rs_add.EOF = False)If Trim(rs_add.Fields(0) = Trim(Text1.Text) ThenMsgBox 已有这个用户, vbOKOnly + vbExclamation, Text1.SetFocusText1.Text = Text2.Text = Text3.Text = Combo1.Text = Exit SubElsers_add.MoveNextEnd IfWendIf Trim(Text2.Text) Trim(Text3.Text) ThenMsgBo
25、x 两次密码不一致, vbOKOnly + vbExclamation, Text2.SetFocusText2.Text = Text3.Text = Exit SubElseIf Trim(Combo1.Text) system And Trim(Combo1.Text) guest ThenMsgBox 请选择正确的用户权限, vbOKOnly + vbExclamation, Combo1.SetFocusCombo1.Text = Exit SubElsers_add.AddNewrs_add.Fields(0) = Text1.Textrs_add.Fields(1) = Text
26、2.Textrs_add.Fields(2) = Combo1.Textrs_add.Updaters_add.Close下面是返回成功信息对话框的代码:MsgBox 添加用户成功, vbOKOnly + vbExclamation, Unload MeEnd IfEnd IfEnd Sub(3) 修改密码子窗体代码修改密码子窗体是用来修改用户密码的。其运行效果如图38所示。图38 修改密码子窗体运行效果在“确定”按钮的Click事件中添加如下代码:Private Sub Command1_Click()Dim rs_chang As New ADODB.RecordsetDim sql As
27、 StringIf Trim(Text1.Text) Trim(Text2.Text) ThenMsgBox 密码不一致!, vbOKOnly + vbExclamation, Text1.SetFocusText1.Text = Text2.Text = Elsesql = select * from 系统管理 where 用户名= & userID & rs_chang.Open sql, conn, adOpenKeyset, adLockPessimisticrs_chang.Fields(1) = Text1.Textrs_chang.Updaters_chang.CloseMsgB
28、ox 密码修改成功, vbOKOnly + vbExclamation, Unload MeEnd IfEnd Sub在上述代码中,首先比较两个表中的数据是否一致,然后用rs_chang.Fields(1) = Text1.Text语句把代码输入到数据库中。最后,用MsgBox 密码修改成功, vbOKOnly + vbExclamation,语句弹出一个信息框,告诉修改成功,如图39所示。显示目录(4) 库房管理子窗体代码库房管理子窗体是用来管理图书资料的。其运行效果如图40所示。图40 库房管理子窗体实际上,设计库房管理子窗体的程序代码与增加用户子窗体的代码在思路上是完全相同的。就是在Da
29、taGrid的文本框中显示图书进出的清单,最后把填写的明细存储到数据库中。检查代码如下:Option EXPlicitDim rs_data2 As New ADODB.RecordsetDim select_row As StringDim showgrid2 As BooleanDim rs_custom As New ADODB.RecordsetDim jinchu As String 进出库标志Dim modify As Boolean 修改状态标志Private Sub cmdexit_Click()Unload MeEnd SubPrivate Sub Form_Load()On
30、 Error GoTo loaderrorDim sql As Stringsql = select * from 图书资料rs_custom.CursorLocation = adUseClientrs_custom.Open sql, conn, adOpenKeyset, adLockPessimisticWhile Not rs_custom.EOFCombo1.AddItem rs_custom.Fields(0)rs_custom.MoveNextWendfindok = Truemodify = False 非修改状态showgrid2 = Falsedisplaygrid1 调
31、用显示Datagrid1子程序loaderror:If Err.Number 0 ThenMsgBox Err.DescriptionEnd IfEnd Sub显示msflexgrid1子程序Public Sub displaygrid1()Dim i As IntegerOn Error GoTo displayerrorsetgridsetgridheadMSFlexGrid1.Row = 0If Not rs_data1.EOF Thenrs_data1.MoveFirstDo While Not rs_data1.EOFMSFlexGrid1.Row = MSFlexGrid1.Row
32、 + 1MSFlexGrid1.Col = 0If Not IsNull(rs_data1.Fields(0) Then MSFlexGrid1.Text = rs_data1.Fields(0) ElseMSFlexGrid1.Text = MSFlexGrid1.Col = 1If Not IsNull(rs_data1.Fields(1) Then MSFlexGrid1.Text = rs_data1.Fields(1) ElseMSFlexGrid1.Text = MSFlexGrid1.Col = 2If Not IsNull(rs_data1.Fields(2) Then MSF
33、lexGrid1.Text = rs_data1.Fields(2) ElseMSFlexGrid1.Text = MSFlexGrid1.Col = 3If Not IsNull(rs_data1.Fields(3) Then MSFlexGrid1.Text = rs_data1.Fields(3) ElseMSFlexGrid1.Text = MSFlexGrid1.Col = 4If Not IsNull(rs_data1.Fields(4) Then MSFlexGrid1.Text = rs_data1.Fields(4) ElseMSFlexGrid1.Text = MSFlex
34、Grid1.Col = 5If Not IsNull(rs_data1.Fields(5) Then MSFlexGrid1.Text = rs_data1.Fields(5) ElseMSFlexGrid1.Text = rs_data1.MoveNextLoopEnd Ifdisplayerror:If Err.Number 0 ThenMsgBox Err.DescriptionEnd IfEnd SubPublic Sub setgrid()Dim i As IntegerOn Error GoTo seterrorWith MSFlexGrid1.ScrollBars = flexS
35、crollBarBoth.FixedCols = 0.Rows = rs_data1.RecordCount + 1.Cols = 6.SelectionMode = flexSelectionByRowFor i = 0 To .Rows - 1.RowHeight(i) = 315NextFor i = 0 To .Cols 1.ColWidth(i) = 1300Next iEnd WithExit Subseterror:MsgBox Err.DescriptionEnd SubPublic Sub setgridhead()On Error GoTo setheaderrorMSFl
36、exGrid1.Row = 0MSFlexGrid1.Col = 0MSFlexGrid1.Text = 编号MSFlexGrid1.Col = 1MSFlexGrid1.Text = 购买日期MSFlexGrid1.Col = 2MSFlexGrid1.Text = 书名MSFlexGrid1.Col = 3MSFlexGrid1.Text = 类型MSFlexGrid1.Col = 4MSFlexGrid1.Text = 定价MSFlexGrid1.Col = 5MSFlexGrid1.Text = 备注Exit Subsetheaderror:MsgBox Err.Description
37、End SubPrivate Sub Form_Unload(Cancel As Integer)findok = Falsers_data1.Closers_custom.CloseEnd SubPrivate Sub MSFlexGrid1_Click()On Error GoTo griderrorDim getrow As Longgetrow = MSFlexGrid1.RowIf MSFlexGrid1.Rows = 1 ThenMsgBox 无相关记录, vbOKOnly + vbExclamation, Elseselect_row = MSFlexGrid1.TextMatr
38、ix(getrow, 0)End Ifgriderror:If Err.Number 0 ThenMsgBox Err.DescriptionEnd IfEnd SubPublic Sub showdata()With MSFlexGrid2.Rows = rs_data2.RecordCount + 1.Row = 0If Not rs_data2.EOF Thenrs_data2.MoveFirstDo While Not rs_data2.EOF.Row = .Row + 1.Col = 0If Not IsNull(rs_data2.Fields(0) Then .Text = rs_
39、data2.Fields(0) Else .Text = .Col = 1If Not IsNull(rs_data2.Fields(1) Then .Text = rs_data2.Fields(1) Else .Text = .Col = 2If Not IsNull(rs_data2.Fields(2) Then .Text = rs_data2.Fields(2) Else .Text = .Col = 3If Not IsNull(rs_data2.Fields(3) Then .Text = rs_data2.Fields(3) Else .Text = .Col = 4If No
40、t IsNull(rs_data2.Fields(4) And CDbl(rs_data2.Fields(4) 0 Then.Text = -CDbl(rs_data2.Fields(4)Else.Text = rs_data2.Fields(4)End If.Col = 5If Not IsNull(rs_data2.Fields(5) Then .Text = rs_data2.Fields(5) Else .Text = .Col = 6If Not IsNull(rs_data2.Fields(6) Then .Text = rs_data2.Fields(6) Else .Text
41、= .Col = 7If Not IsNull(rs_data2.Fields(7) And CDbl(rs_data2.Fields(4) 0 Then.Text = -CDbl(rs_data2.Fields(7)Else.Text = rs_data2.Fields(7)End If.Col = 8If Not IsNull(rs_data2.Fields(8) Then .Text = rs_data2.Fields(8) Else .Text = rs_data2.MoveNextLooprs_data2.MoveLastEnd IfEnd WithEnd Sub(5) 查询子窗体代
42、码查询子窗体是用来查询库房中图书资料明细的。其运行效果如图41所示。图41 查询子窗体运行效果在列表框中给出编号或年月日后,“查询”按钮的Click事件将给出与数据库查找比较的结果。Private Sub Command1_Click()On Error GoTo cmderrorDim find_date1 As StringDim find_date2 As StringIf Option1.Value = True Thensqlfind = select * from 图书资料 where 编号 between & _Combo1(0).Text & & and & & Combo1(
43、1).Text & End IfIf Option2.Value = True Thenfind_date1 = Format(CDate(Comboy(0).Text & - & _Combom(0).Text & - & Combod(0).Text), yyyy-mm-dd)find_date2 = Format(CDate(Comboy(1).Text & - & _Combom(1).Text & - & Combod(1).Text), yyyy-mm-dd)sqlfind = select * from 图书资料 where 购买日期 between # & _find_date
44、1 & # & and & # & find_date2 & #End Ifrs_data1.Open sqlfind, conn, adOpenKeyset, adLockPessimisticfrmdatamanage.displaygrid1Unload Mecmderror:If Err.Number 0 ThenMsgBox Err.DescriptionEnd IfEnd Sub运行查询子窗体时,组合框中就已经从数据库中提取了货单号和年月日两个待查条件。Dim i As IntegerDim sql As StringIf findok = True Thenrs_data1.Cl
45、oseEnd Ifsql = select * from 图书资料 order by 编号 descrs_find.CursorLocation = adUseClientrs_find.Open sql, conn, adOpenKeyset, adLockPessimisticIf rs_find.EOF = False Then 添加编号With rs_findDo While Not .EOFCombo1(0).AddItem .Fields(0)Combo1(1).AddItem .Fields(0).MoveNextLoopEnd WithEnd IfFor i = 2001 To 2005 添加年Comboy(0).AddItem iComboy(1).AddItem iNext iFor i = 1 To 12 添加月Combom(0).AddItem iCombom(1).AddItem iNext iFor i = 1 To