资源描述
中原工学院信息商务学院学生实践环节报告专用纸 第 24 页
实验 图书管理系统
一 实验目的
(1)培养综合应用PowerBuilder进行应用程序设计和解决实际问题的能力;
(2)加深对PowerBuilder编程环境和编程方法的理解;
(3)发挥各人的想像能力和分析能力,拓展思维空间;
(4)掌握应用程序设计的基本方法;
(5)巩固已经学到的编程技术,学会在编程中学习编程。
二 实验要求
(1)图书信息的录入和删除,出版社信息管理等;
(2)图书的检索(包括按作者姓名、出版时间、出版社名称、图书类别、书名、关键宇等);
(3)图书的租借(包括借书登记、限借数量控制、还书登记、过期罚款计算等);
(4)借书证件的管理(包括办新证件,挂失、注销等)
(5)系统设置(主要是不同类型证件的可借书的总量和借书时间等)
三 实验内容
详细步骤:
数据库的设计:创建数据库,数据库名user,在数据库里建表1~表4,表1 Bookinfo为存放图书信息表,表2 certificateinfo证件表为证件表,表3 LOAN 图书租借表,表4 SET系统设置表,表如下:
表1 Bookinfo
字段名
意义
数据类型
宽度
Null
PrimaryKey
BookID
图书编号
Char
8
No
√
ISBN
ISBN书号
Char
30
Yse
Title
书名
Char
40
Yse
Publish
出版日期
Char
Yse
Author
作者
Char
30
Yse
Words
字数(千字)
Integer
Yse
PublisherID
出版社ID
Char
4
Yse
Number
印刷册数
Char
Yse
Price
定价
Money
Yse
Keyword
关键字
Char
30
Yse
Abstract
摘要
Varchar
400
Yse
表2 certificateinfo
字段名
意义
数据类型
宽度
Null
PrimaryKey
Cert_id
借书证书ID
Char
5
No
√
Cert_name
证件名称
Char
10
Yes
Cert_value
证件号码
Char
18
Yes
Name
姓名
Char
8
Yes
Depart
所在部门
Char
20
Yes
flag
标记
Tinyint
Yes
表3 LOAN
表4 SET
1.创建菜单
创建一个菜单,菜单名为caidan,所有窗口在菜单中实现。
2.创建窗口对象
登陆界面
(1)主界面:创建一个新的弹出式窗口对象,Title为“图书管理系统”关联菜单“caidan”
界面如下:
(2)图书管理:
a.新书录入界面:
创建一个新的弹出式窗口对象,
(1)布置窗口中的静态文本控件
窗口中只有一个标题使用静态文本控件,在窗口控件下拉列表工具栏图标中选择静态文 本控件,然后在窗口上单击,生成静态文本控件。在Text属性栏中输入“新书录入”。
(2)布置窗口中的单行编辑框控件
在窗口控件下拉列表工具栏图标中选择单行编辑框控件,然后在窗口上单击,生成单行编辑框控件。使用 Ctrl和 T组合键进行外观复制生成 5个单行编辑框。
单行编辑框的名称
控件名称
说明字段
Sle_bookid
图书编号
Sle_isbn
ISBN书号
Sle_publish
书名
Sle_author
作者
Sle_words
字数
Sle_publisberid
出版社ID
Sle_number
印刷册数
Sle_price
定价
Sle_keyword
关键字
Sle_abstract
摘要
(3)布置窗口中的多行编辑框控件
在窗口控件下拉列表工具栏图标中选择多行编辑框控件,然后在窗口上单击,生成多行编辑框控件。其名称Name为“dw_abstract”,选中Hscrollbar和Vscrollbar。多行编辑框控件用于输入摘要。
(4)布置窗口中的“确定”按钮控件
在窗口控件下拉列表工具栏图标中选择命令按钮控件,然后在窗口上单击,生成命令按钮控件。窗口中共有两个命令按钮控件,设置一个按钮的Text属性为“确定”,名称为cb_ok.选中 default属性。
“确定”按钮的Clicked事件脚本为;
string str_BookId,str_ISBN,str_Title,str_Author,str_PublisherID,str_Keyword,str_Abstract
long I_Words,I_price,i,I_Number,Flag1
date str_Publish
if sle_bookid.text=""then return messagebox("缺少数据","请输入图书编号")
str_BookId=trim(sle_bookid.text)
str_ISBN=trim(sle_isbn.text)
str_Title=trim(sle_title.text)
str_Publish=date(sle_publish.text)
str_Author=trim(sle_author.text)
str_PublisherID=trim(sle_publisherid.text)
I_Number=long(sle_number.text)
str_Keyword=trim(sle_keyword.text)
str_Abstract=trim(mle_abstract.text)
I_Words=long(sle_words.text)
I_Price=long(sle_price.text)
Flag1=0
select BookID
into :i
from BookInfo
where BookID=:str_BookId;
if i<>0 then messagebox("书号重复","书号重复,请重新输入!")
INSERT INTO "BookInfo"
("BookID",
"ISBN",
"Title",
"Publish",
"Author",
"Words",
"PublisherID",
"Number",
"Keyword",
"Abstract",
"Price",
"Flag")
VALUES
(: str_BookId,
: str_ISBN,
: str_Title,
: str_Publish,
: str_Author,
: I_Words,
: str_PublisherID,
: I_Number,
: str_Keyword,
: str_Abstract,
: I_Price,
: Flag1);
sle_bookid.text=""
sle_isbn.text=""
sle_title.text=""
sle_publish.text=""
sle_author.text=""
sle_publisherid.text=""
sle_number.text=""
sle_publisherid.text=""
sle_keyword.text=""
mle_abstract.text=""
sle_words.text=""
sle_price.text=""
sle_bookid.setfocus()
(3)关联新书录入窗口 m到菜单中
打开创建主菜单选择新书录入菜单,添加事件的脚本为:
open(m)
(4)具体界面如下:
b.旧书销毁界面:
创建一个新的弹出式窗口对象
(1)布置窗口中的静态文本控件
窗口中只有一个标题使用静态文本控件,在窗口控件下拉列表工具栏图标中选择静态文 本控件,然后在窗口上单击,生成静态文本控件。在Text属性栏中输入“旧书销毁”。
(2) 按书号检索
按书号查询的数据窗口对象是一个条件查询的数据窗口,其设计步骤为:
l)单击New图标按钮,弹出“New”对话框;
2)选择DataWindow选项页,双击FreeForm图标,弹出“Choose Data Source for FreeForm DataWindow”对话框;
3)选择“SQL Select”数据源方式,单击“Next”按钮,弹出“Select Table”对话框;
4)在 Table列表框中选择 student表,单击“Open”按钮,这时弹出 Select 画板;
5)单击菜单Design∣Retrieval Arguments…弹出Specify Retrieval Arguments”对话框,在 Name栏中输入ls_name,在Type下拉列表框中选择 String,单击“OK”按钮,对话框关闭:
6)在 Select画板的 Table Layout子窗口中的表框中列出了 student表的全部字段的名称,每单击一个字段,该字段就变为蓝底白字,表示选中,同时,会在上面的“Selection List:”区域中排列出该宇段。如果单击选中的字段,就会变为不被选中,该字段从上面的排列中消失。单击每一个字段,将全部字段选中;
7)在 Select画板的 Where子窗口中单击 Colunm栏,右边出现一个“▼”符号,单击“▼”按钮,弹出student表的所有字段,选择“student”.“name”,在右边的Value栏中,单击右键,选择弹出菜单中的“Arguments...”,弹出一个小窗口,内部有刚才定义的变量“:Is_name”,单击选中它,单击“Paste”按钮,“:ls_name”就出现在Value栏中。
8)单击“Return”图标按钮,弹出“Select Colorl Border Settings”对话枢,单击“Next”按钮,弹出“Ready to Create FreeForm DataWindow”对话框。,该对话框对数据窗口对象的主要属性进行了小结。单击“Finish”按钮,弹出“Specify Retrieval Arguments”对话框,要求对检索变量ls_name进行赋值,以便对数据库进行数据检索,并将检索结果放到Preview子窗口中。可以在Value栏中输人一个姓名后按“OK”键进行检索,也可以按“Cancel”键不进行检索,然后进入数据窗口对象画板。
9)在数据窗口对象画板中,将字段名称改为中文,调整字段的位置和大小,设置文字颜色、背景颜色和字段边框;
10)选择菜单Edit∣Select∣Select Colunms,将所有字段全部选中,然后在Properties属性卡中选择 Edit页,选中“Display Only”复选框,不选中“Auto Selection”复选框;
11)保存数据窗口对象名称为 d1。
(4) 编写脚本:
在“查询”按钮的Clicked事件脚本为;
string str_bookid
str_bookid=trim(sle_bookid.text)
if not str_bookid="" then
dw_bookid.retrieve(str_bookid)
else
MessageBOX("数据不全","请输入待删除的书名。")
end if
sle_bookid.setFocus()
在“确定销毁”按钮的Clicked事件脚本为;
string str_bookid
long i
str_bookid=trim(sle_bookid.text)
delete
from "BookInfo"
where BookID=:str_bookid;
dw_bookid.retrieve(str_bookid)
select BookID
into :i
from "BookInfo"
where BookID=:str_bookid;
if i=0 then messagebox("提示",string(str_bookid)+"的信息已经不存在")
sle_bookid.text=""
(5)关联新书录入窗口 n到菜单中
打开创建主菜单选择旧书销毁菜单中,添加事件的脚本为:
open(n)
(6)具体界面如下:
(4)图书查询:
图书查询包括两个查询:按书名查询,按日期查询。(这里只写按书名查询详细步骤,按日期查询和按书名查询功能一样,略之)
1) 设计步骤如下:
创建一个新的弹出式窗口对象。数据窗口对象选择Grid风格。增加一个检索参数 Retrieval Argument为 ls_author,在 Select画板的 Where子窗口中设计的条件为:
"bookinfo"."author"like:ls_author
保存数据窗口对象
(2)布置一个静态文本控件,其Text为“按书名查询”,一个单行编辑框,为Name 为“sle_author ”;一个命令按钮, Text属性为“查询”,选中“Default”复选框;还有一个数据窗口控件,其Name为dw_author”;DataObject为d5,选中HScrollBar和VScrollBar复选框。保存所做的工作。
(3)编写脚本:
在“确定”按钮的Clicked事件脚本为;
string str_title
str_title=trim(sle_title.text)
if not str_title="" then
dw_title.retrieve(str_title)
else
MessageBOX("数据不全","请输入书名(可以不全)!")
end if
sle_title.setFocus()
在a窗口的Open事件中,再增加数据窗口 dw_author使用数据库的事物对象和初始化的代码:
dw_author.SetTransObject(SQLCA)
(4)关联新书录入窗口m到菜单中
打开创建主菜单选择按作者查询菜单,添加事件的脚本为:
open(a)
两个界面如下:
按书名查询
按日期查询
(5)证件管理:
a. 办新证件
创建一个新的弹出式窗口对象,窗口名“student”。
(1)布置窗口中的静态文本控件
窗口中只有一个标题使用静态文本控件,在窗口控件下拉列表工具栏图标中选择静态文 本控件,然后在窗口上单击,生成静态文本控件。在Text属性栏中输入“办新证件”。
2)布置窗口中的单行编辑框控件
在窗口控件下拉列表工具栏图标中选择单行编辑框控件,然 后在窗口上单击,生成单行编辑框控件。使用 Ctrl和 T组合键进行外观复制生成 5个单行编辑框。
单行编辑框的名称
控件名称
说明字段
Sle_cert_id
借书证ID
Sle_cert_value
证件号码
Sle_departy
所在部门
(3)布置窗口中的单选钮和组合框控件
窗口中共有两组单选钮,一组为性别选择,另一组为党团员选择。性别选择单选钮的设计方法为:在窗口控件下拉列表工具栏图标中选择组合框控件,然后在窗口上单击,生成组合框控件、再选择单选钮控件,在组合框中单击,生成单选钮控件。设置其名称为rb_zero,Text为“0”,选中Checked属性;同样再在组合框中放置一个单选钮控件,设置其名称为rb_first,Text为“1”,不选中Checked属性;rb_two,Text为“2”,不选中Checked属性。
(说明:标记中的0是合法用户能借阅书籍,1是该证已挂失,2是该用户已经在黑名单里。)
(4)布置窗口中的下拉列表框控件
在窗口控件下拉列表工具栏图标中选择下拉列表框控件,然后在窗口上单击,生成下拉列表框控件。输入下拉列表框控件名称为ddlb_cert_name,不选中Sorted属性,选中Vscrollbar属性。单击下拉列表框控件后拖动下边框,调整下拉列表框展开后的长度。同样输入下拉列表框控件名称为ddlb_departy,不选中Sorted属性,选中Vscrollbar属性。单击下拉列表框控件后拖动下边框。
(5)布置窗口中的命令按钮控件
在窗口控件下拉列表工具栏图标中选择命令按钮控件,然后在窗口上单击,生成命令按钮控件。窗口中共有两个命令按钮控件,设置一个按钮的Text属性为“提交”,名称为cb_ok.选中 default属性;设置一个按钮的 Text属件为“退出”,名称为 cb_exit,选中 Cancel属性。
(6)编写脚本:
单击选中证件名称下拉列表框控件,选择右键弹出菜单中的Script菜单项,进人SCript子窗口,选择事件下拉列表框中的Constructor事件,输人以下脚本:
this.additem("教师")
this.additem("学生")
同时在所在部门下拉列表框控件,选择右键弹出菜单中的Script菜单项,进人SCript子窗口,选择事件下拉列表框中的Constructor事件,输人以下脚本:
this.additem("计算机科学系")
this.additem("英语系")
this.additem("工商管理系")
this.additem("经济系")
this.additem("信息管理系")
this.additem("艺术系")
this.additem("机械系")
this.additem("建筑系")
在“确定”按钮的Clicked事件脚本为;
string ID,depart,name,Cname,Cvalue,Ctype,flag
int i
ID=trim(sle_cert_id.text)
select Cert_id
into : i
from CertificateInfo
where Cert_id=: ID;
if i<>0 then
messagebox("重复","借书证ID重复,请重新输入!")
sle_cert_id.text=""
sle_cert_id.setfocus()
return
end if
if sle_cert_id.text=""then
messagebox("缺少数据","请输入借书证ID")
sle_cert_id.setfocus()
return
elseif sle_name.text=""then
messagebox("缺少数据","请输入姓名")
sle_name.setfocus()
return
end if
if sle_cert_value.text="" then
messagebox("缺少数据","请输入证件号")
return
elseif sle_depart.text="" then
messagebox("缺少数据","请输入系别或部门")
return
end if
if ddlb_cert_type.text="" then
messagebox("缺少数据","请选择借书证类型")
return
elseif ddlb_cert_name.text=""then
messagebox("缺少数据","请输入证件名称")
return
end if
name=trim(sle_name.text)
Cvalue=trim(sle_cert_value.text)
Cname=trim(ddlb_cert_name.text)
depart=trim(sle_depart.text)
Ctype=trim(ddlb_cert_type.text)
flag="0";
insert into "CertificateInfo"
("Cert_id",
"Name",
"Cert_name",
"Cert_value",
"Depart",
"Cert_type",
"flag"
)
values
(:ID,
:name,
:Cname,
:Cvalue,
:depart,
:Ctype,
:flag
);
sle_cert_id.text=""
sle_name.text=""
ddlb_cert_name.text=""
sle_cert_value.text=""
sle_depart.text=""
ddlb_cert_type.text=""
sle_cert_id.setfocus()
在“退出”按钮的Clicked事件脚本为;
close(book_jszzhuce)
(7)关联新书录入窗口student到菜单中
打开创建主菜单到办新证件菜单中,添加事件的脚本为:
open(student)
(8)具体界面如下:
b. 证件管理
创建一个新的弹出式窗口对象,窗口名“lose”。
设计步骤如下:
1)首先按借书证ID进行检索,显示出这个人的证件信息,之后设置四个按钮:确定、挂失、解锁、销毁,之后在每个按钮里输入脚本。
2)编写脚本:
在“确定”按钮的Clicked事件脚本为;
string ID
ID=trim(sle_ID.text)
if not sle_ID.text="" then
dw_ID.retrieve(ID)
else
messagebox("错误","请输入借书证号")
end if
在“挂失”按钮的Clicked事件脚本为;
string ID
long i
ID=trim(sle_ID.text)
update "CertificateInfo"
set "flag"=1
where "Cert_id"=:ID;
if not sle_ID.text="" then
dw_ID.retrieve(ID)
else
messagebox("错误","请输入借书证ID")
end if
在“解锁”按钮的Clicked事件脚本为;
string ID
long i
ID=trim(sle_ID.text)
update "CertificateInfo"
set "flag"=0
where "Cert_id"=:ID;
if not sle_ID.text="" then
dw_ID.retrieve(ID)
else
messagebox("错误","请输入借书证ID")
end if
在“销毁”按钮的Clicked事件脚本为;
string ID
long i
ID=trim(sle_ID.text)
delete
from "CertificateInfo"
where "Cert_id"=:ID;
if not sle_ID.text="" then
dw_ID.retrieve(ID)
else
messagebox("错误","请输入借书证ID")
end if
在lose窗口的Open事件中,再增加数据窗口 dw_cert_id使用数据库的事物对象和初始化的代码:
dw_cert_id.SetTransObject(SQLCA)
(3)关联新书录入窗口lose到菜单中
打开创建主菜单到证件挂失菜单中,添加事件的脚本为:
open(lose)
(4) 具体界面如下:
c. 借书证注销
创建一个新的弹出式窗口对象
设计步骤如下:
1)首先按借书证ID进行检索,显示出这个人的证件信息,之后设置两个按钮:确定,退出,之后在每个按钮里输入脚本。
2)编写脚本:
在“确定”按钮的Clicked事件脚本为;
string ID,depart,name,Cname,Cvalue,Ctype,flag
int i
ID=trim(sle_cert_id.text)
select Cert_id
into : i
from CertificateInfo
where Cert_id=: ID;
if i<>0 then
messagebox("重复","借书证ID重复,请重新输入!")
sle_cert_id.text=""
sle_cert_id.setfocus()
return
end if
if sle_cert_id.text=""then
messagebox("缺少数据","请输入借书证ID")
sle_cert_id.setfocus()
return
elseif sle_name.text=""then
messagebox("缺少数据","请输入姓名")
sle_name.setfocus()
return
end if
if sle_cert_value.text="" then
messagebox("缺少数据","请输入证件号")
return
elseif sle_depart.text="" then
messagebox("缺少数据","请输入系别或部门")
return
end if
if ddlb_cert_type.text="" then
messagebox("缺少数据","请选择借书证类型")
return
elseif ddlb_cert_name.text=""then
messagebox("缺少数据","请输入证件名称")
return
end if
name=trim(sle_name.text)
Cvalue=trim(sle_cert_value.text)
Cname=trim(ddlb_cert_name.text)
depart=trim(sle_depart.text)
Ctype=trim(ddlb_cert_type.text)
flag="0";
insert into "CertificateInfo"
("Cert_id",
"Name",
"Cert_name",
"Cert_value",
"Depart",
"Cert_type",
"flag"
)
values
(:ID,
:name,
:Cname,
:Cvalue,
:depart,
:Ctype,
:flag
);
sle_cert_id.text=""
sle_name.text=""
ddlb_cert_name.text=""
sle_cert_value.text=""
sle_depart.text=""
ddlb_cert_type.text=""
sle_cert_id.setfocus()
在“退出”按钮的Clicked事件脚本为;
close(book_jszzhuce)
在del窗口的Open事件中,再增加数据窗口 dw_cert_id使用数据库的事物对象和初始化的代码:
dw_cert_id.SetTransObject(SQLCA)
3)关联新书录入窗口del到菜单中
打开创建主菜单到证件注销菜单中,添加事件的脚本为:
open(del)
4)具体界面:
6)证件租借:
a.借书登记:
创建一个新的弹出式窗口对象,窗口名“bollow”。
设计步骤如下:
1) 首先根据借书证ID验证借书者是否存在,还是已经挂失,或在黑名单里,如果存在,点击验证按钮将会在借书人的姓名里,显示出该人的姓名,如果不存在将出来对话框显示不存在该信息或挂失或黑名单。
2) 根据图书编号检索要借的书的全部信息,同时显示出该借书证ID所借的书数量,之后方可借书。
3) 编写脚本:
在“查询借书情况”按钮的Clicked事件脚本为;
string certid
certid=trim(sle_certid.text)
if sle_certid.text="" then
messagebox("缺少数据","请输入借书证号")
sle_certid.setfocus()
return
end if
dw_jieshu.retrieve(certid)
在“借书”按钮的Clicked事件脚本为;
string certid,bookid
int Flag,i,j,m,n
i=2
j=2
datetime ld_loandates,ld_returndates
ld_loandates=datetime(today(),now())
ld_returndates=datetime(relativedate(today(),30))
certid=trim(sle_certid.text)
bookid=trim(sle_bookid.text)
Flag=1
if sle_certid.text="" then
messagebox("缺少数据","请输入借书证号")
sle_certid.setfocus()
return
elseif sle_bookid.text="" then
messagebox("缺少数据","请输入图书编号")
sle_bookid.setfocus()
return
end if
select "flag"
into :i
from "CertificateInfo"
where "Cert_id"=:certid;
if i=1 then
messagebox("警告","该借书证已经挂失,暂时无法使用!")
return
elseif i=2 then
messagebox("无效","没有该借书证信息!")
return
end if
select "flag"
into :j
from "BookInfo"
where "BookID"=:bookid;
if j=1 then
messagebox("警告","该书已经被借出!")
return
elseif j=2 then
messagebox("无效","没有该图书编号信息!")
return
end if
select count(BookID)
into :m
from "Loan"
where "Cert_id"=:certid and "flag"=1;
select "Set"."Number"
into :n
from "Set","CertificateInfo"
where "CertificateInfo"."Cert_id"=:certid and "CertificateInfo"."Cert_type"="Set"."Cert_type";
if m>=n then
messagebox("提示","超出了借书总数")
return
end if
insert into "Loan"
("BookID",
"Cert_id",
"Loandates",
"Returndates",
"flag"
)
values
(:bookid,
:certid,
:ld_loandates,
:ld_returndates,
:Flag
);
update "BookInfo"
set "flag"=1
where "BookID"=:bookid;
sle_certid.text=""
sle_bookid.text=""
dw_jieshu.retrieve(certid)
messagebox("警告","借书成功")
在bollow窗口的Open事件中,再增加数据窗口 dw_cert_id使用数据库的事物对象和初始化的代码:
dw_cert_id.SetTransObject(SQLCA)
4)关联新书录入窗口bollow到菜单中
打开创建主菜单到借书登记菜单中,添加事件的脚本为:
open(bollow)
5)具体界面:
b.还书:
创建一个新的弹出式窗口对象,窗口名“led”。
设计步骤如下:
1)根据图书编号验证是否存在该图书,如果存在光标移到图书名称的时候将显示图书名称,如果没有该图书信息将出来对话框显示没有该图书信息。
2)根据图书编号检索出该图书被借出情况,并显示该借书证ID所借出的数量和是否罚款
3)编写脚本:
在“还书”按钮的Clicked事件脚本为;
string bookid
datetime Rtime,times
double i,j,m
m=2
Rtime=datetime(today(),now())
if sle_bookid.text="" then
messagebox("缺少数据","请输入图书编号")
sle_bookid.setfocus()
return
end if
bookid=trim(sle_bookid.text)
select "Flag"
into :m
from "BookInfo"
where "BookID"=:bookid;
if m=0 then
messagebox("提示","该书已经归还")
return
elseif m=2 then
messagebox("提示","不存在该借书信息")
return
end if
select "Returndates"
into :times
from "Loan"
where "BookID"=:bookid;
i=daysafter(date(Rtime),date(times))
if i<0 then
messagebox("提示","超过借书时限,应该罚款")
return
end
展开阅读全文