1、VB+Access设计图书管理系统一、需求分析在进行一个项目标设计之前,先要进行必需需求分析。现某图书馆需要管理其多种人员和图书信息,期望实现办公信息化,经过建立一个图书管理系统来管理图书。其完成功效以下:(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 图书资料表 图13 系统管理表投诉管理表,
4、图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 Stringconnectionstring =
5、 provider=Microsoft.Jet.oledb.4.0; &_data source=book.mdbconn.Open connectionstring3、设置ODBCVBADO对象是经过ODBC来访问数据库,所以还要建立ODBC数据引擎接口。打开控制面板中“管理工具”“数据源”(ODBC),出现图17所表示对话框。图17 ODBC对话框单击“添加”按钮,出现“创建新数据源”对话框,图18所表示。图18 “创建新数据源”对话框选择Microsoft Access Driver(*.mdb),单击“完成”按钮,出现图19所表示对话框。图19 设置连接数据源在“数据源名”文本框中添加
6、一个名字,单击“确定”按钮完成系统默认连接设置。然后在ODBC对话框中单击“确定”按钮完成ODBC设置。界面设计设计好界面图20所表示。图20 图书管理系统界面这是一个多文档界面(MDI)应用程序,能够同时显示多个文档,每个文档显示在各自窗体中。MDI 应用程序中常有包含子菜单“窗体”选项,用于在窗体或文档之间进行切换。菜单应用程序中,有5个菜单选项,每个选项对应着E-R图一个子项目。1、创建主窗体首先创建一个工程,命名为图书管理系统,选择“工程”“添加MDI窗体”命令,则在项目中添加了主窗体。该窗体部分属性如表1所表示。表1 主窗体属性属 性值Caption图书管理系统NameMainMen
7、uMainmenu1WindowstateMaxsizeWindowstate值为Maxsize,即程序开启以后自动最大化。将“菜单”组件从“工具箱”拖到窗体上。创建一个 Text 属性设置为“文件”顶级菜单项,且带有名为“关闭”子菜单项。类似地创建部分菜单项,如表2所表示。表2 菜 单 项 表菜 单 名 称Text属性功 能 描 述MenuItem1图书管理顶级菜单,包含子菜单MenuItem2图书登记调出图书登记窗体MenuItem3图书借阅调出图书借阅窗体MenuItem4图书赔偿调出图书赔偿窗体MenuItem5图书资料顶级菜单,包含子菜单MenuItem6查询输出调出查询输出窗体Me
8、nuItem7值班管理顶级菜单,没有子菜单MenuItem8投诉管理顶级菜单,没有子菜单MenuItem9系统管理顶级菜单,包含子菜单MenuItem10增加用户调出用户窗体MenuItem11修改密码调出密码窗体MenuItem12退出系统退出主窗体图21所表示。图21 主窗体2、创建各子窗体选择“工程”“添加窗体”命令,添加子窗体。在新建Visual Basic工程时自带窗体中,将其属性MIDChild改成True,则这个窗体成为MID窗体子窗体。在这个项目中,要创建子窗体如表3所表示。表3 全部子窗体子 窗 体 名Text图书登记frmdengji图书借阅frmjieyue图书赔偿frm
9、peichang增加新用户frmadduser查询输出frmfind登录系统frmlogin修改密码frmchangepwd下面分别给出这些子窗体,和它们所使用控件。(1) 图书登记子窗体图22所表示,其控件如表4所表示。图22 图书登记子窗体表4 图书登记子窗体控件控 件 类 别控件Name控件TextLabelLabel1编号Label2书名Label3类型Label4购置日期Label5定价TextBoxText1(空)Text2(空)Text3(空)Text4(空)Text5(空)CommandButtonCommand1增加统计Command2删除统计Command3下一条Comma
10、nd4上一条Command5第一条Command6最终一条Command7退出ADO DataAdodc1(空)DataGridDataGrid1(空)图书借阅和图书赔偿子窗体分别图23和图24所表示,因为它们控件和图书登记子窗体雷同,在此不作介绍。图23 图书借阅子窗体图24 图书赔偿子窗体(2) 增加用户子窗体图25所表示,其控件如表5所表示。图25 增加用户子窗体表5 增加用户子窗体控件控 件 类 别控件Name控件TextLabelLabel1输入用户名Label2输入密码Label3确定密码Label4选择权限TextBoxText1(空)Text2(空)Text3(空)ComboB
11、oxComb1(空)CommandButtonCommandl确定Command2取消(3) 修改密码子窗体图26所表示。图26 修改密码子窗体(4) 库房管理子窗体图27所表示。图27 库房管理子窗体其控件如表6所表示。表6 库房管理子窗体控件控 件 类 别控件Name控件TextTextBoxText1(空)ComboBoxCombo1MSFlexGridMSFlexGrid1(5) 查询子窗体图28所表示,其控件如表7所表示。图28 查询子窗体表7 查询子窗体控件控 件 类 别控件Name控件TextOptionButtonOption1按编号查询Option2按购置日期查询LabelL
12、abel1从Label2到Label3从Label4年Label5月Label6日Label7到Label8年Label9月Label10日Combo(0) ComboBoxCombo1(空)Combo(1) ComboBoxCombo1(空)Comboy(0) ComboBoxComboy(空)Comboy(1) ComboBoxComboy(空)Combom(0) ComboBoxCombom(空)Combom(1) ComboBoxCombom(空)Combod(0) ComboBoxCombod(空)Combod(1) ComboBoxCombod(空)CommandButtonCom
13、mand1查询Command2取消(6) 用户登录子窗体图29所表示。(7) 值班管理子窗体图30所表示,其控件如表8所表示。 图29 用户登录子窗体 图30 值班管理子窗体(8) 投诉管理子窗体图31所表示,其控件如表9所表示。图31 投诉管理子窗体建立公共模块1、显示目录建立公共模块能够提升代码效率,同时使得修改和维护代码全部很方便。创建公共模块步骤以下:(1) 在菜单中选择“工程”“添加模块”命令,则出现模块对话框,图32所表示。(2) 选择模块图标后,单击“打开”按钮,则模块已经添加到项目中了。默认情况下名为Module1。图32 模块对话框(3) 在模块中定义整个项目标公共变量。Pu
14、blic conn As New ADODB.Connection 标识连接对象Public userID As String 标识目前用户IDPublic userpow 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码在主窗体添加完菜单以后,就要为
15、各个子菜单创建事件处理程序。窗体代码在本项目中,子菜单事件全部是Click事件,这里先给出主窗体部分代码。下面是响应“增加用户”子菜单Click事件,调出增加用户窗体代码。Private Sub adduser_Click()frmadduser.ShowEnd Sub下面是响应“查询输出”子菜单Click事件,调出查询输出窗体代码。Private Sub chaxunshuchu_Click()frmfind.ShowEnd Sub下面是响应“退出”子菜单Click事件,调出退出窗体代码。Private Sub exit_Click()Unload MeEnd Sub下面是响应“图书登记”子
16、菜单Click事件,调出图书登记窗体代码。Private Sub checkin_Click()frmdengji.ShowEnd Sub下面是响应“修改密码”子菜单Click事件,调出修改密码窗体代码。Private Sub changepwd_Click()frmchangepwd.ShowEnd Sub下面是响应“图书借阅”子菜单Click事件,调出图书借阅窗体代码。Private Sub borrow_Click()frmjieyue.ShowEnd Sub下面是响应“图书赔偿”子菜单Click事件,调出图书赔偿窗体代码。Private Sub tushupeichang_Click(
17、)frmpeichang.Show 1End Sub下面是响应“值班管理”菜单Click事件,调出值班管理窗体代码。Private Sub zhibanguanli_Click()frmzhiban.Show 1End Sub下面是响应“投诉管理”子菜单Click事件,调出投诉管理窗体代码。Private Sub tousuguanli_Click()frmtousu.Show 1End Sub2、各子窗体代码在各个子窗体建立好后,就能够依据各个子窗体功效给它们添加对应代码了。(1) 图书登记子窗体代码本窗体用来填写图书登记信息,用ADO来连接数据库,是本窗体关键。采取MDI子程序,所以运行后
18、,它出现在主程序界面下,图33所表示。图33 图书登记子窗体按钮控件要求先填写基础信息,然后和数据库信息比较。Private Sub Command1_Click()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(删除目前统
19、计吗?, vbYesNo + vbQuestion) = vbYes Then.Delete.MoveNextIf .EOF Then .MoveLastEnd IfEnd IfEnd WithExit Subdeleteerr:MsgBox Err.DescriptionEnd SubPrivate Sub Command3_Click()Adodc1.Recordset.MoveNextIf Adodc1.Recordset.EOF ThenMsgBox 这是最终一条统计, vbOKCancel + vbQuestionAdodc1.Recordset.MoveLastEnd IfEnd
20、SubPrivate Sub Command4_Click()Adodc1.Recordset.MovePreviousIf Adodc1.Recordset.BOF ThenMsgBox 这是第一条统计, vbOKCancel + vbQuestionAdodc1.Recordset.MoveFirstEnd IfEnd SubPrivate Sub Command5_Click()If Adodc1.Recordset.EOF ThenMsgBox 统计空, vbOKCancel + vbQuestionEndElseAdodc1.Recordset.MoveFirstExit SubEn
21、d SubPrivate Sub Command6_Click()If Adodc1.Recordset.RecordCount = 0 ThenMsgBox 空统计, vbOKCancel + vbQuestionEndElseAdodc1.Recordset.MoveLastEnd IfEnd SubPrivate Sub Command7_Click()MDIForm1.Showfrmdengji.HideEnd Sub图书借阅和图书赔偿子窗体运行后图34和图35所表示,因为它们代码和图书登记子窗体代码雷同,在此不做反复。图34 图书借阅子窗体运行效果图35 图书赔偿子窗体运行效果(2)
22、 增加用户子窗体代码增加用户子窗体是用来增加用户用户名、密码和权限。其运行效果图36所表示。单击“确定”按钮后,还要返回一个信息框,提醒成功信息,图37所表示。 图36 增加用户子窗体运行效果 图37 成功信息框窗体部分代码思绪是,搜集输入表中字符串,然后和数据库中系统用户数据比较,假如不存在,则许可添加。Private Sub Command1_Click()Dim sql As StringDim rs_add As New ADODB.RecordsetIf Trim(Text1.Text) = ThenMsgBox 用户名不能为空, vbOKOnly + vbExclamation,
23、Exit SubText1.SetFocusElsesql = select * from 系统管理rs_add.Open sql, conn, 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 SubElser
24、s_add.MoveNextEnd IfWendIf Trim(Text2.Text) Trim(Text3.Text) ThenMsgBox 两次密码不一致, 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 Sub
25、Elsers_add.AddNewrs_add.Fields(0) = Text1.Textrs_add.Fields(1) = Text2.Textrs_add.Fields(2) = Combo1.Textrs_add.Updaters_add.Close下面是返回成功信息对话框代码:MsgBox 添加用户成功, vbOKOnly + vbExclamation, Unload MeEnd IfEnd IfEnd Sub(3) 修改密码子窗体代码修改密码子窗体是用来修改用户密码。其运行效果图38所表示。图38 修改密码子窗体运行效果在“确定”按钮Click事件中添加以下代码:Private
26、 Sub Command1_Click()Dim rs_chang As New ADODB.RecordsetDim sql As 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, adLockPessimist
27、icrs_chang.Fields(1) = Text1.Textrs_chang.Updaters_chang.CloseMsgBox 密码修改成功, vbOKOnly + vbExclamation, Unload MeEnd IfEnd Sub在上述代码中,首先比较两个表中数据是否一致,然后用rs_chang.Fields(1) = Text1.Text语句把代码输入到数据库中。最终,用MsgBox 密码修改成功, vbOKOnly + vbExclamation,语句弹出一个信息框,告诉修改成功,图39所表示。显示目录(4) 库房管理子窗体代码库房管理子窗体是用来管理图书资料。其运行效
28、果图40所表示。图40 库房管理子窗体实际上,设计库房管理子窗体程序代码和增加用户子窗体代码在思绪上是完全相同。就是在DataGrid文本框中显示图书进出清单,最终把填写明细存放到数据库中。检验代码以下: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 Su
29、b cmdexit_Click()Unload MeEnd SubPrivate Sub Form_Load()On 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
30、 = Truemodify = False 非修改状态showgrid2 = Falsedisplaygrid1 调用显示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.MoveFirst
31、Do While Not rs_data1.EOFMSFlexGrid1.Row = MSFlexGrid1.Row + 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 = MS
32、FlexGrid1.Col = 2If Not IsNull(rs_data1.Fields(2) Then MSFlexGrid1.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 MSFlexGri
33、d1.Text = rs_data1.Fields(4) ElseMSFlexGrid1.Text = MSFlexGrid1.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 Intege
34、rOn Error GoTo seterrorWith MSFlexGrid1.ScrollBars = flexScrollBarBoth.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.DescriptionE
35、nd SubPublic Sub setgridhead()On Error GoTo setheaderrorMSFlexGrid1.Row = 0MSFlexGrid1.Col = 0MSFlexGrid1.Text = 编号MSFlexGrid1.Col = 1MSFlexGrid1.Text = 购置日期MSFlexGrid1.Col = 2MSFlexGrid1.Text = 书名MSFlexGrid1.Col = 3MSFlexGrid1.Text = 类型MSFlexGrid1.Col = 4MSFlexGrid1.Text = 定价MSFlexGrid1.Col = 5MSFl
36、exGrid1.Text = 备注Exit Subsetheaderror:MsgBox Err.DescriptionEnd 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 无相关统计, vbO
37、KOnly + vbExclamation, Elseselect_row = MSFlexGrid1.TextMatrix(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
38、+ 1.Col = 0If Not IsNull(rs_data2.Fields(0) Then .Text = rs_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 Not IsNull(rs_data2.Fields(4) And CDbl(rs_data2.Fields(4) 0 Then.Text = -CDbl(rs_data2