Delphi+Access图书管理系统|课程设计报告课程案例
摘要:本系统使用Delphi 7.0结合Microsoft Access数据库进行开发。由于每个学校都有图书馆,图书馆的系统主要可以分为两块:图书信息的服务系统和图书的综合管理系统.图书的使用对象是借阅者,例如学生、教师;管理者是图书馆的管理员。因此根据这些信息,本系统的主要功能就是:实现图书馆图书信息的管理和维护如用户信息管理、新书入库、整理图书、修改图书信息和进行查询等;以及服务系统的图书信息查询、图书的接出和归还等功能。关键字:图书管理系统;信息管理;信息查询;需求分析
Books management system Dainina Class Computer Education Vocational Technical Edutication Academy Hunan Argricultural university
Abstract: This system uses Delphi 7.0 unified Microsoft Access database to develope. Because each school has its’own library, the library system mainly divide into two parts: Books information service system and books synthesis management system. The users of the books are borrowers, for example, students, teachers; The manager is the library manager. Therefore according to these information, this system’s main functiones are: Realizing the management and maintenance of books information like user information management, the new book goes into storage, the reduction books, revises the books information and carries on the inquiry and so on; As well as the information inquires, the books lead and return of service system books and so on.
Key words: Books management system; Information management and inquiry; The demand analyzes
目 录
1、引言………………………………………………………..3 1.1、选题背景…………………………………………….3 1.2、图书管理现状与意义……………………………… 3 1.3、可行性分析………………………………………….3 2、需求分析…………………………………………………..3 2.1、功能分析…………………………………………….3 2.2、数据流图…………………………………………….4 2.3、数据字典…………………………………………….4 2.4、E-R图………………………………………………..6 3、软件设计…………………………………………………..6 3.1、概要设计…………………………………………….6 3.1.1系统体系结构图………………………………….6 3.1.2界面设计………………………………………….7 3.2、详细设计…………………………………………….9 3.2.1各模块的主要说明……………………………… 9 3.2.2各模块的流程图………………………………….11 4、系统实现……………………………………………………14 5、测试…………………………………………………………19 5.1、单元测试…………………………………………….19 5.2、集成测试…………………………………………….20 6、小结…………………………………………………………21 参考文献……………………………..……………………..22
1、引 言1.1、选题背景 随着知识经济的时代的迅速发展,由于以前广泛使用的管理书籍的方法都将慢慢淘汰。而今积累的书籍越来越多,若是不对其进行有效的管理,对信息的查找就犹如大海捞针不得其所。本系统就是征对图书管理的要求而开发的。1.2、图书管理现状与意义 (1)由于需求分析不明确,导致功能需求不齐全,新图书入库更新缓慢,借书情况难于查询和统计,用户基本信息不完全等问题。 (2)维护困难,没有配套的开发文档,维护极其困难,可移植性差。 为了以上问题得到解决,提出了开发新系统的要求。1.3、可行性分析 技术可行性:Delphi是一种完全可视化的编程工作,这不仅表现在应用程序界面编辑和代码的编写中,还表现为数据库应用程序设计上的高可视化和高面向对像性。Delphi用户不仅可以在非常友好的集成开发环境下开发数据库应用程序,也可以在线获取帮助信息,也很容易弄懂、上手。
2、需求分析2.1、功能分析 本系统由两大子系统组成:图书管理和维护子系统以及图书信息服务子系统。本课程设计是各个信息分别用数据库表示,共有6个数据库,它们分别是: reader(读者管理)、main(主界面)、lend(借阅管理)、infoquery(信息管理)、book(图书管理)、data ownbook(已借图书)。 2.1.1、图书管理和维护子系统的功能包括:(1) 新图书信息入库(建立信息库,以便查询和借阅)。(2)整理图书库(包括删除图书信息和统计图书信息)。(3) 修改图书信息。(4)查询图书的借阅情况(包括接出情况查询、未接出情况查询和超时情况查询)。(5)图书馆的规则管理和维护(包括每人借阅图书数目、每人每本书可持有天数以及每天超时一天的罚金数目)。(6)用户的管理和维护(例如删除已毕业学生信息、增加新生信息等)。 2.1.2、图书信息服务的子系统的功能包括:(1) 图书信息的查询(例如在借书前可先查询某本图书是否被借书)。(2) 图书的借阅(按图书馆的规则进行借阅,例如不超过5本,如果已有超过借阅的图书,则在归还前不允许再借阅等等)。 2.2、数据流图
2.3、数据字典(1)、图书编号: 类型:数字 长度:10 取值范围:0000000000——9999999999 (2)、图书名称: 类型:文本 长度:50 范围:字母、汉字、数字组成 (3)、作者: 类型:文本 长度:30 范围:汉字、圆点、字母组成 (4)、出版社: 类型:汉字 长度:50 (5)、入库日期: 类型:日期/时间 格式:0000/00/00 (6)、借出日期、应还日期: 类型:日期/时间 格式:0000/00/00 (7)、借阅者: 类型:文本 长度:20 取值范围:汉字 (8)、图书类别: 类型:文本 长度:20 (9)、价格: 类型:单精度 小数位:2位 (10)、备注 类型:备注型
2.4、E-R图 3、软件设计3.1、概要设计3.1.1、系统体系结构图 (1)程序功能图 (2)程序流程图
3.1.2、界面设计 (1)进入本系统的界面,如下图:
(2)借阅管理界面
(3)图书管理中新书入库界面: (4)信息查询界面:
3.2、详细设计3.2.1、各模块的主要说明 (1) 借阅者服务模块的实现借阅者服务窗体的功能主要是图书的查询,个人借阅情况查看及个人部分信息的修改。 (2) 图书查询功能的实现在本系统中,任何人都有权限使用查询功能,不做任何限制。由于实现的查询功能有多种,如按图书编号、图书名称等字段进行完全体配查找和部分体配的模糊查找,还有按多个条件进行逻辑与或是逻辑或的多条件查找。 (3) 借阅者借阅情况功能的实现 当借阅者正确登录到系统后,此功能将被激活,使用户能查看到自身的借阅情况。在此系统中,信息的显示一般用ListView来实现,只在较少的情况下用到了DBgrid,因为我觉得ListView更好实现,并能使信息数据对用户的完全分离。在这里跟据借阅者的不同要求实现借阅情况的查询,有检查所有的借阅情部、某本书的借阅情况、和根据已借阅天数的来查询。其中根椐借阅天数来查询更有代表性,有方式一和方式二。 (4) 工作人员进行图书归还功能实现 在此功能中,工作人员根据借阅者的借书证号和归还的图书编号进行图书的归还工作。并且根据现实中可能会出现的只知图书名不知图书编号的归还情况,所以加入了按书籍名称进行归还的功能。这个功能是图书借阅功能中把图书名称转换成图书编号的一种改进方法,这样就不用如借阅功能中一样要先转换再借阅了。 (5) 图书馆管理员修改图书类别及统记功能的实现 此窗体中能对图书的类别进行删除,添加和修改,这模块的功能的实现过程与图书记录的删除,添加和修改一样的,但是这个窗体还能跟据图书类别进行统计,还可根据Book表和owner表统计出图书总数目,库存图书数目,借出图书数目及借阅过期的图书数目。在这里给出统计图书总数目,库存图书数目,借出图书数目及借阅过期的图书数目的实现过程中的几个函数和过程。 (6) 图书馆维护借阅者管理功能的实现 此功能能对借阅者信息进行查看添加、删除、修改。在这里给出刷新按钮的实现过程。 (7) 图书馆借阅者统计功能的实现 此功能按借阅者身份进行统计,得出具有某种身份的借阅者总数,此种身份的并借阅图书的借阅者数和所借阅的图书数。 (8) 图书馆统计借阅过期记录功能的实现 此报表能显示按借书证号升序排列的借阅信息超过限定时限的信息。 3.2.2 各模块的流程图 (1)借阅者借书模块
(2)借阅者还书查询模块
(3)新书入库模块
(4)信息查询模块
4、系统实现 下面为主要功能的部分源代码: //对图书管理的新书入库按钮的响应事件 procedure Tbookform.Button1Click(Sender: TObject); begin if Length(CodeEdit.Text )<>10 then //检查新入库图书的书号是否长度是否为10 begin messagedlg('书号不正确',mtError,[mbok],0); CodeEdit.SetFocus ; exit; end; with dataModuleAdo.adoquery1 do//检查书号是否已经存在 begin sql.clear; sql.Add('select code from book where code=:code');// 输入查找语句 parameters.ParamByName('code').Value :=codeedit.Text ; open; if recordcount<>0 then //记录号不为零 begin messagedlg('书号<'+codeedit.Text+'>已经存在',mtError,[mbok],0); codeedit.SetFocus ; exit; end; close; end; try //若是不正确的话,出话提示信息 parameters.ParamByName('outdate').Value :=strtodate(outtimeedit.Text) ; except messagedlg('参数<出版时间>设置错误',mtError,[mbok],0); // 显示错误信息 exit; end; try parameters.ParamByName('cost').Value :=strtofloat(costedit.Text) ; except messagedlg('参数<价格>设置错误',mtError,[mbok],0); exit; end; try //备注不能为空,否则出现提示信息 parameters.ParamByName('MMEMO').Value :=memo1.Text ; except messagedlg('memo error',mterror,[mbok],0); // 显示备注错误 exit; end; execSQL; end; Tabsheet1show(sender); except messagedlg('入库错误',mtError,[mbok],0); end; end; with datamoduleado.ADOQuery1 do刊号 //对图书管理选中书的显示 begin sql.Clear ; sql.Add('select code from book'); open; first; for i:=0 to recordcount-1 do begin combobox1.Items.Add(fieldbyname('code').AsString ); next; end; close; end; end; procedure Tbookform.ComboBox1Change(Sender: TObject); begin if length(combobox1.Text )=10 then //借书证号为10 begin try with datamoduleAdo.ADOTable1 do begin tablename:='book'; dbname.DataField :='Name'; dbauthor.DataField :='Author'; dbpress.DataField :='press'; dboutdate.DataField :='outdate'; dbcost.DataField :='cost'; dbmemo.DataField :='memo0'; active:=true; if locate('code',combobox1.Text ,[]) then// 查找相关的信息 edit else showmessage('not found ' ); // 显示错误信息 end; except messagedlg('数据操作出错',mtError,[mbok],0); end; end; end;
procedure Tlendform.FormShow(Sender: TObject) ; // 借阅管理借出按钮事件var i:integer; begin with datamoduleado.ADOQuery1 do // 响应datamoduleado.ADOQuery1按钮事件 begin sql.Clear ; sql.Add('select code from book'); open; first; for i:=0 to recordcount-1 do begin combobox1.Items.Add(fieldbyname('code').AsString ); next; end; close; end;end;//对借阅管理借出按钮事件的响应procedure Tlendform.ReaderIDEditChange(Sender: TObject);begin if length(readerIDEdit.Text )=10 then //判断借书证号是否存在 begin with datamoduleADO.ADOQuery1 do begin sql.Clear ; sql.Add('select readerid from reader where readerid=:readerid'); parameters.ParamByName('readerid').Value :=readeridedit.Text ; open; if recordcount=0 then //借书证号不能为0 begin button1.Enabled :=false; messagedlg('借书证号<'+readeridedit.Text +'>不存在',mterror,[mbok],0); close; exit; end; close; end;
try with datamoduleado.ADOQuery1 do begin sql.Clear ; sql.Add('select count(readerid) from lend where readerid=:readerid'); parameters.ParamByName('readerid').Value :=readeridedit.Text ; open; totaledit.Text :=inttostr(fields[0].Value ); close; end; except totaledit.Text :='0'; end;
button2.Enabled :=false; button1.Enabled :=true; button1.SetFocus ; end;
end;
procedure Tlendform.Button1Click(Sender: TObject);var tempownbook:townbook; canlend:boolean; mmcode:string;begin if readeridedit.Text <>'' then //借书证号不能为空 begin try with datamoduleado.adoquery1 do begin sql.clear; sql.Add('select code from lend where readerid=:readerid'); parameters.ParamByName('readerid').Value :=readeridedit.Text ; open; canlend:=true; ownbookform.ListView1.Items.Clear ;
mmcode:=fieldbyname('code').AsString;
while not eof do begin with tempadoquery1 do begin sql.Clear ; sql.Add('select * from book where code =:code') ; parameters.ParamByName('code').Value :=mmcode; open; tempownbook.code:=fieldbyname('code').asstring; tempownbook.name:=fieldbyname('name').asstring; tempownbook.price:=fieldbyname('cost').asstring;
try with tempadoquery2 do begin sql.Clear ; sql.Add('select * from lend where code=:code and readerid=:readerid'); parameters.ParamByName('code').Value :=datamoduleado.ADOQuery1.fieldbyname('code').AsString ; parameters.ParamByName('readerid').Value := readeridedit.Text ; open; tempownbook.owndays:=round(date-fieldbyname('outdate').AsDateTime ); close; end; except tempownbook.owndays:=0; end;
close; end;
if tempownbook.owndays>60 then //超过60天后所交罚金 begin with ownbookform.listview1.Items.add do begin caption:=tempownbook.code; subitems.add(tempownbook.name); subitems.add(tempownbook.price); subitems.Add(inttostr(tempownbook.owndays)); subitems.Add(floattostr((tempownbook.owndays-60)*0.1)); end; canlend:=false; end; next; end; close; end;except canlend:=true;end;try //响应借书证号不正确,则借书不成功,出现提示 with DatamoduleADO.adoquery1 do begin sql.clear; sql.add('insert into lend(code,readerid,outdate)'+' values(:code,:readerid,:outdate)'); parameters.parambyname('code').value:=combobox1.text; parameters.parambyname('readerid').value:=readeridedit.text; parameters.parambyname('outdate').value:=datetostr(now()); execsql; end;except messagedlg('借书不成功',mterror,[mbok],0); end;end;else begin showmessage('请输入借书证号!'); readeridedit.setfocus; end;end;其他代码与上述功能代码相似,就不一一赘述。
5、测试 5.1、单元测试 (1)图书管理系统测试测试用例 正误 结果 图书编号 3333 × 数据长度不对 图书名称 软件工程 √ 正确 借阅者 王1 × 类型不匹配 入库日期 2002-1-1 × 格式不正确 价格 20.00 √ 正确
(2)借阅者借书测试
测试用例 正误 结果 借书证号 0000000001 √ 正确 姓名 王小 √ 正确 班级 计算机教育 √ 正确 借书证号 000003 × 数据长度不正确 借书证号 Krrr2220 × 类型不匹配
(3)续借办理测试 输入编号后,查询此书信息。如果该书并未借出,则只能显示其基本信息,不能进行续借操作。如:图书编号(6),图书名称(招生考试),显示该图书没有借出;图书编号(5)查询后,续借按钮是活动的。
5.2、集成测试 (1)、用于修改数据库内容的 SQL 语句主要有以下三个: a、 Insert,向一个表中加入新的数据行 b、Delete,从一个表中删除数据行 c、Update,更改数据库中已经存在的数据 Insert标准语法: INSERT INTO table_name (col1, col2...) VALUES(value1, value2...) 下例要将借书证号为‘000001’作为一个新的借书情况加入借书情况表OWNER中 Insert Into owner (借书证号,图书编号,借书日期) values (‘000001’,‘00000001’,‘2002-9-12’) UPDATE table_name SET columnname1 = value1 [, columname2 = value2]... WHERE search_condition Delete 语句标准语法: DELETE FROM tablename WHERE condition (2) UNION子句有些时候,需要一起浏览多个查询的结果、组合它们的输出,我们可以使用UNION关键字。 (3) 在信息管理系统中,我们往往会遇到归类、汇总、映射、索引、子查询等复杂操作,相应的支持与实现如下:GROUP BY方法 GROUP BY子句语法为: SELECT column1, SUM(column2) FROM "list-of-tables" GROUP BY "column-list";这个GROUP BY子句将集中所有的行在一起,它包含了指定列的数据以及允许合计函数来计算一个或者多个列。
(4)查询所借书籍的编号 Select * From Book Where 图书编号 =:bookCode; 6、小结 这次课程设计让我认识到软件工程方法对项目开发的重要性和必要性,知道可以使得软件开发少走弯路,更容易开发出高质量的项目开发。按照软件工程的方法、软件的开发需要严格遵守其开发流程,作好软件设计的每一个流程。 由于以前没有系统的学习过软件工程的相关知识,只学过C/C++语言、数据结构等课程,因此在我的头脑里,做软件就是写代码,水平高的人写大型的、复杂的代码,水平低的人编的简单一些,所以总觉得软件工程没有什么太多实际的价值。然而,在逐步的学习过程中,特别是在结合本门课程和同学一起开发一个较为大型的软件中,我深深感受到了软件工程在开发过程中的指导作用。软件工程,重点在工程两字上,也就是把软件的开发当作一个工程项目运用工程的方法来实施,从可行性分析、需求分析直到最后的测试、交付以及以后的维护,每一个过程都有自己的一套方法。工程经常是和实践联系在一起的,软件工程只有在实际的软件开发中才能更深的体会到它的作用。 由于时间仓促,此系统仍存在一些不足,文档不够详尽,导致标准不统一。设计仍有不太合理处,需要进行完善性维护。 衷心感谢彭老师给予我们这次机会,让我们对软件的开发过程还是对程序的编写步骤都有了更加深刻的认识。
参考文献[1] 肖庆航、陆定淑,《Delphi 7数据库开发教程》,清华大学出版社 ,2001年2月[2] 龙劲松,elphi 6开发人员指南》,械出版社 ,2003年5月[3] 陈豫龙 ,《Delphi 6数据库系统开发事例导航》,人民邮电出版社 ,2001年9月[4] 黄平 ,《Delphi 6数据库开发与应用》,中科多媒体电子出版社, 2001年10月[5] 郑人杰、殷人昆、陶永雷 ,《实用软件工程》,清华大学出版社 ,2005年5月[6] 张海藩 ,《软件工程导论》,清华大学出版社,2000 年1月