赞
踩
图书管理系统
内容摘要(登陆用户: 密码:)
图书管理系统是采用Visual Basic6.0开发的一个数据库管理系统。开发本系统的基本步骤:需求分析、系统概念设计、系统逻辑和物理设计、系统实现和维护。在系统分析中先后用数据字典、数据流程、系统的功能结构图、ER图分析了系统所需的各种数据。在系统的设计过程中,我们采用了模块独立设计法,比较详细的展现了各个模块的功能。在库和表的设计当中, 我们力求层次清晰,设计简单实用。在系统具体实行阶段中,我们精心细致的画出了各个窗体并给出了相应的事件和代码,以实现各个窗体的作用。
开发环境:本图书管理开发系统是在Pentyum IV 以上机型的计算机上进行开发并获得通过的,同时方便系统开发,减少开发过程的难度,我们是基于以下的软件环境。
·以Windows XP为操作系统
·以Visual Basic6.0为开发工具
·以Access 2000作为后台数据库
功能概述:该系统界面友好,操作简便,能完成添加图书信息,修改图书信息,查询图书信息,添加读者类别,修改读者类别,查询读者信息,修改读者信息等一系列图书管理功能,开发本系统的总体任务是实现图书管理的系统化和自动化,帮助管理人员更好更高效地完成图书管理工作。本着实用性和介绍性的原则,整个系统由四大模块组成,每个大的模块又包括三至四个小的模块。
一、 图书管理部分:包括图书信息管理和类别管理,其功能是实现对各部分数据内容进行添加、修改、查询等操作。
二、 读者管理部分:包括读者信息管理和读者类别管理,其功能是实现对各部分数据内容的添加和修改等操作。
三、 借阅管理部分:包括借书管理和还书管理,其功能是实现对各部分数据内容的添加和查询等操作。
四、 系统管理部分:包括修改系统用户密码和增加新用户两项功能。
系统具有高效、易操作、易维护等特点,并且系统结构清晰、界面友好,功能较为齐全,能有效地协助管理人员进行图书管工作。如果想真正把它用到图书馆的图书自动化管理中,还需要读者对该系统进行一步的完善工作。
需求分析阶段确定的系统逻辑模型是以后设计和实现目标系统的基础,因此必须准确完整地体现用户的要求。
2.1.系统的数据字典
本系统的主要数据元素的数据字典卡片:
名字:读者信息查询报表 别名:读者信息表 描述:读者基本情况查询结果的信息表 定义:读者信息查询报表=读者编号+读者姓名+性别+类别+单位+住址+电话+登记日期+已借书数量 位置:输出到打印机 |
名字:图书信息查询报表 别名:图书信息表 描述:各种书籍查询基本信息表 定义:图书信息查询报表=图书编号+书名+类别+作者+出版社+出版日期+登记日期+是否被借出 位置:输出到打印机 |
2.2. 数据流程图
数据流程图(Data Flow DFD)是描述实际业务管理系统工作流程的一种图形表示法。它描绘系统的逻辑模型图,其中没有任何具体的物理元素,只是描绘信息在系统中流动和处理的情况。因为数据流图是逻辑系统的图形表示,即使不是专业的计算机技术人员也容易理解,所以是极好的通信工具。此外,设计数据流图只需考虑系统必须完成的基本逻辑功能,完全不需要考虑如何具体地实现这些功能,所以它也是软件设计的很好的出发点。《图书管理系统》主要是为了对图书、读者基本信息等进行计算机管理。下面就是对各个功能模块的流程分析:
1 图书类别管理基本信息流程图
流程图分析:图书类别基本信息的流动首先是以图书类别的编号为依据,来达到添加、修改、查询图书类别记录。同时,也对数据库中的图书类别表的编号进行检查。
2 图书信息管理基本信息流程图
流程图分析:图书基本信息的流动首先是以图书编号为流动方向的依据,来达到添加、修改、记录、删除图书记录。为了数据的一致性,进行这些操作的同时,也对数据库中的记录进行检查,检查是否有重复的记录。如有则不能进行添加。
3 读者类别管理基本信息流程图
流程图分析:读者类别基本信息的流动首先是以读者类别编号为流动方向的依据,来达到添加、修改、记录读者类别记录。为了数据的一致性,进行这些操作的同时,也对数据库中的记录进行检查,检查是否有重复的记录。如没有则可进行添加。
4 读者信息管理基本信息流程图
流程图分析:读者基本信息的流动首先是以读者的编号为依据,来达到添加、修改、查询、删除读者信息的记录。同时,也对数据库中的读者信息表的编号进行检查。
5借书管理基本信息流程图
流程图分析:借书管理基本信息的流动首先是以借阅编号为流动方向的依据,来达到添加、查询借书记录。为了数据的一致性,进行这些操作的同时,也对数据库中的记录进行检查,检查是否有重复的记录。如没有则可进行添加。
6 还书管理基本信息流程图
流程图分析:借阅管理部分是实现对各部分数据内容的添加和查询操作,在借阅信息中包括借阅编号、读者编号、读者姓名、书籍名称、出借日期和还书日期。并通过添加功能来达到借阅信息表的数据的更新,通过查询可使管理员很快地了解借阅信息,从而避免书籍的丢失现象产生。
通过上面对各个模块流程的分析,那么我们就不难对整个系统的大致流程有一个全面的认识。设计时采用了常用的自顶向下的瀑布式结构化设计方法。各子系统具有独立的数据库结构,同时又具有相关的关键字,这样系统做起来后就便于用户操作。综合上面各个模块的流程分析,其总体流程图如下:
2.3.系统的概念设计
概念设计阶段主要任务和目标是根据需求分析的结果,包括一般联系实体,画出对应的ER图。对于复杂的系统,通常首先要对它的各功能模进行分析,然后再把它的功能结构图画出来,便是设计和优 化。功能分析之后,再根据各个岗位、各个用户对数据和使用权限的不同要求作出局部ER图,然后再把各个局部ER图综合起来形成统一的整体ER图。
3.1模块功能分析
图书管理部分:包括图书信息管理和类别管理,其功能是实现对各部分数据内容进行添加、修改、查询等操作。各管理部分的明细如下:
(1)图书信息管理:包括图书信息的添加、图书信息的修改、图书信息的查询和图书的信息删除4部分。其中,图书信息包括图书编号、书名、图书类别、作者、出版社、出版日期、登记日期以及是否已被借出。
(2)图书类别管理:包括图书类别的添加、图书类别的修改、图书类别的删除3部分功能。其中,图书类别包括类别名称和类别编号两部分。
借阅管理部分:包括借书管理和还书管理,其功能是实现对各部分数据内容的添加和查询等操作。各管理部分的明细如下:
(1)借书管理:包括添加借书信息和查询借书信息2部分功能。其中,借阅信息包括借阅编号、读者编号、读者姓名、图书编号、图书名称、出借日期和还书日期。
(2)还书管理:实现添加还书信息功能。其中,还书信息与借阅信息部分明细相同。
读者管理部分:包括读者信息管理和读者类别管理,其功能是实现对各部分数据内容的添加和修改、删除等操作。各管理部分的明细如下:
(1)读者信息管理:包括读者信的添加、读者信息的修改、读者信息的查询和读者信息的删除4部分功能。其中,读者信息包括读者姓名、读者编号、性别、读者类别、工作单位、家庭住址、电话号码、登记日期和已借书数量。
(2)读者类别管理:包括读者类别的添加、读者类别的修改、读者类别的删除3部分功能。其中,读者类别包括各种类名称、借书期限和有效期限4部分。
系统管理部分:包括修改系统用户密码、增加新用户和退出系统三项功能。系统初始设置一个超级用户名和密码,操作人员可以利用这个超级用户名和密码登录,之后,可以设置其他的超级用户名称,也可以设置权限用户,同时也设置了这个用户可以使用的权限。
3.2系统功能结构图
3.3系统ER图的设计
数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率以及实现的效果产生影响。合理的数据库结构设计可以提高数据存储的效率,保证数据的完整和一致。同时,合理的数据库结构也将有利于程序的实现。设计数据库系统时应该首先充分了解用户各个方面的需求,包括现有的以及将来可能增加的需求。
针对图书管理系统的需求,通过对图书管理系统流程分析,设计此系统需要如下面所示的数据项和数据结构:
图书信息:包括的数据项有:图书编号、书名、图书类别、作者出版社、出版日期、登记日期
读者信息:包括的数据项有:读者姓名、编号、性别、读者类别、工作单位、家庭住址、电话号码、登记日期和已借书数量
图书借阅信息:包括的数据项有:借阅编号、读者编号、读者姓名、图书编号、图书名称、出借日期和还书日期。
在概念设计阶段中,设计人员从用户的角度看待数据及处理要求和约束,产生一个反映用户观点的概念模式。然后再把概念模式转换成逻辑模式。将概念设计从设计过程中独立开来,使各阶段的任务相对单一化,设计复杂程度大大降低,不受特定DBMS的限制。
利用ER方法进行数据库的概念设计,可分成三步进行:首先设计局部ER模式,然后把各局部ER模式综合成一个全局模式,最后对全局ER模式进行优化,得到最终的模式,即概念模式。
ER模型的“联系”用于刻画实体之间的关联。一种完整的方式是对局部结构中任意两个实体类型,依据需求分析的结果,考察局部结构中任意两个实体类型之间是否存在联系。若有联系,进一步确定是1:N,M:N,还是1:1等。还要考察一个实体类型内部是否存在联系,两个实体类型之间是否存在联系,多个实体类型之间是否存在联系,等等。
所有局部ER模式都设计好了后,接下来就是把它们综合成单一的全局概念结构。全局概念结构不仅要支持所有局部ER模式,而且必须合理地表示一个完整、一致的数据库概念结构。
1)确定公共实体类型
为了给多个局部ER模式的合并提供开始合并的基础,首先要确定各局部结构中的公共实体类型。在这一步中我们仅根据实体类型名和键来认定公共实体类型。一般把同名实体类型作为公共实体类型的一类候选,把具有相同键的实体类型作为公共实体类型的另一类候选。
2)局部ER模式的合并
合并的原则是:首先进行两两合并;先和合并那些现实世界中有联系的局部结构;合并从公共实体类型开始,最后再加入独立的局部结构。
3)消除冲突
冲突分为三类:属性冲突、结构冲突、命名冲突。设计全局ER模式的目的不在于把若干局部ER模式形式上合并为一个ER模式,而在于消除冲突,使之成为能够被所有用户共同理解和接受的同一的概念模型。
3)全局ER模式的优化
在得到全局ER模式后,为了提高数据库系统的效率,还应进一步依据处理需求对ER模式进行优化。一个好的全局ER模式,除能准确、全面地反映用户功能需求外,还应满足下列条件:实体类型的个数要尽可能的少;实体类型所含属性个数尽可能少;实体类型间联系无冗余。
根据上述所示得出本系统的全局ER图如下:
2.3. 系统逻辑和物理设计
2.3.1数据库的设计
根据上面的数据库ER图,现在需要将上面的数据库概念结构转化为SQL Server2000数据库系统所支持的实际数据模型,也就是数据库的逻辑结构。在上面的实体以及实体之间关系的基础上,形成数据库中的表格以及各个表格之间的关系。图书管理信息系统数据库中各个表格的设计结果如下面的几个表格所示。每个表格表示在数据库中的一个表。
1.图书类别表
字段名 | 数据类型 | 说明 |
类别名称 | 文本 | 必添字段“是”,允许空字符为“否” |
类别编号 | 文本 | 必添字段“是”,允许空字符为“否” |
2.图书信息表
字段名 | 数据类型 | 说明 |
图书编号 | 文本 | 必添字段“是”,允许空字符为“否” |
书名 | 文本 | 必添字段“是”,允许空字符为“否” |
类别 | 文本 | 字段大小50 |
作者 | 文本 | 字段大小50 |
出版社 | 文本 | 字段大小50 |
出版日期 | 日期/时间 | 无 |
登记日期 | 日期/时间 | 无 |
是否借出 | 文本 | 字段大小2 |
3.借阅信息表
字段名 | 数据类型 | 说明 |
借阅编号 | 自动编号 | 无 |
读者编号 | 文本 | 字段大小50 |
读者姓名 | 文本 | 字段大小50 |
图书编号 | 文本 | 字段大小50 |
图书名称 | 文本 | 字段大小50 |
出借日期 | 日期/时间 | 无 |
4.读者信息表
字段名 | 数据类型 | 说明 |
读者姓名 | 文本 | 必添字段“是”,允许空字符为“否” |
读者编号 | 文本 | 必添字段“是”,允许空字符为“否” |
性别 | 文本 | 字段大小2 |
读者类别 | 文本 | 字段大小50 |
工作单位 | 文本 | 字段大小50 |
家庭住址 | 文本 | 字段大小50 |
电话号码 | 文本 | 字段大小50 |
登记日期 | 日期/时间 | 无 |
已借数量 | 数字 | 无 |
5.读者类别表
字段名 | 数据类型 | 说明 |
种类名称 | 文本 | 必添字段“是”,允许空字符为“否” |
借书数量 | 数字 | 无 |
借书期限 | 数字 | 无 |
有限期限 | 数字 | 无 |
2.3.2数据库的维护
由于应用环境不断变化,数据库运行过和中物理存储也会不断变化,对数据库设计进行调整,修改等维护工作是设计工作的继续和提高。对数据库经常性的维护工作主要包括:
1. 数据库的转储和恢复
针对不同的应用要求制定不同的转储计划,保证一旦发生故障能尽快将数据库恢复到某种一致的状态,尽可能减少对数据库的破坏。
2. 数据库的安全性、完整性控制
在数据库运行过程中由于应用环境的变化,对安全性的要求也会发生变化,如原来机密的数据现在可以公开查询了,新加入的数据又可能是机密的了。系统中用户的密级改变。这都需要根据实际情况修改原有的安全性控制,可以设置数据库密码及用户权限。同样,数据库的完整性的约束条件也会变化,需要DBA不断修正。
3. 数据库性能的监督、分析和改造
利用Microsoft SQL Server2000提供的检测系统性能参数的工具,在数据库运行过程中,监督数据进行分析,找出改进系统性能的方法,并做适当调整。
4. 数据库的重组及重构造
数据库运行一段时间后,由于记录不断增、删、改,增添、修改的数据不能为空,否则不能保存到数据库中。使数据库的物理存储情况变坏,降低了数据的存取效率,数据库性能下降,这时DBA要对数据库进行重组织,或部分重组织(只对频繁增、删的表进行重组织),可以利用Microsoft SQL Server2000专门提供的数据重组织实用程序操作,按原设计要求重新安排存储位置、回收垃圾、减少指针链等,提高系统性能。
有些情况,如由于数据库应用环境发生变化,增加了新的应用或新的实体,取消了某些应用,有的实体与实体间的联系发生变化,则需要调整数据库的模式及内模式。
4.3功能模块的实现
数据库设计
这里的数据库采用Access,用ADO作为连接数据对象。
1、建立Access 数据库
启动Access,建立一个空的数据库book.mdb,如图3所示。
使用程序设计器建立系统需要的表格如下。
图书登记表,如图4所示。
图3建立数据库book.mdb 图4 图书登记表
图书借阅表,如图5所示。
图5 图书借阅表
图书资料表,如图6所示。系统管理表,如图7所示。
图6 图书资料表
图7 系统管理表
。
2、连接数据
在Visual Basic环境下,选择“工程”→“引用”命令,在随后出现的对话框中选择“Microsoft ActiveX Data Objects 2.0 Library”,然后单击“确定”按钮,如图8所示。
图8用ADO连接数据库
在程序设计的公共模块中,先定义ADO连接对象。语句如下:
Public conn As New ADODB.Connection ’ 标记连接对象
然后在子程序中,用如下的语句即可打开数据库:
Dim connectionstring As String
connectionstring = "provider=Microsoft.Jet.oledb.4.0;" &_
"data source=book.mdb"
conn.Open connectionstring
3、设置ODBC
VB的ADO对象是通过ODBC来访问数据库,所以还要建立ODBC数据引擎接口。
打开控制面板中的“管理工具”→“数据源”(ODBC),出现如图9所示的对话框。
图9DBC对话框
单击“添加”按钮,出现“创建新数据源”对话框,如图10。
图10创建新数据源”对话框
选择Microsoft Access Driver(*.mdb),单击“完成”按钮,出现如图11对话框。
图11置连接数据源
在“数据源名”文本框中添加一个名字,单击“确定”按钮完成系统默认连接设置。然后在ODBC对话框中单击“确定”按钮完成ODBC设置。
界面设计
设计好的界面如图12所示。
图12 图书管理系统界面
这是一个多文档界面(MDI)应用程序,可以同时显示多个文档,每个文档显示在各自的窗体中。MDI 应用程序中常有包含子菜单的“窗体”选项,用于在窗体或文档之间进行切换。
菜单应用程序中,有5个菜单选项,每个选项对应着E-R图的一个子项目。
1、创建主窗体 首先创建一个工程,命名为图书管理系统,选择“工程”→“添加MDI窗体”命令,则在项目中添加了主窗体。该窗体的一些属性如表1所示。
表1 主窗体的属性
属 | 性值 |
Caption | 图书管理系统 |
Name | Main |
Menu | Mainmenu1 |
Windowstate | Maxsize |
Windowstate的值为Maxsize,即程序启动之后自动最大化。
将“菜单”组件从“工具箱”拖到窗体上。创建一个 Text 属性设置为“文件”的顶级菜单项,且带有名为“关闭”的子菜单项。类似地创建一些菜单项,如表2所示。
表2 菜 单 项 表
菜 单 名 称 | Text属性 | 功 能 描 述 |
MenuItem1 | 图书管理 | 顶级菜单,包含子菜单 |
MenuItem2 | 图书类别 | 调出图书登记窗体 |
MenuItem3 | 图书信息 | 调出图书借阅窗体 |
MenuItem4 | 图书资料 | 顶级菜单,包含子菜单 |
MenuItem5 | 查询输出 | 调出查询输出窗体 |
MenuItem6 | 系统管理 | 顶级菜单,包含子菜单 |
MenuItem7 | 增加用户 | 调出用户窗体 |
MenuItem8 | 修改密码 | 调出密码窗体 |
MenuItem9 | 退出 | 系统退出 |
2、创建各子窗体
选择“工程”→“添加窗体”命令,添加子窗体。
在新建Visual Basic工程时自带的窗体中,将其属性MIDChild改成True,则这个窗体成为MID窗体的子窗体。
在这个项目中,要创建的子窗体如表3所示。
表3 所有子窗体
子 窗 体 名 | Text |
图书登记 | frmdengji |
图书借阅 | frmjieyue |
增加新用户 | frmadduser |
查询输出 | frmfind |
登录系统 | frmlogin |
修改密码 | frmchangepwd |
下面分别给出这些子窗体,以及它们所使用的控件。
(1) 图书登记子窗体控件如表4所示。
表4 图书登记子窗体控件
控 件 类 别 | 控件Name | 控件Text |
Label | Label1 | 编号 |
Label2 | 书名 | |
Label3 | 类型 | |
Label4 | 购买日期 | |
Label5 | ||
TextBox | Text1 | (空) |
Text2 | (空) | |
Text3 | (空) | |
Text4 | (空) | |
Text5 | (空) | |
CommandButton | Command1 | |
Command2 | ||
ADO | DataAdodc1 | (空) |
DataGrid | DataGrid1 | (空) |
图书借阅和图书赔偿子窗体分别,因为它们的控件与图书登记子窗体的雷同,在此不作介绍。
(2) 增加用户子窗体如图13所示,其控件如表5所示。
图13 增加用户子窗体
表5 增加用户子窗体控件
控 件 类 别 | 控件Name | 控件Text |
Label | Label1 | 输入用户名 |
Label2 | 输入密码 | |
Label3 | 确认密码 | |
TextBox | Text1 | (空) |
Text2 | (空) | |
Text3 | (空) | |
ComboBox | Comb1 | 选择权限 |
CommandButton | Commandl | 确定 |
Command2 | 取消 |
(3) 修改密码子窗体如图14所示。
图14 修改密码子窗体
(4) 用户登录子窗体如图15所示。
图15 用户登录子窗体
(5) 添加读者类别如图16,其控件如表9所示。
图16
建立公共模块
1、显示目录
建立公共模块可以提高代码的效率,同时使得修改和维护代码都很方便。
创建公共模块的步骤如下:
(1) 在菜单中选择“工程”→“添加模块”命令,则出现模块对话框,如图18所示。
(2) 选择模块图标后,单击“打开”按钮,则模块已经添加到项目中了。默认情况下名为Module1。
图17 模块对话框
(3) 在模块中定义整个项目的公共变量。
Public conn As New ADODB.Connection ’ 标记连接对象
Public userID As String ’ 标记当前用户ID
Public userpow As String ’ 标记用户权限
Public find As Boolean ’ 标记查询
Public sqlfind As String ’ 查询语句
Public rs_data1 As New ADODB.Recordset
Public findok As Boolean
Public frmdata As Boolean
Public Const keyenter = 13 ’ enter键的ASCII码
在主窗体添加完菜单之后,就要为各个子菜单创建事件处理程序。
主窗体代码
在本项目中,子菜单事件都是Click事件,这里先给出主窗体部分的代码。
下面是响应“增加用户”子菜单Click事件,调出增加用户窗体代码。
Private Sub add_admin_Click()
frmadduser.Show
End Sub
Private Sub add_back_book_Click()
frmbackbookinfo.Show
End Sub
Private Sub add_book_info_Click()
frmaddbookinfo.Show
End Sub
Private Sub add_book_style_Click()
frmaddbookstyle.Show
End Sub
Private Sub add_lend_book_Click()
frmfindbook.Show
End Sub
Private Sub add_reader_info_Click()
frmaddreaderinfo.Show
End Sub
Private Sub add_reader_style_Click()
frmaddreaderstyle.Show
End Sub
Private Sub change_pwd_Click()
frmchangepwd.Show
End Sub
Private Sub del_book_info_Click()
frmmodifybookinfo.Show
End Sub
Private Sub del_book_style_Click()
frmmodifybookstyle.Show
End Sub
Private Sub del_reader_info_Click()
frmreaderinfo.Show
End Sub
Private Sub del_reader_style_Click()
frmmodifyreaderstyle.Show
End Sub
Private Sub exit_sys_Click()
End
End Sub
Private Sub find_book_info_Click()
frmfindbook.Show
End Sub
Private Sub find_lend_book_Click()
frmfindborrowinfo.Show
End Sub
Private Sub find_reader_info_Click()
frmfindreader.Show
End Sub
Private Sub Form_Load()
End Sub
Private Sub modify_book_info_Click()
frmmodifybookinfo.Show
End Sub
Private Sub modify_book_style_Click()
frmmodifybookstyle.Show
End Sub
Private Sub modify_reader_info_Click()
frmreaderinfo.Show
End Sub
Private Sub modify_reader_style_Click()
frmmodifyreaderstyle.Show
End Sub
2、各子窗体的代码
(1) 图书登记子窗体代码
本窗体用来填写图书登记的信息,用ADO来连接数据库,是本窗体的重点。采用MDI的子程序,所以运行后,它出现在主程序的界面下,如图18所示。
图18 图书登记子窗体
按钮控件要求先填写基本信息,然后与数据库信息比较。
Option Explicit
Private Sub Command1_Click()
Dim rs_addbook As New ADODB.Recordset
Dim sql As String
If Trim(Combo1.Text) = "" Then
MsgBox "请选择图书种类", vbOKOnly + vbExclamation, ""
Combo1.SetFocus
Exit Sub
End If
If Trim(Text1.Text) = "" Then
MsgBox "图书编号不能为空", vbOKOnly + vbExclamation, ""
Text1.SetFocus
Exit Sub
End If
If Trim(Text2.Text) = "" Then
MsgBox "书名不能为空", vbOKOnly + vbExclamation, ""
Text2.SetFocus
Exit Sub
End If
If Not IsDate(Text5.Text) Then
MsgBox "请按照yyyy-mm-dd格式输入日期", vbOKOnly + vbExclamation, ""
Text5.SetFocus
Exit Sub
End If
If Not IsDate(Text6.Text) Then
MsgBox "请按照yyyy-mm-dd格式输入日期", vbOKOnly + vbExclamation, ""
Text6.SetFocus
Exit Sub
End If
sql = "select * from 书籍信息 where 书籍编号='" & Text1.Text & "'"
rs_addbook.Open sql, conn, adOpenKeyset, adLockPessimistic
If rs_addbook.EOF Then
rs_addbook.AddNew
rs_addbook.Fields(0) = Trim(Text1.Text)
rs_addbook.Fields(1) = Trim(Text2.Text)
rs_addbook.Fields(2) = Trim(Combo1.Text)
rs_addbook.Fields(3) = Trim(Text3.Text)
rs_addbook.Fields(4) = Trim(Text4.Text)
rs_addbook.Fields(5) = Trim(Text5.Text)
rs_addbook.Fields(6) = Trim(Text6.Text)
rs_addbook.Fields(7) = "否"
rs_addbook.Update
MsgBox "添加书籍信息成功!", vbOKOnly, ""
rs_addbook.Close
Else
MsgBox "图书编号重复!", vbOKOnly + vbExclamation, ""
Text1.SetFocus
Text1.Text = ""
rs_addbook.Close
Exit Sub
End If
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Form_Load()
Dim rs_leibie As New ADODB.Recordset
Dim sql As String
sql = "select * from 图书类别"
rs_leibie.Open sql, conn, adOpenKeyset, adLockPessimistic
rs_leibie.MoveFirst
Do While Not rs_leibie.EOF
Combo1.AddItem rs_leibie.Fields(0)
rs_leibie.MoveNext
Loop
rs_leibie.Close
End Sub
Private Sub Frame1_DragDrop(Source As Control, X As Single, Y As Single)
End Sub 图书借阅子窗体运行后如图19所示,因为它们的代码和图书登记子窗体的代码雷同,在此不做重复。
图19 图书借阅子窗体运行效果
(2) 增加用户子窗体代码
增加用户子窗体是用来增加用户的用户名、密码和权限的。
单击“确定”按钮后,还要返回一个信息框,提示成功信息,如图20所示。
图20 增加用户子窗体运行效果
信息框
窗体部分代码的思路是,收集输入的表中的字符串,然后与数据库中的系统的用户数据比较,如果不存在,则允许添加。
Private Sub Command1_Click()
Dim sql As String
Dim rs_add As New ADODB.Recordset
If Trim(Text1.Text) = "" Then
MsgBox "用户名不能为空", vbOKOnly + vbExclamation, ""
Exit Sub
Text1.SetFocus
Else
sql = "select * from 系统管理"
rs_add.Open sql, conn, adOpenKeyset, adLockPessimistic
While (rs_add.EOF = False)
If Trim(rs_add.Fields(0)) = Trim(Text1.Text) Then
MsgBox "已有这个用户", vbOKOnly + vbExclamation, ""
Text1.SetFocus
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Combo1.Text = ""
Exit Sub
Else
rs_add.MoveNext
End If
Wend
If Trim(Text2.Text) <> Trim(Text3.Text) Then
MsgBox "两次密码不一致", vbOKOnly + vbExclamation, ""
Text2.SetFocus
Text2.Text = ""
Text3.Text = ""
Exit Sub
ElseIf Trim(Combo1.Text) <> "system" And Trim(Combo1.Text) <> "guest" Then
MsgBox "请选择正确的用户权限", vbOKOnly + vbExclamation, ""
Combo1.SetFocus
Combo1.Text = ""
Exit Sub
Else
rs_add.AddNew
rs_add.Fields(0) = Text1.Text
rs_add.Fields(1) = Text2.Text
rs_add.Fields(2) = Combo1.Text
rs_add.Update
rs_add.Close
MsgBox "添加用户成功", vbOKOnly + vbExclamation, ""
Unload Me
End If
End If
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Form_Load()
Combo1.AddItem "system"
Combo1.AddItem "guest"
End Sub
(3) 修改密码子窗体代码
修改密码子窗体是用来修改用户密码的。
图21修改密码子窗体运行效果
在“确定”按钮的Click事件中添加如下代码:
Private Sub Command1_Click()
Dim rs_chang As New ADODB.Recordset
Dim sql As String
If Trim(Text1.Text) <> Trim(Text2.Text) Then
MsgBox "密码不一致!", vbOKOnly + vbExclamation, ""
Text1.SetFocus
Text1.Text = ""
Text2.Text = ""
Else
sql = "select * from 系统管理 where 用户名=’" & userID & "’"
rs_chang.Open sql, conn, adOpenKeyset, adLockPessimistic
rs_chang.Fields(1) = Text1.Text
rs_chang.Update
rs_chang.Close
MsgBox "密码修改成功", vbOKOnly + vbExclamation, ""
Unload Me
End If
End Sub
图22
在上述代码中,首先比较两个表中的数据是否一致,然后用rs_chang.Fields(1) = Text1.Text语句把代码输入到数据库中。最后,用MsgBox "密码修改成功", vbOKOnly + vbExclamation,""语句弹出一个信息框,告诉修改成功,如图22所示。
(4) 查询子窗体代码
查询子窗体是用来查询库房中图书资料明细的。其运行效果如图23所示。
图23 查询子窗体运行效果
Option Explicit
Dim panduan As String
Private Sub Command1_Click()
Dim rs_findbook As New ADODB.Recordset
Dim sql As String
If Check1.Value = vbChecked Then
sql = "书名='" & Trim(Text1.Text & " ") & "'"
End If
If Check2.Value = vbChecked Then
If Trim(sql) = "" Then
sql = "类别='" & Trim(Combo1.Text & " ") & "'"
Else
sql = sql & "and 书名='" & Trim(Combo1.Text & " ") & "'"
End If
End If
If Check3.Value = vbChecked Then
If Trim(sql) = "" Then
sql = "作者='" & Trim(Text2.Text & " ") & "'"
Else
sql = sql & "and 作者='" & Trim(Text2.Text & " ") & "'"
End If
End If
If Check4.Value = vbChecked Then
If Trim(sql) = "" Then
sql = "出版社='" & Trim(Text3.Text & " ") & "'"
Else
sql = sql & "and 出版社='" & Trim(Text3.Text & " ") & "'"
End If
End If
If Check5.Value = vbChecked Then
If Trim(sql) = "" Then
sql = "书籍编号='" & Trim(Text4.Text & " ") & "'"
Else
sql = sql & "and 书籍编号='" & Trim(Text4.Text & " ") & "'"
End If
End If
If Trim(sql) = "" Then
MsgBox "请选择查询方式!", vbOKOnly + vbExclamation
Exit Sub
End If
sql = "select * from 书籍信息 where " & sql
rs_findbook.CursorLocation = adUseClient
rs_findbook.Open sql, conn, adOpenKeyset, adLockPessimistic
DataGrid1.AllowAddNew = False
DataGrid1.AllowDelete = False
DataGrid1.AllowUpdate = False
Set DataGrid1.DataSource = rs_findbook
'rs_findbook.Close
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Command3_Click()
If Trim(book_num) = "" Then
MsgBox "请选择要借阅的图书!", vbOKOnly + vbExclamation
Exit Sub
End If
If panduan = "是" Then
MsgBox "此书已被借出!", vbOKOnly + vbExclamation
Exit Sub
End If
frmborrowbook.Show
End Sub
Private Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
book_num = DataGrid1.Columns(0).CellValue(DataGrid1.Bookmark)
panduan = DataGrid1.Columns(7).CellValue(DataGrid1.Bookmark)
End Sub
Private Sub Form_Load()
Dim rs_find As New ADODB.Recordset
Dim sql As String
sql = "select * from 图书类别"
rs_find.Open sql, conn, adOpenKeyset, adLockPessimistic
rs_find.MoveFirst
If Not rs_find.EOF Then
Do While Not rs_find.EOF
Combo1.AddItem rs_find.Fields(0)
rs_find.MoveNext
Loop
Combo1.ListIndex = 0
End If
rs_find.Close
End Sub
查询完毕后,输出查询结果,如图24所示。
显示目录
(6) 用户登录子窗体代码
在本项目中,用户登录子窗体是运行的第一个界面,它的作用是检查用户名和密码是否正确。由于用户的资料是存放在数据库中,所以在启动该子窗体时,就已经连接了数据库。其代码如下:
Private Sub Form_Load()
Dim connectionstring As String
connectionstring = "provider=Microsoft.Jet.oledb.4.0;" & _
"data source=book.mdb"
conn.Open connectionstring
cnt = 0
End Sub
“确定”按钮的作用是检查输入的数据是否与数据库中的数据一致。
Private Sub Command1_Click()
Dim sql As String
Dim rs_login As New ADODB.Recordset
If Trim(txtuser.Text) = "" Then ’ 判断输入的用户名是否为空
MsgBox "没有这个用户", vbOKOnly + vbExclamation, ""
txtuser.SetFocus
Else
sql = "select * from 系统管理 where 用户名=’" & txtuser.Text & "’"
rs_login.Open sql, conn, adOpenKeyset, adLockPessimistic
If rs_login.EOF = True Then
MsgBox "没有这个用户", vbOKOnly + vbExclamation, ""
txtuser.SetFocus
Else ’ 检验密码是否正确
用户名和密码通过后,要关闭本窗体并打开主窗体。
If Trim(rs_login.Fields(1)) = Trim(txtpwd.Text) Then
userID = txtuser.Text
userpow = rs_login.Fields(2)
rs_login.Close
Unload Me
MDIForm1.Show
Else
MsgBox "密码不正确", vbOKOnly + vbExclamation, ""
txtpwd.SetFocus
End If
End If
End If
’ 只能输入3次
cnt = cnt + 1
If cnt = 3 Then
Unload Me
End If
Exit Sub
End Sub
(7)查询借书信息如图25
如图27
代码如下:
Option Explicit
Private Sub Command1_Click()
Dim sql As String
Dim rs_find As New ADODB.Recordset
If Option1.Value = True Then
sql = "select * from 书籍信息 where 是否被借出='是'"
End If
If Option2.Value = True Then
sql = "select * from 书籍信息 where 是否被借出='否'"
End If
If Option3.Value = True Then
sql = "select * from 借阅信息 where 读者姓名='" & Text1.Text & "'"
End If
rs_find.CursorLocation = adUseClient
rs_find.Open sql, conn, adOpenKeyset, adLockPessimistic
DataGrid1.AllowAddNew = False
DataGrid1.AllowDelete = False
DataGrid1.AllowUpdate = False
Set DataGrid1.DataSource = rs_find
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Frame2_DragDrop(Source As Control, X As Single, Y As Single)
End Sub
此板块,可以查询已经借出的书,没有借出的书,也可以按读者姓名查询!!!
(8)还书信息如图26
如图26
代码如下:
Option Explicit
Dim findform As Boolean
Private Sub Combo1_Click()
Combo2.ListIndex = Combo1.ListIndex
End Sub
Private Sub Combo2_Click()
Combo1.ListIndex = Combo2.ListIndex
End Sub
Private Sub Combo3_Click()
Combo4.ListIndex = Combo3.ListIndex
End Sub
Private Sub Combo4_Click()
Combo3.ListIndex = Combo4.ListIndex
End Sub
Private Sub Command1_Click()
Dim rs_reader As New ADODB.Recordset
Dim sql As String
findform = True
sql = "select * from 借阅信息 where 读者姓名='" & Combo2.Text & "'"
rs_reader.CursorLocation = adUseClient
rs_reader.Open sql, conn, adOpenKeyset, adLockPessimistic
Set DataGrid1.DataSource = rs_reader
DataGrid1.AllowAddNew = False
DataGrid1.AllowDelete = False
DataGrid1.AllowUpdate = False
End Sub
Private Sub Command2_Click()
Dim rs_book As New ADODB.Recordset
Dim sql As String
findform = False
sql = "select * from 借阅信息 where 书籍编号='" & Combo3.Text & "'"
rs_book.CursorLocation = adUseClient
rs_book.Open sql, conn, adOpenKeyset, adLockPessimistic
Set DataGrid1.DataSource = rs_book
DataGrid1.AllowAddNew = False
DataGrid1.AllowDelete = False
DataGrid1.AllowUpdate = False
End Sub
Private Sub Command3_Click()
Dim book_num As String
Dim reader_num As String
Dim answer As String
Dim rs_back As New ADODB.Recordset
Dim sql As String
On Error GoTo delerror
book_num = DataGrid1.Columns(3).CellValue(DataGrid1.Bookmark)
reader_num = DataGrid1.Columns(1).CellValue(DataGrid1.Bookmark)
answer = MsgBox("确定要还这本书吗?", vbYesNo, "")
If answer = vbYes Then
sql = "select * from 借阅信息 where 书籍编号='" & book_num & "'"
rs_back.CursorLocation = adUseClient
rs_back.Open sql, conn, adOpenKeyset, adLockPessimistic
rs_back.Delete
rs_back.Update
rs_back.Close
sql = "select * from 书籍信息 where 书籍编号='" & book_num & "'"
rs_back.CursorLocation = adUseClient
rs_back.Open sql, conn, adOpenKeyset, adLockPessimistic
rs_back.Fields(7) = "否"
rs_back.Update
rs_back.Close
sql = "select * from 读者信息 where 读者编号='" & reader_num & "'"
rs_back.CursorLocation = adUseClient
rs_back.Open sql, conn, adOpenKeyset, adLockPessimistic
rs_back.Fields(8) = rs_back.Fields(8) - 1
rs_back.Update
rs_back.Close
If findform = True Then
Command1_Click
Else
Command2_Click
End If
MsgBox "成功删除!", vbOKOnly + vbExclamation, ""
DataGrid1.AllowDelete = False
Else
Exit Sub
End If
delerror:
If Err.Number <> 0 Then
MsgBox Err.Description
End If
End Sub
Private Sub Command4_Click()
Unload Me
End Sub
Private Sub Form_Load()
Dim rs_reader As New ADODB.Recordset
Dim rs_book As New ADODB.Recordset
Dim sql As String
sql = "select * from 读者信息"
rs_reader.CursorLocation = adUseClient
rs_reader.Open sql, conn, adOpenKeyset, adLockPessimistic
If Not rs_reader.EOF Then
Do While Not rs_reader.EOF
Combo1.AddItem rs_reader.Fields(1)
Combo2.AddItem rs_reader.Fields(0)
rs_reader.MoveNext
Loop
End If
rs_reader.Close
sql = "select * from 借阅信息"
rs_book.CursorLocation = adUseClient
rs_book.Open sql, conn, adOpenKeyset, adLockPessimistic
If Not rs_book.EOF Then
Do While Not rs_book.EOF
Combo3.AddItem rs_book.Fields(3)
图书管理系统
内容摘要(登陆用户: 密码:)
图书管理系统是采用Visual Basic6.0开发的一个数据库管理系统。开发本系统的基本步骤:需求分析、系统概念设计、系统逻辑和物理设计、系统实现和维护。在系统分析中先后用数据字典、数据流程、系统的功能结构图、ER图分析了系统所需的各种数据。在系统的设计过程中,我们采用了模块独立设计法,比较详细的展现了各个模块的功能。在库和表的设计当中, 我们力求层次清晰,设计简单实用。在系统具体实行阶段中,我们精心细致的画出了各个窗体并给出了相应的事件和代码,以实现各个窗体的作用。
开发环境:本图书管理开发系统是在Pentyum IV 以上机型的计算机上进行开发并获得通过的,同时方便系统开发,减少开发过程的难度,我们是基于以下的软件环境。
·以Windows XP为操作系统
·以Visual Basic6.0为开发工具
·以Access 2000作为后台数据库
功能概述:该系统界面友好,操作简便,能完成添加图书信息,修改图书信息,查询图书信息,添加读者类别,修改读者类别,查询读者信息,修改读者信息等一系列图书管理功能,开发本系统的总体任务是实现图书管理的系统化和自动化,帮助管理人员更好更高效地完成图书管理工作。本着实用性和介绍性的原则,整个系统由四大模块组成,每个大的模块又包括三至四个小的模块。
一、 图书管理部分:包括图书信息管理和类别管理,其功能是实现对各部分数据内容进行添加、修改、查询等操作。
二、 读者管理部分:包括读者信息管理和读者类别管理,其功能是实现对各部分数据内容的添加和修改等操作。
三、 借阅管理部分:包括借书管理和还书管理,其功能是实现对各部分数据内容的添加和查询等操作。
四、 系统管理部分:包括修改系统用户密码和增加新用户两项功能。
系统具有高效、易操作、易维护等特点,并且系统结构清晰、界面友好,功能较为齐全,能有效地协助管理人员进行图书管工作。如果想真正把它用到图书馆的图书自动化管理中,还需要读者对该系统进行一步的完善工作。
需求分析
需求分析阶段确定的系统逻辑模型是以后设计和实现目标系统的基础,因此必须准确完整地体现用户的要求。
2.1.系统的数据字典
本系统的主要数据元素的数据字典卡片:
名字:读者信息查询报表 别名:读者信息表 描述:读者基本情况查询结果的信息表 定义:读者信息查询报表=读者编号+读者姓名+性别+类别+单位+住址+电话+登记日期+已借书数量 位置:输出到打印机 |
名字:图书信息查询报表 别名:图书信息表 描述:各种书籍查询基本信息表 定义:图书信息查询报表=图书编号+书名+类别+作者+出版社+出版日期+登记日期+是否被借出 位置:输出到打印机 |
2.2. 数据流程图
数据流程图(Data Flow DFD)是描述实际业务管理系统工作流程的一种图形表示法。它描绘系统的逻辑模型图,其中没有任何具体的物理元素,只是描绘信息在系统中流动和处理的情况。因为数据流图是逻辑系统的图形表示,即使不是专业的计算机技术人员也容易理解,所以是极好的通信工具。此外,设计数据流图只需考虑系统必须完成的基本逻辑功能,完全不需要考虑如何具体地实现这些功能,所以它也是软件设计的很好的出发点。《图书管理系统》主要是为了对图书、读者基本信息等进行计算机管理。下面就是对各个功能模块的流程分析:
1 图书类别管理基本信息流程图
流程图分析:图书类别基本信息的流动首先是以图书类别的编号为依据,来达到添加、修改、查询图书类别记录。同时,也对数据库中的图书类别表的编号进行检查。
2 图书信息管理基本信息流程图
流程图分析:图书基本信息的流动首先是以图书编号为流动方向的依据,来达到添加、修改、记录、删除图书记录。为了数据的一致性,进行这些操作的同时,也对数据库中的记录进行检查,检查是否有重复的记录。如有则不能进行添加。
3 读者类别管理基本信息流程图
流程图分析:读者类别基本信息的流动首先是以读者类别编号为流动方向的依据,来达到添加、修改、记录读者类别记录。为了数据的一致性,进行这些操作的同时,也对数据库中的记录进行检查,检查是否有重复的记录。如没有则可进行添加。
4 读者信息管理基本信息流程图
流程图分析:读者基本信息的流动首先是以读者的编号为依据,来达到添加、修改、查询、删除读者信息的记录。同时,也对数据库中的读者信息表的编号进行检查。
5借书管理基本信息流程图
流程图分析:借书管理基本信息的流动首先是以借阅编号为流动方向的依据,来达到添加、查询借书记录。为了数据的一致性,进行这些操作的同时,也对数据库中的记录进行检查,检查是否有重复的记录。如没有则可进行添加。
6 还书管理基本信息流程图
流程图分析:借阅管理部分是实现对各部分数据内容的添加和查询操作,在借阅信息中包括借阅编号、读者编号、读者姓名、书籍名称、出借日期和还书日期。并通过添加功能来达到借阅信息表的数据的更新,通过查询可使管理员很快地了解借阅信息,从而避免书籍的丢失现象产生。
通过上面对各个模块流程的分析,那么我们就不难对整个系统的大致流程有一个全面的认识。设计时采用了常用的自顶向下的瀑布式结构化设计方法。各子系统具有独立的数据库结构,同时又具有相关的关键字,这样系统做起来后就便于用户操作。综合上面各个模块的流程分析,其总体流程图如下:
2.3.系统的概念设计
概念设计阶段主要任务和目标是根据需求分析的结果,包括一般联系实体,画出对应的ER图。对于复杂的系统,通常首先要对它的各功能模进行分析,然后再把它的功能结构图画出来,便是设计和优 化。功能分析之后,再根据各个岗位、各个用户对数据和使用权限的不同要求作出局部ER图,然后再把各个局部ER图综合起来形成统一的整体ER图。
3.1模块功能分析
图书管理部分:包括图书信息管理和类别管理,其功能是实现对各部分数据内容进行添加、修改、查询等操作。各管理部分的明细如下:
(1)图书信息管理:包括图书信息的添加、图书信息的修改、图书信息的查询和图书的信息删除4部分。其中,图书信息包括图书编号、书名、图书类别、作者、出版社、出版日期、登记日期以及是否已被借出。
(2)图书类别管理:包括图书类别的添加、图书类别的修改、图书类别的删除3部分功能。其中,图书类别包括类别名称和类别编号两部分。
借阅管理部分:包括借书管理和还书管理,其功能是实现对各部分数据内容的添加和查询等操作。各管理部分的明细如下:
(1)借书管理:包括添加借书信息和查询借书信息2部分功能。其中,借阅信息包括借阅编号、读者编号、读者姓名、图书编号、图书名称、出借日期和还书日期。
(2)还书管理:实现添加还书信息功能。其中,还书信息与借阅信息部分明细相同。
读者管理部分:包括读者信息管理和读者类别管理,其功能是实现对各部分数据内容的添加和修改、删除等操作。各管理部分的明细如下:
(1)读者信息管理:包括读者信的添加、读者信息的修改、读者信息的查询和读者信息的删除4部分功能。其中,读者信息包括读者姓名、读者编号、性别、读者类别、工作单位、家庭住址、电话号码、登记日期和已借书数量。
(2)读者类别管理:包括读者类别的添加、读者类别的修改、读者类别的删除3部分功能。其中,读者类别包括各种类名称、借书期限和有效期限4部分。
系统管理部分:包括修改系统用户密码、增加新用户和退出系统三项功能。系统初始设置一个超级用户名和密码,操作人员可以利用这个超级用户名和密码登录,之后,可以设置其他的超级用户名称,也可以设置权限用户,同时也设置了这个用户可以使用的权限。
3.2系统功能结构图
3.3系统ER图的设计
数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率以及实现的效果产生影响。合理的数据库结构设计可以提高数据存储的效率,保证数据的完整和一致。同时,合理的数据库结构也将有利于程序的实现。设计数据库系统时应该首先充分了解用户各个方面的需求,包括现有的以及将来可能增加的需求。
针对图书管理系统的需求,通过对图书管理系统流程分析,设计此系统需要如下面所示的数据项和数据结构:
图书信息:包括的数据项有:图书编号、书名、图书类别、作者出版社、出版日期、登记日期
读者信息:包括的数据项有:读者姓名、编号、性别、读者类别、工作单位、家庭住址、电话号码、登记日期和已借书数量
图书借阅信息:包括的数据项有:借阅编号、读者编号、读者姓名、图书编号、图书名称、出借日期和还书日期。
在概念设计阶段中,设计人员从用户的角度看待数据及处理要求和约束,产生一个反映用户观点的概念模式。然后再把概念模式转换成逻辑模式。将概念设计从设计过程中独立开来,使各阶段的任务相对单一化,设计复杂程度大大降低,不受特定DBMS的限制。
利用ER方法进行数据库的概念设计,可分成三步进行:首先设计局部ER模式,然后把各局部ER模式综合成一个全局模式,最后对全局ER模式进行优化,得到最终的模式,即概念模式。
ER模型的“联系”用于刻画实体之间的关联。一种完整的方式是对局部结构中任意两个实体类型,依据需求分析的结果,考察局部结构中任意两个实体类型之间是否存在联系。若有联系,进一步确定是1:N,M:N,还是1:1等。还要考察一个实体类型内部是否存在联系,两个实体类型之间是否存在联系,多个实体类型之间是否存在联系,等等。
所有局部ER模式都设计好了后,接下来就是把它们综合成单一的全局概念结构。全局概念结构不仅要支持所有局部ER模式,而且必须合理地表示一个完整、一致的数据库概念结构。
1)确定公共实体类型
为了给多个局部ER模式的合并提供开始合并的基础,首先要确定各局部结构中的公共实体类型。在这一步中我们仅根据实体类型名和键来认定公共实体类型。一般把同名实体类型作为公共实体类型的一类候选,把具有相同键的实体类型作为公共实体类型的另一类候选。
2)局部ER模式的合并
合并的原则是:首先进行两两合并;先和合并那些现实世界中有联系的局部结构;合并从公共实体类型开始,最后再加入独立的局部结构。
3)消除冲突
冲突分为三类:属性冲突、结构冲突、命名冲突。设计全局ER模式的目的不在于把若干局部ER模式形式上合并为一个ER模式,而在于消除冲突,使之成为能够被所有用户共同理解和接受的同一的概念模型。
3)全局ER模式的优化
在得到全局ER模式后,为了提高数据库系统的效率,还应进一步依据处理需求对ER模式进行优化。一个好的全局ER模式,除能准确、全面地反映用户功能需求外,还应满足下列条件:实体类型的个数要尽可能的少;实体类型所含属性个数尽可能少;实体类型间联系无冗余。
根据上述所示得出本系统的全局ER图如下:
2.3. 系统逻辑和物理设计
2.3.1数据库的设计
根据上面的数据库ER图,现在需要将上面的数据库概念结构转化为SQL Server2000数据库系统所支持的实际数据模型,也就是数据库的逻辑结构。在上面的实体以及实体之间关系的基础上,形成数据库中的表格以及各个表格之间的关系。图书管理信息系统数据库中各个表格的设计结果如下面的几个表格所示。每个表格表示在数据库中的一个表。
1.图书类别表
字段名 | 数据类型 | 说明 |
类别名称 | 文本 | 必添字段“是”,允许空字符为“否” |
类别编号 | 文本 | 必添字段“是”,允许空字符为“否” |
2.图书信息表
字段名 | 数据类型 | 说明 |
图书编号 | 文本 | 必添字段“是”,允许空字符为“否” |
书名 | 文本 | 必添字段“是”,允许空字符为“否” |
类别 | 文本 | 字段大小50 |
作者 | 文本 | 字段大小50 |
出版社 | 文本 | 字段大小50 |
出版日期 | 日期/时间 | 无 |
登记日期 | 日期/时间 | 无 |
是否借出 | 文本 | 字段大小2 |
3.借阅信息表
字段名 | 数据类型 | 说明 |
借阅编号 | 自动编号 | 无 |
读者编号 | 文本 | 字段大小50 |
读者姓名 | 文本 | 字段大小50 |
图书编号 | 文本 | 字段大小50 |
图书名称 | 文本 | 字段大小50 |
出借日期 | 日期/时间 | 无 |
4.读者信息表
字段名 | 数据类型 | 说明 |
读者姓名 | 文本 | 必添字段“是”,允许空字符为“否” |
读者编号 | 文本 | 必添字段“是”,允许空字符为“否” |
性别 | 文本 | 字段大小2 |
读者类别 | 文本 | 字段大小50 |
工作单位 | 文本 | 字段大小50 |
家庭住址 | 文本 | 字段大小50 |
电话号码 | 文本 | 字段大小50 |
登记日期 | 日期/时间 | 无 |
已借数量 | 数字 | 无 |
5.读者类别表
字段名 | 数据类型 | 说明 |
种类名称 | 文本 | 必添字段“是”,允许空字符为“否” |
借书数量 | 数字 | 无 |
借书期限 | 数字 | 无 |
有限期限 | 数字 | 无 |
2.3.2数据库的维护
由于应用环境不断变化,数据库运行过和中物理存储也会不断变化,对数据库设计进行调整,修改等维护工作是设计工作的继续和提高。对数据库经常性的维护工作主要包括:
1. 数据库的转储和恢复
针对不同的应用要求制定不同的转储计划,保证一旦发生故障能尽快将数据库恢复到某种一致的状态,尽可能减少对数据库的破坏。
2. 数据库的安全性、完整性控制
在数据库运行过程中由于应用环境的变化,对安全性的要求也会发生变化,如原来机密的数据现在可以公开查询了,新加入的数据又可能是机密的了。系统中用户的密级改变。这都需要根据实际情况修改原有的安全性控制,可以设置数据库密码及用户权限。同样,数据库的完整性的约束条件也会变化,需要DBA不断修正。
3. 数据库性能的监督、分析和改造
利用Microsoft SQL Server2000提供的检测系统性能参数的工具,在数据库运行过程中,监督数据进行分析,找出改进系统性能的方法,并做适当调整。
4. 数据库的重组及重构造
数据库运行一段时间后,由于记录不断增、删、改,增添、修改的数据不能为空,否则不能保存到数据库中。使数据库的物理存储情况变坏,降低了数据的存取效率,数据库性能下降,这时DBA要对数据库进行重组织,或部分重组织(只对频繁增、删的表进行重组织),可以利用Microsoft SQL Server2000专门提供的数据重组织实用程序操作,按原设计要求重新安排存储位置、回收垃圾、减少指针链等,提高系统性能。
有些情况,如由于数据库应用环境发生变化,增加了新的应用或新的实体,取消了某些应用,有的实体与实体间的联系发生变化,则需要调整数据库的模式及内模式。
4.3功能模块的实现
数据库设计
这里的数据库采用Access,用ADO作为连接数据对象。
1、建立Access 数据库
启动Access,建立一个空的数据库book.mdb,如图3所示。
使用程序设计器建立系统需要的表格如下。
图书登记表,如图4所示。
图3建立数据库book.mdb 图4 图书登记表
图书借阅表,如图5所示。
图5 图书借阅表
图书资料表,如图6所示。系统管理表,如图7所示。
图6 图书资料表
图7 系统管理表
。
2、连接数据
在Visual Basic环境下,选择“工程”→“引用”命令,在随后出现的对话框中选择“Microsoft ActiveX Data Objects 2.0 Library”,然后单击“确定”按钮,如图8所示。
图8用ADO连接数据库
在程序设计的公共模块中,先定义ADO连接对象。语句如下:
Public conn As New ADODB.Connection ’ 标记连接对象
然后在子程序中,用如下的语句即可打开数据库:
Dim connectionstring As String
connectionstring = "provider=Microsoft.Jet.oledb.4.0;" &_
"data source=book.mdb"
conn.Open connectionstring
3、设置ODBC
VB的ADO对象是通过ODBC来访问数据库,所以还要建立ODBC数据引擎接口。
打开控制面板中的“管理工具”→“数据源”(ODBC),出现如图9所示的对话框。
图9DBC对话框
单击“添加”按钮,出现“创建新数据源”对话框,如图10。
图10创建新数据源”对话框
选择Microsoft Access Driver(*.mdb),单击“完成”按钮,出现如图11对话框。
图11置连接数据源
在“数据源名”文本框中添加一个名字,单击“确定”按钮完成系统默认连接设置。然后在ODBC对话框中单击“确定”按钮完成ODBC设置。
界面设计
设计好的界面如图12所示。
图12 图书管理系统界面
这是一个多文档界面(MDI)应用程序,可以同时显示多个文档,每个文档显示在各自的窗体中。MDI 应用程序中常有包含子菜单的“窗体”选项,用于在窗体或文档之间进行切换。
菜单应用程序中,有5个菜单选项,每个选项对应着E-R图的一个子项目。
1、创建主窗体 首先创建一个工程,命名为图书管理系统,选择“工程”→“添加MDI窗体”命令,则在项目中添加了主窗体。该窗体的一些属性如表1所示。
表1 主窗体的属性
属 | 性值 |
Caption | 图书管理系统 |
Name | Main |
Menu | Mainmenu1 |
Windowstate | Maxsize |
Windowstate的值为Maxsize,即程序启动之后自动最大化。
将“菜单”组件从“工具箱”拖到窗体上。创建一个 Text 属性设置为“文件”的顶级菜单项,且带有名为“关闭”的子菜单项。类似地创建一些菜单项,如表2所示。
表2 菜 单 项 表
菜 单 名 称 | Text属性 | 功 能 描 述 |
MenuItem1 | 图书管理 | 顶级菜单,包含子菜单 |
MenuItem2 | 图书类别 | 调出图书登记窗体 |
MenuItem3 | 图书信息 | 调出图书借阅窗体 |
MenuItem4 | 图书资料 | 顶级菜单,包含子菜单 |
MenuItem5 | 查询输出 | 调出查询输出窗体 |
MenuItem6 | 系统管理 | 顶级菜单,包含子菜单 |
MenuItem7 | 增加用户 | 调出用户窗体 |
MenuItem8 | 修改密码 | 调出密码窗体 |
MenuItem9 | 退出 | 系统退出 |
2、创建各子窗体
选择“工程”→“添加窗体”命令,添加子窗体。
在新建Visual Basic工程时自带的窗体中,将其属性MIDChild改成True,则这个窗体成为MID窗体的子窗体。
在这个项目中,要创建的子窗体如表3所示。
表3 所有子窗体
子 窗 体 名 | Text |
图书登记 | frmdengji |
图书借阅 | frmjieyue |
增加新用户 | frmadduser |
查询输出 | frmfind |
登录系统 | frmlogin |
修改密码 | frmchangepwd |
下面分别给出这些子窗体,以及它们所使用的控件。
(1) 图书登记子窗体控件如表4所示。
表4 图书登记子窗体控件
控 件 类 别 | 控件Name | 控件Text |
Label | Label1 | 编号 |
Label2 | 书名 | |
Label3 | 类型 | |
Label4 | 购买日期 | |
Label5 | ||
TextBox | Text1 | (空) |
Text2 | (空) | |
Text3 | (空) | |
Text4 | (空) | |
Text5 | (空) | |
CommandButton | Command1 | |
Command2 | ||
ADO | DataAdodc1 | (空) |
DataGrid | DataGrid1 | (空) |
图书借阅和图书赔偿子窗体分别,因为它们的控件与图书登记子窗体的雷同,在此不作介绍。
(2) 增加用户子窗体如图13所示,其控件如表5所示。
图13 增加用户子窗体
表5 增加用户子窗体控件
控 件 类 别 | 控件Name | 控件Text |
Label | Label1 | 输入用户名 |
Label2 | 输入密码 | |
Label3 | 确认密码 | |
TextBox | Text1 | (空) |
Text2 | (空) | |
Text3 | (空) | |
ComboBox | Comb1 | 选择权限 |
CommandButton | Commandl | 确定 |
Command2 | 取消 |
(3) 修改密码子窗体如图14所示。
图14 修改密码子窗体
(4) 用户登录子窗体如图15所示。
图15 用户登录子窗体
(5) 添加读者类别如图16,其控件如表9所示。
图16
建立公共模块
1、显示目录
建立公共模块可以提高代码的效率,同时使得修改和维护代码都很方便。
创建公共模块的步骤如下:
(1) 在菜单中选择“工程”→“添加模块”命令,则出现模块对话框,如图18所示。
(2) 选择模块图标后,单击“打开”按钮,则模块已经添加到项目中了。默认情况下名为Module1。
图17 模块对话框
(3) 在模块中定义整个项目的公共变量。
Public conn As New ADODB.Connection ’ 标记连接对象
Public userID As String ’ 标记当前用户ID
Public userpow As String ’ 标记用户权限
Public find As Boolean ’ 标记查询
Public sqlfind As String ’ 查询语句
Public rs_data1 As New ADODB.Recordset
Public findok As Boolean
Public frmdata As Boolean
Public Const keyenter = 13 ’ enter键的ASCII码
在主窗体添加完菜单之后,就要为各个子菜单创建事件处理程序。
主窗体代码
在本项目中,子菜单事件都是Click事件,这里先给出主窗体部分的代码。
下面是响应“增加用户”子菜单Click事件,调出增加用户窗体代码。
Private Sub add_admin_Click()
frmadduser.Show
End Sub
Private Sub add_back_book_Click()
frmbackbookinfo.Show
End Sub
Private Sub add_book_info_Click()
frmaddbookinfo.Show
End Sub
Private Sub add_book_style_Click()
frmaddbookstyle.Show
End Sub
Private Sub add_lend_book_Click()
frmfindbook.Show
End Sub
Private Sub add_reader_info_Click()
frmaddreaderinfo.Show
End Sub
Private Sub add_reader_style_Click()
frmaddreaderstyle.Show
End Sub
Private Sub change_pwd_Click()
frmchangepwd.Show
End Sub
Private Sub del_book_info_Click()
frmmodifybookinfo.Show
End Sub
Private Sub del_book_style_Click()
frmmodifybookstyle.Show
End Sub
Private Sub del_reader_info_Click()
frmreaderinfo.Show
End Sub
Private Sub del_reader_style_Click()
frmmodifyreaderstyle.Show
End Sub
Private Sub exit_sys_Click()
End
End Sub
Private Sub find_book_info_Click()
frmfindbook.Show
End Sub
Private Sub find_lend_book_Click()
frmfindborrowinfo.Show
End Sub
Private Sub find_reader_info_Click()
frmfindreader.Show
End Sub
Private Sub Form_Load()
End Sub
Private Sub modify_book_info_Click()
frmmodifybookinfo.Show
End Sub
Private Sub modify_book_style_Click()
frmmodifybookstyle.Show
End Sub
Private Sub modify_reader_info_Click()
frmreaderinfo.Show
End Sub
Private Sub modify_reader_style_Click()
frmmodifyreaderstyle.Show
End Sub
2、各子窗体的代码
(1) 图书登记子窗体代码
本窗体用来填写图书登记的信息,用ADO来连接数据库,是本窗体的重点。采用MDI的子程序,所以运行后,它出现在主程序的界面下,如图18所示。
图18 图书登记子窗体
按钮控件要求先填写基本信息,然后与数据库信息比较。
Option Explicit
Private Sub Command1_Click()
Dim rs_addbook As New ADODB.Recordset
Dim sql As String
If Trim(Combo1.Text) = "" Then
MsgBox "请选择图书种类", vbOKOnly + vbExclamation, ""
Combo1.SetFocus
Exit Sub
End If
If Trim(Text1.Text) = "" Then
MsgBox "图书编号不能为空", vbOKOnly + vbExclamation, ""
Text1.SetFocus
Exit Sub
End If
If Trim(Text2.Text) = "" Then
MsgBox "书名不能为空", vbOKOnly + vbExclamation, ""
Text2.SetFocus
Exit Sub
End If
If Not IsDate(Text5.Text) Then
MsgBox "请按照yyyy-mm-dd格式输入日期", vbOKOnly + vbExclamation, ""
Text5.SetFocus
Exit Sub
End If
If Not IsDate(Text6.Text) Then
MsgBox "请按照yyyy-mm-dd格式输入日期", vbOKOnly + vbExclamation, ""
Text6.SetFocus
Exit Sub
End If
sql = "select * from 书籍信息 where 书籍编号='" & Text1.Text & "'"
rs_addbook.Open sql, conn, adOpenKeyset, adLockPessimistic
If rs_addbook.EOF Then
rs_addbook.AddNew
rs_addbook.Fields(0) = Trim(Text1.Text)
rs_addbook.Fields(1) = Trim(Text2.Text)
rs_addbook.Fields(2) = Trim(Combo1.Text)
rs_addbook.Fields(3) = Trim(Text3.Text)
rs_addbook.Fields(4) = Trim(Text4.Text)
rs_addbook.Fields(5) = Trim(Text5.Text)
rs_addbook.Fields(6) = Trim(Text6.Text)
rs_addbook.Fields(7) = "否"
rs_addbook.Update
MsgBox "添加书籍信息成功!", vbOKOnly, ""
rs_addbook.Close
Else
MsgBox "图书编号重复!", vbOKOnly + vbExclamation, ""
Text1.SetFocus
Text1.Text = ""
rs_addbook.Close
Exit Sub
End If
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Form_Load()
Dim rs_leibie As New ADODB.Recordset
Dim sql As String
sql = "select * from 图书类别"
rs_leibie.Open sql, conn, adOpenKeyset, adLockPessimistic
rs_leibie.MoveFirst
Do While Not rs_leibie.EOF
Combo1.AddItem rs_leibie.Fields(0)
rs_leibie.MoveNext
Loop
rs_leibie.Close
End Sub
Private Sub Frame1_DragDrop(Source As Control, X As Single, Y As Single)
End Sub 图书借阅子窗体运行后如图19所示,因为它们的代码和图书登记子窗体的代码雷同,在此不做重复。
图19 图书借阅子窗体运行效果
(2) 增加用户子窗体代码
增加用户子窗体是用来增加用户的用户名、密码和权限的。
单击“确定”按钮后,还要返回一个信息框,提示成功信息,如图20所示。
图20 增加用户子窗体运行效果
信息框
窗体部分代码的思路是,收集输入的表中的字符串,然后与数据库中的系统的用户数据比较,如果不存在,则允许添加。
Private Sub Command1_Click()
Dim sql As String
Dim rs_add As New ADODB.Recordset
If Trim(Text1.Text) = "" Then
MsgBox "用户名不能为空", vbOKOnly + vbExclamation, ""
Exit Sub
Text1.SetFocus
Else
sql = "select * from 系统管理"
rs_add.Open sql, conn, adOpenKeyset, adLockPessimistic
While (rs_add.EOF = False)
If Trim(rs_add.Fields(0)) = Trim(Text1.Text) Then
MsgBox "已有这个用户", vbOKOnly + vbExclamation, ""
Text1.SetFocus
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Combo1.Text = ""
Exit Sub
Else
rs_add.MoveNext
End If
Wend
If Trim(Text2.Text) <> Trim(Text3.Text) Then
MsgBox "两次密码不一致", vbOKOnly + vbExclamation, ""
Text2.SetFocus
Text2.Text = ""
Text3.Text = ""
Exit Sub
ElseIf Trim(Combo1.Text) <> "system" And Trim(Combo1.Text) <> "guest" Then
MsgBox "请选择正确的用户权限", vbOKOnly + vbExclamation, ""
Combo1.SetFocus
Combo1.Text = ""
Exit Sub
Else
rs_add.AddNew
rs_add.Fields(0) = Text1.Text
rs_add.Fields(1) = Text2.Text
rs_add.Fields(2) = Combo1.Text
rs_add.Update
rs_add.Close
MsgBox "添加用户成功", vbOKOnly + vbExclamation, ""
Unload Me
End If
End If
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Form_Load()
Combo1.AddItem "system"
Combo1.AddItem "guest"
End Sub
(3) 修改密码子窗体代码
修改密码子窗体是用来修改用户密码的。
图21修改密码子窗体运行效果
在“确定”按钮的Click事件中添加如下代码:
Private Sub Command1_Click()
Dim rs_chang As New ADODB.Recordset
Dim sql As String
If Trim(Text1.Text) <> Trim(Text2.Text) Then
MsgBox "密码不一致!", vbOKOnly + vbExclamation, ""
Text1.SetFocus
Text1.Text = ""
Text2.Text = ""
Else
sql = "select * from 系统管理 where 用户名=’" & userID & "’"
rs_chang.Open sql, conn, adOpenKeyset, adLockPessimistic
rs_chang.Fields(1) = Text1.Text
rs_chang.Update
rs_chang.Close
MsgBox "密码修改成功", vbOKOnly + vbExclamation, ""
Unload Me
End If
End Sub
图22
在上述代码中,首先比较两个表中的数据是否一致,然后用rs_chang.Fields(1) = Text1.Text语句把代码输入到数据库中。最后,用MsgBox "密码修改成功", vbOKOnly + vbExclamation,""语句弹出一个信息框,告诉修改成功,如图22所示。
(4) 查询子窗体代码
查询子窗体是用来查询库房中图书资料明细的。其运行效果如图23所示。
图23 查询子窗体运行效果
Option Explicit
Dim panduan As String
Private Sub Command1_Click()
Dim rs_findbook As New ADODB.Recordset
Dim sql As String
If Check1.Value = vbChecked Then
sql = "书名='" & Trim(Text1.Text & " ") & "'"
End If
If Check2.Value = vbChecked Then
If Trim(sql) = "" Then
sql = "类别='" & Trim(Combo1.Text & " ") & "'"
Else
sql = sql & "and 书名='" & Trim(Combo1.Text & " ") & "'"
End If
End If
If Check3.Value = vbChecked Then
If Trim(sql) = "" Then
sql = "作者='" & Trim(Text2.Text & " ") & "'"
Else
sql = sql & "and 作者='" & Trim(Text2.Text & " ") & "'"
End If
End If
If Check4.Value = vbChecked Then
If Trim(sql) = "" Then
sql = "出版社='" & Trim(Text3.Text & " ") & "'"
Else
sql = sql & "and 出版社='" & Trim(Text3.Text & " ") & "'"
End If
End If
If Check5.Value = vbChecked Then
If Trim(sql) = "" Then
sql = "书籍编号='" & Trim(Text4.Text & " ") & "'"
Else
sql = sql & "and 书籍编号='" & Trim(Text4.Text & " ") & "'"
End If
End If
If Trim(sql) = "" Then
MsgBox "请选择查询方式!", vbOKOnly + vbExclamation
Exit Sub
End If
sql = "select * from 书籍信息 where " & sql
rs_findbook.CursorLocation = adUseClient
rs_findbook.Open sql, conn, adOpenKeyset, adLockPessimistic
DataGrid1.AllowAddNew = False
DataGrid1.AllowDelete = False
DataGrid1.AllowUpdate = False
Set DataGrid1.DataSource = rs_findbook
'rs_findbook.Close
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Command3_Click()
If Trim(book_num) = "" Then
MsgBox "请选择要借阅的图书!", vbOKOnly + vbExclamation
Exit Sub
End If
If panduan = "是" Then
MsgBox "此书已被借出!", vbOKOnly + vbExclamation
Exit Sub
End If
frmborrowbook.Show
End Sub
Private Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
book_num = DataGrid1.Columns(0).CellValue(DataGrid1.Bookmark)
panduan = DataGrid1.Columns(7).CellValue(DataGrid1.Bookmark)
End Sub
Private Sub Form_Load()
Dim rs_find As New ADODB.Recordset
Dim sql As String
sql = "select * from 图书类别"
rs_find.Open sql, conn, adOpenKeyset, adLockPessimistic
rs_find.MoveFirst
If Not rs_find.EOF Then
Do While Not rs_find.EOF
Combo1.AddItem rs_find.Fields(0)
rs_find.MoveNext
Loop
Combo1.ListIndex = 0
End If
rs_find.Close
End Sub
查询完毕后,输出查询结果,如图24所示。
显示目录
(6) 用户登录子窗体代码
在本项目中,用户登录子窗体是运行的第一个界面,它的作用是检查用户名和密码是否正确。由于用户的资料是存放在数据库中,所以在启动该子窗体时,就已经连接了数据库。其代码如下:
Private Sub Form_Load()
Dim connectionstring As String
connectionstring = "provider=Microsoft.Jet.oledb.4.0;" & _
"data source=book.mdb"
conn.Open connectionstring
cnt = 0
End Sub
“确定”按钮的作用是检查输入的数据是否与数据库中的数据一致。
Private Sub Command1_Click()
Dim sql As String
Dim rs_login As New ADODB.Recordset
If Trim(txtuser.Text) = "" Then ’ 判断输入的用户名是否为空
MsgBox "没有这个用户", vbOKOnly + vbExclamation, ""
txtuser.SetFocus
Else
sql = "select * from 系统管理 where 用户名=’" & txtuser.Text & "’"
rs_login.Open sql, conn, adOpenKeyset, adLockPessimistic
If rs_login.EOF = True Then
MsgBox "没有这个用户", vbOKOnly + vbExclamation, ""
txtuser.SetFocus
Else ’ 检验密码是否正确
用户名和密码通过后,要关闭本窗体并打开主窗体。
If Trim(rs_login.Fields(1)) = Trim(txtpwd.Text) Then
userID = txtuser.Text
userpow = rs_login.Fields(2)
rs_login.Close
Unload Me
MDIForm1.Show
Else
MsgBox "密码不正确", vbOKOnly + vbExclamation, ""
txtpwd.SetFocus
End If
End If
End If
’ 只能输入3次
cnt = cnt + 1
If cnt = 3 Then
Unload Me
End If
Exit Sub
End Sub
(7)查询借书信息如图25
如图27
代码如下:
Option Explicit
Private Sub Command1_Click()
Dim sql As String
Dim rs_find As New ADODB.Recordset
If Option1.Value = True Then
sql = "select * from 书籍信息 where 是否被借出='是'"
End If
If Option2.Value = True Then
sql = "select * from 书籍信息 where 是否被借出='否'"
End If
If Option3.Value = True Then
sql = "select * from 借阅信息 where 读者姓名='" & Text1.Text & "'"
End If
rs_find.CursorLocation = adUseClient
rs_find.Open sql, conn, adOpenKeyset, adLockPessimistic
DataGrid1.AllowAddNew = False
DataGrid1.AllowDelete = False
DataGrid1.AllowUpdate = False
Set DataGrid1.DataSource = rs_find
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Frame2_DragDrop(Source As Control, X As Single, Y As Single)
End Sub
此板块,可以查询已经借出的书,没有借出的书,也可以按读者姓名查询!!!
(8)还书信息如图26
如图26
代码如下:
Option Explicit
Dim findform As Boolean
Private Sub Combo1_Click()
Combo2.ListIndex = Combo1.ListIndex
End Sub
Private Sub Combo2_Click()
Combo1.ListIndex = Combo2.ListIndex
End Sub
Private Sub Combo3_Click()
Combo4.ListIndex = Combo3.ListIndex
End Sub
Private Sub Combo4_Click()
Combo3.ListIndex = Combo4.ListIndex
End Sub
Private Sub Command1_Click()
Dim rs_reader As New ADODB.Recordset
Dim sql As String
findform = True
sql = "select * from 借阅信息 where 读者姓名='" & Combo2.Text & "'"
rs_reader.CursorLocation = adUseClient
rs_reader.Open sql, conn, adOpenKeyset, adLockPessimistic
Set DataGrid1.DataSource = rs_reader
DataGrid1.AllowAddNew = False
DataGrid1.AllowDelete = False
DataGrid1.AllowUpdate = False
End Sub
Private Sub Command2_Click()
Dim rs_book As New ADODB.Recordset
Dim sql As String
findform = False
sql = "select * from 借阅信息 where 书籍编号='" & Combo3.Text & "'"
rs_book.CursorLocation = adUseClient
rs_book.Open sql, conn, adOpenKeyset, adLockPessimistic
Set DataGrid1.DataSource = rs_book
DataGrid1.AllowAddNew = False
DataGrid1.AllowDelete = False
DataGrid1.AllowUpdate = False
End Sub
Private Sub Command3_Click()
Dim book_num As String
Dim reader_num As String
Dim answer As String
Dim rs_back As New ADODB.Recordset
Dim sql As String
On Error GoTo delerror
book_num = DataGrid1.Columns(3).CellValue(DataGrid1.Bookmark)
reader_num = DataGrid1.Columns(1).CellValue(DataGrid1.Bookmark)
answer = MsgBox("确定要还这本书吗?", vbYesNo, "")
If answer = vbYes Then
sql = "select * from 借阅信息 where 书籍编号='" & book_num & "'"
rs_back.CursorLocation = adUseClient
rs_back.Open sql, conn, adOpenKeyset, adLockPessimistic
rs_back.Delete
rs_back.Update
rs_back.Close
sql = "select * from 书籍信息 where 书籍编号='" & book_num & "'"
rs_back.CursorLocation = adUseClient
rs_back.Open sql, conn, adOpenKeyset, adLockPessimistic
rs_back.Fields(7) = "否"
rs_back.Update
rs_back.Close
sql = "select * from 读者信息 where 读者编号='" & reader_num & "'"
rs_back.CursorLocation = adUseClient
rs_back.Open sql, conn, adOpenKeyset, adLockPessimistic
rs_back.Fields(8) = rs_back.Fields(8) - 1
rs_back.Update
rs_back.Close
If findform = True Then
Command1_Click
Else
Command2_Click
End If
MsgBox "成功删除!", vbOKOnly + vbExclamation, ""
DataGrid1.AllowDelete = False
Else
Exit Sub
End If
delerror:
If Err.Number <> 0 Then
MsgBox Err.Description
End If
End Sub
Private Sub Command4_Click()
Unload Me
End Sub
Private Sub Form_Load()
Dim rs_reader As New ADODB.Recordset
Dim rs_book As New ADODB.Recordset
Dim sql As String
sql = "select * from 读者信息"
rs_reader.CursorLocation = adUseClient
rs_reader.Open sql, conn, adOpenKeyset, adLockPessimistic
If Not rs_reader.EOF Then
Do While Not rs_reader.EOF
Combo1.AddItem rs_reader.Fields(1)
Combo2.AddItem rs_reader.Fields(0)
rs_reader.MoveNext
Loop
End If
rs_reader.Close
sql = "select * from 借阅信息"
rs_book.CursorLocation = adUseClient
rs_book.Open sql, conn, adOpenKeyset, adLockPessimistic
If Not rs_book.EOF Then
Do While Not rs_book.EOF
Combo3.AddItem rs_book.Fields(3)
Combo4.AddItem rs_book.Fields(4)
rs_book.MoveNext
Loop
End If
rs_book.Close
End Sub
Combo4.AddItem rs_book.Fields(4)
rs_book.MoveNext
Loop
End If
rs_book.Close
End Sub
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。