VF图书管理系统.docx
《VF图书管理系统.docx》由会员分享,可在线阅读,更多相关《VF图书管理系统.docx(64页珍藏版)》请在冰豆网上搜索。
VF图书管理系统
实训报告
课程(项目)名称:
学院:
专业:
班级:
学号:
姓名:
成绩:
XXX年XX月XX日
一、任务与目的
目的:
1、熟练掌握如何利用项目管理器来实施对一个具体项目的管理与组织;
2、培养数据库项目开发的基本技能;
3、培养调试与编辑程序的基本技能。
任务:
掌握数据库项目设计与开发的基本知识和操作技能。
二、原理(条件)
本系统运行的硬件和软件环境要求较低,对计算机的要求是:
处理器:
486DX/66以上;
内存:
16MB以上;
硬盘:
10MB硬盘空余;
操作系统:
Winows95/98/XP/200
三、内容与步骤
1.表的设计
要完成以上功能,必须有读者表、书库表、借阅表、人员表、罚款表,各表表结
构如下所示。
读者表
字段
字段名
类型
宽度
小数位
1
借书证号
字符型
8
2
姓名
字符型
8
3
性别
字符型
2
4
出生日期
日期型
8
5
部门
字符型
20
6
职称
字符型
10
7
异常说明
字符型
30
8
照片
备注型
4
图书表
字段
字段名
类型
宽度
小数位
1
书号
字符型
8
2
书名
字符型
40
3
作者
字符型
8
4
出版社
字符型
20
5
类别
字符型
20
6
单价
数值型
7
2
7
数量
整型
4
8
借出数量
整型
4
借阅表
字段
字段名
类型
宽度
小数位
2
书号
字符型
8
3
借出日期
日期时间型
8
4
还书日期
日期时间型
8
5
异常说明
字符型
30
人员表
字段
字段名
类型
宽度
小数位
1
编号
字符型
3
2
用户名
字符型
10
3
密码
字符型
10
4
级别
字符型
1
5
类别
字符型
10
罚款表
字段
字段名
类型
宽度
小数位
1
事由
字符型
20
2
罚款数量
数值型
7
2
3
交费日期
日期时间型
8
4
异常说明
字符型
30
2.目录设计
建立“图书馆管理系统”文件夹,在文件夹内建立form、database、images、
report、class、menu、bak、help子文件夹,分别用于存放表单、表、图象、
报表、类、菜单、备份、帮助文件,如图以下所示。
3.设计“系统登录”表单
实现目标:
这是程序启动的第一个画面,设计的功能要求是:
选择用户的类别、
输入用户名和用户密码、当用户名和密码均正确后才能进入功能界面,用户输入
错误有提示信息,系统在三次错误提示后会自动退出。
实现过程:
建立表单,添加控件,将表单以“系统登录”为名存入form文件夹下,设计界面
如图以下所示。
设置Text2的PassWordChar属值为“*”,将Combo1的Rowsourcetype属性设为1,Rowsource属性值设为:
馆长,采编员,图书管理员,读者。
设置form1的AlwaysOnTop属性为.t.,BorderStyle的属性为2—固定对话框,Desktop的属性为.T.,WindowType的属性为1—模式。
设定Combo1的Valid事件代码为:
ifthis.value="读者"
thisform.label3.caption="借书证号"
else
thisform.label3.caption="用户名"
endif
设置表单的Init事件代码为:
application.visible=.f.
closeall
设置表单的Load事件代码为:
publiccn
cn=0
设置命令按钮“确定”的Click事件代码为:
ifempty(bo1.value)
messagebox("请选择类别",48,"友好提示")
bo1.setfocus
else
publicmanager1,clb,cname&&定义全局变量
manager1=alltrim(bo1.value)
ifmanager1="读者"
usedatabase\读者表
cname=alltrim(thisform.text1.value)
locafor借书证号=cname
iffound()
_screen.application.visible=.t.
domenu\menu.mpr
doformform\工具栏
thisform.release
else
messagebox("没有这个读者,请重新输入!
",4+32,"系统登录")
thisform.text1.value=""
thisform.text1.setfocus
endif
else
usedatabase\人员表&&打开数据表
clb=alltrim(thisform.Combo1.value)
cname=alltrim(thisform.text1.value)
ppassword=alltrim(thisform.text2.value)
locafor类别=clband用户名=cname
&&查询用户
setexacton&&字符精确比较
*判断操作员是否正确
if!
(类别=clband用户名=cname)
cn=cn+1
nanswer=messagebox("操作员错误,请重新输入!
",4+32,"系统登录")
ifnanswer=6&&选择“是”时的操作
thisform.text1.value=''
thisform.text1.setfocus
else
thisform.release&&释放表单
endif
ifcn=3
thisform.release
endif
else
*判断密码是否正确
ifalltrim(人员表.密码)!
=ppassword
cn=cn+1
nanswer=messagebox("密码错误,请重新输入!
",4+32,"系统登录")
ifnanswer=6
thisform.text2.value=''
thisform.text2.setfocus
else
thisform.release
endif
ifcn=3
thisform.release
endif
else
doformform\欢迎使用图书管理系统
thisform.release
endif
endif
endif
endif
setexactoff&&字符非精确比较
docase
casemanager1="读者"
manager=1
casemanager1="图书管理员"
manager=2
casemanager1="采编员"
manager=3
casemanager1="馆长"
manager=4
endcase
设置命令按钮“退出”的Click事件代码为:
thisform.release
4.菜单的设计
实现目标:
设计具有根据不同权限有不同可用菜单的菜单格式文件和程序文件。
实现过程:
进入菜单设计器,分别设计各菜单栏、菜单项,将设计好的菜单格式
文件存到menu文件夹下,文件名为:
menu.mnx。
注意设计各菜单项时,单
击各行后“选项”按钮,设置“跳过”条件,如设置“借书登记”菜单项的“跳过”条件。
过程见下图:
1.创建菜单设计器后,输入菜单名称,如图以下所示。
2.点击“编辑”按钮,打开对话框,接着输入菜单名称,结果的选项为“命令”,选项输入为“doformform\菜单名称.exe”,如图所示。
设计完后,单击“菜单”菜单下的“生成”菜单项,将该菜单格式文
件生成为菜单程序文件,文件名为:
menu.mpr。
5.设计“借书登记”表单
实现目标:
根据用户输入的借书证号和书号办理登记手续,输入的借书证号和书
号都要有检验功能,看是否为合法的号码,表单提供用列表框浏览并选择借书证
号和书号的功能,也提供当前借书证号已借书的情况和当前书号的书被借的情
况。
实现过程:
新建表单,在表单上添加控件,以“借书登记”文为名存入到form子
文件夹下,设计界面如图以下所示。
相关代码如下。
表单的Init事件代码为:
bo1.visible=.f.
bo2.visible=.f.
thisform.grid1.visible=.f.
thisform.container1.label1.caption="姓名:
"
thisform.container1.label2.caption="性别:
"
thisform.container1.label3.caption="部门:
"
thisform.container1.label4.caption="职称:
"
thisform.container2.label1.caption="书名:
"
thisform.container2.label2.caption="作者:
"
thisform.container2.label3.caption="出版社:
"
thisform.container2.label4.caption="类别:
"
文本框Text1的Valid事件代码为:
if!
empty(this.value)
sele读者表
locafor借书证号=alltrim(thisform.text1.value)
iffound()
thisform.container1.label1.caption="姓名:
"+姓名
thisform.container1.label2.caption="性别:
"+性别
thisform.container1.label3.caption="部门:
"+部门
thisform.container1.label4.caption="职称:
"+职称
else
messagebox("没有这个借书证号,请重新输入!
",48,"重要提示")
thisform.init
thisform.text1.value=""
return0
endif
else
thisform.init
endif
文本框Text1后的“……”命令按钮的Click事件代码为:
bo1.visible=.t.
bo1.rowsourcetype=3
bo1.rowsource="seledist借书证号,姓名,性别,部门from
读者表;
orderby借书证号intocursorcombo1"
组合框Combo1的InterActiveChange事件代码为:
thisform.text1.value=alltrim(this.value)
sele读者表
locafor借书证号=alltrim(thisform.text1.value)
thisform.container1.label1.caption="姓名:
"+姓名
thisform.container1.label2.caption="性别:
"+性别
thisform.container1.label3.caption="部门:
"+部门
thisform.container1.label4.caption="职称:
"+职称
文本框Text2的Valid事件代码为:
if!
empty(this.value)
sele图书表
locafor书号=alltrim(thisform.text2.value)
iffound()
thisform.container2.label1.caption="书名:
"+书名
thisform.container2.label2.caption="作者:
"+作者
thisform.container2.label3.caption="出版社:
"+出版社
thisform.container2.label4.caption="类别:
"+类别
else
messagebox("没有这个书号,请重新输入!
",48,"重要提示")
thisform.init
thisform.text2.value=""
return0
endif
else
thisform.init
endif
文本框Text2后的“……”命令按钮的Click事件代码为:
bo2.visible=.t.
bo2.rowsourcetype=3
bo2.rowsource="seledist书号,书名,作者,出版社from图
书表;
orderby书号intocursorcombo2"
组合框Combo1的InterActiveChange事件代码为:
thisform.text2.value=this.value
sele图书表
locafor书号=alltrim(thisform.text2.value)
thisform.container2.label1.caption="书名:
"+书名
thisform.container2.label2.caption="作者:
"+作者
thisform.container2.label3.caption="出版社:
"+出版社
thisform.container2.label4.caption="类别:
"+类别
命令按钮“借出登记”的Click事件代码为:
sele借阅表
locafor借书证号=alltrim(thisform.text1.value)and书号
=alltrim(thisform.text2.value)
iffound()
aa=messagebox("该同志已借此书,还要借吗",36,"友好提示")
ifaa=6
sele借阅表
countfor借书证号=alltrim(thisform.text1.value)tok
ifk>=5
messagebox("该借书证号借书指标已满,不能再借",48,"友好提示")
else
sele图书表
locafor书号=alltrim(thisform.text2.value)
if数量-借出数量<0
messagebox("该书已借完,不能再借!
"+chr(13)+"库存"+alltrim(str(数
量))+"本,已借出"+alltrim(str(借出数量))+"本",48,"友好提示")
else
update图书表set借出数量=借出数量+1where书号
=alltrim(thisform.text2.value)
insertinto借阅表(借书证号,书号,借出日期)value
(alltrim(thisform.text1.value),alltrim(thisform.text2.value),datetime
())
messagebox("借书登记完毕!
",48,"友好提示")
endif
endif
endif
else
sele借阅表
countfor借书证号=alltrim(thisform.text1.value)tok
ifk>=5
messagebox("该借书证号借书指标已满,不能再借",48,"友好提示")
else
sele图书表
locafor书号=alltrim(thisform.text2.value)
if数量-借出数量<0
messagebox("该书已借完,不能再借!
"+chr(13)+"库存"+alltrim(str(数
量))+"本,已借出"+alltrim(str(借出数量))+"本",48,"友好提示")
else
update图书表set借出数量=借出数量+1where书号
=alltrim(thisform.text2.value)
insertinto借阅表(借书证号,书号,借出日期)value
(alltrim(thisform.text1.value),alltrim(thisform.text2.value),datetime
())
messagebox("借书登记完毕!
",48,"友好提示")
endif
endif
endif
命令按钮“查当前用户所借书”的Click事件代码为:
ifempty(thisform.text1.value)
messagebox("借书证号不能为空",48,"重要提示")
else
thisform.grid1.visible=.t.
thisform.grid1.recordsourcetype=4
thisform.grid1.recordsource="sele借书证号,书号,借出日期from借阅
表where借书证号=alltrim(thisform.text1.value)intocursg1"
endif
命令按钮“查当前书被借情况”的Click事件代码为:
ifempty(thisform.text2.value)
messagebox("书号不能为空",48,"重要提示")
else
thisform.grid1.visible=.t.
thisform.grid1.recordsourcetype=4
thisform.grid1.recordsource="sele借书证号,书号,借出日期from借阅
表where书号=alltrim(thisform.text2.value)intocursg2"
endif
命令按钮“退出”的Click事件代码为:
thisform.release
6.设计“还书登记”表单
实现目标:
根据用户输入的借书证号和书号办理还书登记手续,输入的借书证号
和书号后要有检验功能,看是否为合法的号码,表单提供用列表框浏览并选择借
书证号和书号的功能,也提供当前借书证号已借书的情况和当前书号的书被借的
情况。
本表单还可对还书的借期进行检查,超期提示罚款,交款可自动登记到罚
款表中。
实现过程:
新建表单,在表单上添加控件,以“还书登记”为名存入到form子文
件夹下,设计界面如图以下所示。
本表单除“还书登记”的Click事件代码不同外,其余均与“借书登记”表单类似,
“还书登记”的Click事件代码为:
sele借阅表
locafor借书证号=alltrim(thisform.text1.value)and书号
=alltrim(thisform.text2.value)
if!
found()
messagebox("该同志没有借此书!
",48,"友好提示")
return
else
ts=int((datetime()-借出日期)/3600/24)
ifts>60
aa=messagebox("您借的这本书已超期"+alltrim(STR(ts-1))+"天,按规定
要罚款";
+alltrim(str((ts-60)*0.05,10,2))+"元"+chr(13)+"您交了罚款吗?
",36,"重要提示")
ifaa=7
messagebox("对不起,不能办理还书手续!
",48,"友好提示")
return
else
insertinto罚款表value(allt(thisform.text1.value)+"的
"+alltrim(thisform.text2.value)+"书交罚款
",(ts-60)*0.05,datetime(),"")
messagebox("费用已交入库!
",48,"友好提示")
delefrom借阅表where借书证号=alltrim(thisform.text1.value)and
书号=alltrim(thisform.text2.value)
setdeleon
messagebox("已办理了还书手续!
",48,"友好提示")
endif
else
delefrom借阅表where借书证号=alltrim(thisform.text1.value)and
书号=alltrim(thisform.text2.value)
messagebox("已办理了还书手续!
",48,"友好提示")
setdeleon
endif
endif
7.设计“借阅统计”表单
实现目标:
按读者、部门、职称统计借书数,统计各本书、各类书借书数,统计
借书超期情况。
实现过程:
新建表单,添加控件,将表单以“借阅统计”为名存入到form子文件
夹中,设计的界面如图以下所示
命令按钮“按读者统计借书数”的Click事件代码为:
thisform.grid1.recordsourcetype=4
thisform.grid1.recordsource="sele借阅表.借书证号,姓名,职称,count(*)
as借出数;
from读者表,借阅表where读者表.借书证号=借阅表.借书证号groupby;
借阅表.借书证号orderby借阅表.借书证号intocursg1"
命令按钮“按部门统计借书数”的Click事件代码为:
thisform.grid1.recordsourcetype=4
thisform.grid1.recordsource="sele部门,count(*)as借出数from读
者表,借阅表where读者表.借书证号=借阅表.借书证号groupby部
门intocursg2"
命令按钮“按职称统计借书数”的Click事件代码为:
thisform.grid1.recordsourcetype=4
thisform.grid1.recordsource="sele职称,count(*)as借出数from读
者表,借阅表where读者表.借书证号=借阅表.借书证号groupby职
称intocursg3"
命令按钮“统计各书借出数”的Click事件代码为:
thisform.grid1.recordsourcetype=4
thisform.grid1.recordsource="sele图书表.书号,书名,数量,count(*)as
借出数from图书表,借阅表where图书表.书号=借阅表.书号groupby
图书表.书号order