数据库期末作品设计分析报告Word文档格式.docx
《数据库期末作品设计分析报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据库期末作品设计分析报告Word文档格式.docx(30页珍藏版)》请在冰点文库上搜索。
2.5图书类型窗口编程……………………………………18
2.6查找窗口编程…………………………………………19
2.7用户窗口编程…………………………………………25
2.8图书信息窗口编程……………………………………26
2.9记录信息窗口编程……………………………………28
2.10数据显示控件编程……………………………………31
3实训心得………………………………………………………33
1数据库设计
熟悉《PowerBuilder数据库开发技术》实训环境,熟练掌握数据库、表、窗口界面的设计、图形按钮的添加、数据库的链接及函数的创建与应用,确立数据库创建的方向,对图书管理系统进行分析并设计系统实现需要哪几张表以及各表结构,确立数据库创建的要求,优化数据库界面的设计。
1.1需求分析
书籍是人类不可缺少的精神食粮,对学校来说,显得尤为重要。
所以图书馆管理系统应该是能够为读者提供充足的信息和快捷的查询手段的一种方式。
但一直以来人们都是使用传统的人工方式来管理图书,这就给图书馆的管理和图书信息的查阅带来了很大的不便,使得图书管理的效率低下、保密性差,时间一长,还容易造成文件和数据的丢失,给查找、更新和维护带来了很大的困难。
图书管理工作繁琐,借阅频繁,包含大量的信息数据,因此就需要一个完善的图书管理系统来实现对这些数据的有效管理。
从而达到对图书、读者、员工、借阅信息、查询进行统一管理,满足各类用户的需求。
随着计算机信息技术的发展,数据库作为信息技术的一部分也在飞速的发展着。
使用数据库对图书资源进行管理具有着手工管理无法比拟的优点,它检索迅速、查找方便、可靠性高、存储量大、成本低,所以数据库成为了图书馆管理最主要的选择。
1.2数据库设计内容
利用PowerBuilder开发一个基于SQLAnywhere数据库的小型图书管理系统。
该图书管理系统主要具有如下五个功能:
图书类型信息的查询和编辑,图书信息的查询和编辑,用户信息的查询和编辑,借还书记录的生成和查询,指定用户借还书记录的查询。
其中前三个功能是必须实现的功能,后两个功能为选做。
此外,可根据思考题(见群共享中压缩文件PB0520)中的要求优化图书管理系统的功能,也可自行对系统进行功能的优化。
1.3概念设计
概念设计是在需求分析上的,用概念数据模型来表示数据以及数据之间的相互联系,从上述的分析中规划处图书馆管理系统的实体有图书信息实体、图书类型实体、用户实体、借书记录实体。
用户实体E-R图
图书信息表
作者
图书编号
图书名称
类型编号
出版社
图书信息实体E-R图
图书类型实体E-R图
借书记录表
记录编号
用户编号
借出日期
归还日期
借书记录实体E-R图
1.4逻辑设计
数据库逻辑设计是整个设计的前半段,包括所需的实体和关系,实体规范化等工作,在图书馆管理系统的数据库设计中,实体与实体之间通过关系得到了很好的连接,主要体现在一对一的关系、一对多的关系、多对多的关系。
一个1:
n联系可以转换为一个独立的关系模式
1联系可以转换为一个独立的关系模式
一个n:
1.5窗体界面设计以及控件的添加
窗口设计和控件的添加是数据库开发必不可少的步骤之一,在图书馆管理系统数据库中也是如此,图书馆管理系统的窗口设计采用的是普通方式和继承方式并存的方法。
如下图所示:
图1—1登录窗口
图1-2查找窗口
图1-3记录窗口
图1-4祖先窗口(数据显示窗口)
设置好祖先窗口后,就要进行四个子孙窗口的设置分别是:
图书类型窗口、图书信息窗口、用户信息窗口、记录信息窗口。
在完成窗口和控件的设置之后,我们就要对控件createdatawindow的dataobject属性进行设置,使其与之相关的表格进行关联。
图1-5操作窗口图1-6系统树窗口
1.6表的设计以及表中数据的添加
在数据库中表的设计以及表中数据的添加都是至关重要的,此次实训设计中的表格以及数据如下图所示:
图1-7图书信息表
图1-8借书记录表
图1-9图书类型表图1-10用户信息表
2数据库编程
无论是采用哪种开发工具开发应用程序,编写代码是必不可少的。
编写代码的过程也就是平常所说的编程,在PowerBuilde中采用的是Powerscript语言,它简单易学,编写程序的格式比较自由,用Powerscript语言编程能够更好、更快捷、更方便的创建数据库,更加准确的添加数据及其实现数据库一系列的功能。
2.1数据库链接代码
应用对象的open事件
SQLCA.DBMS="
ODBC"
SQLCA.AutoCommit=False
SQLCA.DBParm="
ConnectString='
DSN=mybook;
UID=caowei;
PWD=7077'
"
connectusingSQLCA;
ifSQLCA.SQLCode<
>
0then
messagebox("
连接失败"
"
原因:
+sqlca.sqlerrtext,stopsign!
)
haltclose
endif
open(dljm)
2.2操作界面编程
(1)界面设置代码如下:
w_main的closequery事件
stringwtitle="
ifnotcb_type.enabledthen
wtitle="
图书类型"
elseifnotcb_book.enabledthen
图书信息"
elseifnotcb_user.enabledthen
用户信息"
elseifnotcb_log.enabledthen
借书记录"
elseifnotcb_query.enabledthen
记录查询"
ifwtitle<
then
messagebox("
系统提示"
"
请先关闭【"
+wtitle+"
】窗口!
exclamation!
return-1
(2)窗口关闭代码如下:
cb_close的clicked事件
close(parent)
2.3数据显示窗口编程(祖先窗口代码编辑)
(1)数据读取代码如下所示:
dw_base的open事件
this.x=w_main.x+w_main.width
this.y=w_main.y
this.tag=this.title//保存窗口的标题
dw_1.settransobject(SQLCA)//连接事务对象
dw_1.retrieve()//读取数据
dw_1.object.datawindow.readonly=true
dw_1.setrowfocusindicator(hand!
)//设置行指示标记
(2)函数设置代码如下:
1)dw_base的closequery事件
stringmsg="
部分数据被改动!
是否存盘?
ifthis.title<
this.tagthen
choosecasemessagebox("
提示"
msg,question!
yesnocancel!
1)
case1
cb_save.eventclicked()
case2
return0
case3
return1
endchoose
endif
2)f_checkempty自定义函数
stringmsg
dw_1.setcolumn(col_name)//设置当前列
ifdw_1.gettext()="
msg="
["
+col_title+"
]值不能为空!
请修改..."
msg,exclamation!
return-1
else
return1
3)f_resetitem自定义函数
stringorg_value
integeri,cols//i为计数变量,col存放列总数
longcurrow//记录当前行
currow=dw_1.getrow()//获得当前行的行号
choosecasedw_1.getitemstatus(currow,0,primary!
)
casenew!
newmodified!
//new表示新插入行,还没设任何值
dw_1.deleterow(0)//直接删除该行
casedatamodified!
//如果数据被修改过则进行恢复
cols=integer(dw_1.object.datawindow.column.count)
fori=1tocols//采用循环方式恢复所有数据列的值
ifdw_1.getitemstatus(currow,i,primary!
)=datamodified!
thenorg_value=dw_1.getitemstring(currow,i,primary!
true)
dw_1.setitem(currow,i,org_value)
next
endchoose
4)f_setstatus自定义函数
longcurrow//存放当前记录行的行号
f_setstart()
dw_1.object.datawindow.readonly=viewmode
cb_add.enabled=viewmode
cb_del.enabled=viewmode
cb_find.enabled=viewmode
cb_reload.enabled=viewmode
cb_close.enabled=viewmode
ifviewmodethen//若是浏览状态
cb_edit.text="
编辑"
cb_save.text="
保存"
dw_1.tag="
//清除数据窗口控件保存的当前记录行的行号
else
cb_edit.text="
取消"
cb_save.text="
确定"
//设置数据窗口控件的初始编辑状态
currow=dw_1.getrow()//获得当前行的行号
dw_1.tag=string(currow)
dw_1.scrolltorow(currow)//滚屏,确保当前行可见
dw_1.selectrow(currow,false)//去掉加亮
dw_1.setfocus()//将输入焦点移到数据窗口控件中
dw_1.setcolumn
(1)//将第一列设为当前列
dw_1.selecttext(1,len(dw_1.gettext()))
f_setend()
(5)dw_1的losefocus事件:
this.accepttext()//数据窗口控件失去输入焦点时接收悬浮数据
dw_1的itemfocuschanged事件
longeditrow//存放当前记录行的行号
ifthis.tag<
then//若为编辑状态,见f_setstatus函数
editrow=long(this.tag)//获得当前正在编辑的记录行号
ifeditrow<
rowthen//判断是否是当前行号
this.setrow(editrow)//不是则修改当前行号
this.scrolltorow(editrow)//让当前行可显示
2.4窗口按钮编程
(1)cb_add(添加)按钮:
longnewrow
newrow=dw_1.insertrow(0)//插入新行到最后
dw_1.setrow(newrow)//将新行设为当前行
f_setstatus(false)调用f_setstatus函数将窗口设为编辑状态
(2)cb_del(删除)按钮:
是否删除当前记录?
请确定..."
dw_1.selectrow(dw_1.getrow(),true)//加亮显示要删除的行
ifmessagebox("
msg,Question!
YesNo!
2)=1then
dw_1.deleterow(0)//删除当前行
else
dw_1.selectrow(dw_1.getrow(),false)//取消行的加亮显示
(3)cb_edit(编辑)按钮:
ifthis.text="
f_setstatus(false)//若文本为“编辑”设为编辑状态
f_setstatus(true)//若文本为“取消”设为浏览状态
f_resetitem()//恢复原始数据值
(4)cb_save(保存)按钮:
integerrtn
rtn=dw_1.update()//更新操作
ifrtn=1then//更新成功
COMMITUSINGSQLCA;
//提交语句
else//更新失败
ROLLBACKUSINGSQLCA;
//回滚语句
parent.title=parent.tag//让窗口的title恢复为原始title
(5)cb_close(关闭)按钮:
(6)cb_reload(重载)按钮:
dw_1.retrieve()
2.5图书类型窗口编程
(1)w_type窗口的close事件
w_main.cb_type.enabled=true
(2)cb_save的clicked事件
iff_checkempty("
id"
编号"
)=-1thenreturn
iff_checkempty("
title"
名称"
f_setstatus(true)//退出编辑状态
parent.title=parent.tag+"
(*)"
//用户进行了编辑且未保存,修
(3)主窗口cb_type按钮的clicked事件:
open(w_type)
this.enabled=false
其执行结果如下图2-1所示
2.6查找窗口编程
(1)w_find窗口的编程:
定义sharedvariables:
dw_basepwin//注意祖先窗口名
(2)w_find的open事件
this.width=3000
this.height=1200
pwin=parentwindow()
choosecasepwin.classname()
case"
w_type
ddlb_1.additem(“编号*id”)
ddlb_1.additem(“类型*title"
w_user"
ddlb_1.additem(“编号*id"
ddlb_1.additem("
姓名*name"
w_book"
编号*id"
类型*typeid"
书名*title"
作者*author"
出版社*company"
w_log"
记录编号*id"
ddlb_1.additem("
图书编号*bookid"
用户编号*userid"
借出日期*borrow"
归还日期*return"
ddlb_1.selectitem
(1)
ddlb_2.selectitem
(1)
ddlb_2.enabled=false//按记录行查找时禁止选择查找关系
cb_next.tag="
1"
//存放查找记录的起始行
cb_next.enabled=false//开始时不能操作“下一个”按钮
sle_1.tag=string(pwin.dw_1.rowcount())//存放总的记录行数
sle_1.text="
sle_1.setfocus()
(3)find的deactivate事件
ifthis.width<
3000then
this.width=3000
(4)find窗口中ddlb_1控件的selectionchanged事件:
ifindex=1then//若指定按记录行查找
ddlb_2.selectitem
(1)//查找关系默认为“=”
ddlb_2.enabled=false//禁止选择查找关系
cb_next.enabled=false
else//按其他方式查找
ddlb_2.enabled=true
(5)w_find窗口中cb_find按钮的clicked事件:
fstr="
//fstr用于存放查询条件文本串
integernbit
longfrow//存放查找到的记录行的行号
pwin.dw_1.selectrow(0,false)//取消之前所有行的加亮显示
ifsle_1.text="
查询目标不能为空!
请输入..."
return
nbit=pos(ddlb_1.text,"
*"
fstr=mid(ddlb_1.text,nbit+1)
choosecasefstr
row"
ifnotisnumber(sle_1.text)orsle_1.text="
0"
or&
long(sle_1.text)>
long(sle_1.tag)then
【记录行】的范围是1-"
+sle_1.tag+"
!
sle_1.setfocus()
return
frow=long(sle_1.text)
pwin.dw_1.scrolltorow(frow)
pwin.dw_1.selectrow(frow,true)
parent.width=300
parent.height=100
cb_close.setfocus()//以便按enter键关闭w_find窗口
return//不再执行后续代码
borrow"
return"
//查找日期型数据
fstr="
string("
+fstr+"
'
yy-mm-dd'
)"
+ddlb_2.text+"
'
+sle_1.text+"
fstr+="
cb_find.tag=fstr//查询条件保存到cb_find.tag
cb_next.tag="
//设置查询起始行
cb_next.eventclicked()
(6)cb_find窗口中cb_next按钮的clicked事件:
stringfstr,msg
longsrow,erow,frow
fstr=cb_find.tag//获得查询条件
srow=long(cb_next.tag)
erow=long(sle_1.tag)
frow=pwin.dw_1.find(fstr,srow,erow)
iffrow=0then
没找到满足条件的记录!
请重新设置条件..."
cb_find.tag="
//清除存放在cb_find.tag中的查找条件即fstr
s