PB课程设计报告.docx
- 文档编号:29930098
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:23
- 大小:478.02KB
PB课程设计报告.docx
《PB课程设计报告.docx》由会员分享,可在线阅读,更多相关《PB课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
PB课程设计报告
Powerbuilder课程设计报告
学院:
计算机技术与软件工程学院
学号:
09033699
姓名:
冯树新
班级:
计算机信息管理09302
指导教师:
曹薇
一:
实训项目名称:
小型图书管理系统开发设计
二实训地点:
凌峰楼B512机房及寝室
三:
实训目的及要求:
掌握利用PowerBuilder开发数据库应用系统的方法、步骤和技能。
主要包括窗口及控件的使用、数据窗口对象的创建、数据窗口控件的使用、应用程序与DBMS的连接、应用程序的发布等技能。
四:
实训需求分析:
根据所给的基于sqlanywhere图书信息数据库设计开发出一个小型简单的图书管理系统。
该图书管理系统主要具有如下五个功能:
图书类型信息的查询和编辑,图书信息的查询和编辑,用户信息的查询和编辑,借还书记录的生成和查询,指定用户借还书记录的查询。
此外,可根据思考题(见群共享中压缩文件PB0520)中的要求优化图书管理系统的功能,为程序添加登陆窗口,将程序生成应用程序发布台,实现自动编号等功能。
也可自行对系统进行功能的优化。
五:
设计阶段:
1,设计环境:
在一台安装了PB软件的电脑上创建一个基于sqlanywhere的图书信息数据库。
新建一个文件夹PB实训内容,在创建三个子文件夹分别存放图片,程序,数据库。
2,设计任务及步骤:
A:
在sqlanywhere中将数据库book0429连接,连接成功后。
打开PB11.5,新建workplace命名为book.在建立一个应用程序book。
B:
在pb中在工具栏中点击database图标,连接数据库并添加数据源,新建newprofile设置好参数后,将连接数据源代码粘贴到应用程序的open事件中。
C:
创建一个登陆窗口,w_password。
在该窗口中的登录按钮中的click事件中编写代码,是程序完成一个使用密码登录到主窗口的功能。
即加强系统的安全性。
代码如下:
ifsle_1.text="zrr"then
ifsle_2.text="123456"then
open(w_main)
close(w_passward)
else
intflag
stringmsg,mas
msg="输入密码有误,请重新输入!
"
mas="输入超过三次,系统将自动关闭!
"
flag=integer(sle_2.tag)
ifflag<=1then
messagebox("提示",msg)
sle_2.text=""
setfocus(sle_2)
else
messagebox("提示",mas)
halt
endif
flag++
sle_2.tag=string(flag)
endif
else
messagebox("提示","用户名不正确!
")
sle_1.text=""
endif
并且在应用程序的open事件中打开此窗口。
D:
创建图书管理系统主窗口。
新建一个窗口,分别添加五个功能按钮,及一个关闭按钮,按钮名称分别为:
cb_book,cb_user,cb_type,cb_log,cb_close.再为每个按钮创建相应的数据窗口。
分别为:
dw_book,dw_user,dw_type,dw_log分别用来显示:
图书信息,用户信息,图书类型信息,借书记录;再来为记录查询窗口创建用户及图书信息记录等的联合查询数据窗口,dw_query_log,dw_query_user等。
再为每个按钮创建窗口,设计合理界面,将不同的数据窗口添加到相应的窗口中。
将数据窗口与窗口事件相关联。
现在分别介绍如何设计窗口,并为窗口事件编写代码:
因为图书信息,用户信息,图书类型信息,借书记录这四个窗口的功能和界面类似,为了避免重复编程和设计,采用先建立祖先窗口,再利用继承方式创建。
现在来设计祖先窗口dw_base,设计后的界面如下图:
首先为dw_base祖先窗口创建函数:
自定义函数1):
f_checkempty
stringmsg
dw_1.setcolumn(col_name)
ifdw_1.gettext()=""then
msg="["+col_title+"]值不能为空!
请修改..."
messagebox("提示",msg,exclamation!
)
return-1
else
return1
endif
自定义函数2):
f_resetitem
//该函数将当前行中数据恢复到编辑之前的值,对应“取消”按钮
stringorg_value
integeri,cols//i为计数变量,col存放列总数
longcurrow//记录当前行
currow=dw_1.getrow()//获得当前行的行号
//分析当前行的编辑状态
choosecasedw_1.getitemstatus(currow,0,primary!
)//返回指定
//缓冲区中指定行列的数据项的编辑状态
casenew!
newmodified!
//new表示新插入行,还没设任何值
//newmodified表示新插入的行某些列已设置值
dw_1.deleterow(0)//直接删除该行
casedatamodified!
//如果数据被修改过则进行恢复
cols=integer(dw_1.object.datawindow.column.count)
//使用数据窗口属性表达式读取数据窗口对象的总列数
fori=1tocols//采用循环方式恢复所有数据列的值
//先检查列数据是否被修改
ifdw_1.getitemstatus(currow,i,primary!
)=datamodified!
then
org_value=dw_1.getitemstring(currow,i,primary!
true)
dw_1.setitem(currow,i,org_value)
//如果被修改,则读取其原始值修复
//getitemstring函数得到数据窗口空间中指定行列的字符串值
endif
next
endchoose
自定义函数3):
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()))
endif
f_setend()
自定义空函数:
f_setstart4),f_setend5)
设置好函数和属性后,分别为各个按钮编程,并为窗口的open事件编程是在主窗口中运行时,设置该窗口与主窗口的位置。
为重载按钮编程,代码如下:
dw_1.retrieve()
为查找按钮编程,代码如下:
open(w_find)//此处查找窗口在下面的操作中创建。
为添加按钮编程,代码如下:
longnewrow
newrow=dw_1.insertrow(0)
dw_1.setrow(newrow)
f_setstatus(false)
为删除按钮编程,代码如下:
stringmsg="是否删除当前记录?
请确定..."
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)
endif
为编辑按钮编程,代码如下:
ifthis.text="编辑"then
f_setstatus(false)
else
f_setstatus(true)
f_resetitem()
endif
为保存按钮编程,代码如下:
integerrtn
ifthis.text="保存"then
rtn=dw_1.update()
ifrtn=1then
COMMITUSINGSQLCA;
else
ROLLBACKUSINGSQLCA;
endif
parent.title=parent.tag
endif
为关闭按钮编程,代码如下:
close(parent)
为dw_baseopen事件编程:
this.x=w_main.x+this.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!
)//设置行指示标记
祖先窗口创建完毕。
接下来分别继承dw_base窗口创建w_book,w_user,w_type,w_log窗口。
设置w_book的数据窗口对象为dw_book,
W_user的数据窗口对象为dw_user,
W_type的数据窗口对象为dw_type,
W_log的数据窗口对象为dw_log
这样各个与按钮关联的主要窗口创建好了,接下来就是主窗口与窗口的关联了,以图书信息窗口为例:
在主窗口的图书信息按钮的click事件中编写代码:
open(w_book)
this.enabled=false//打开图书信息窗口
再在w_book的close事件中写代码:
w_main.cb_book.enabled=true//当关闭窗口时此按钮重新有效。
其他窗口的关联于此类似,在此不再赘述。
创建好的窗口如下图:
添加菜单:
file——new——pbobject——menu新建一菜单依次填下对应的相关信息并在每个按钮的toolbar的toolbaritemname属性下选择图标,美化界面。
并在每个按钮的click事件下写入对应的打开窗体的代码。
如下图
在窗口open事件下编写代码:
his.x=w_main.x+w_main.width
this.y=w_main.y
dw_2.settransobject(sqlca)
dw_2.object.datawindow.readonly=true
dw_1.settransobject(sqlca)
dw_1.retrieve()
dw_1.object.datawindow.readonly=true
dw_1.setrowfocusindicator(hand!
)
ddlb_1.selectitem
(1)
ddlb_2.selectitem
(1)
sle_1.text="<编号或名字>"
sle_1.tag="1"
在查找按钮下编写代码:
//根据设定条件在数据窗口控件dw_1中查找用户记录
stringfstr
longsrow,frow
ifthis.tag=""then
ifsle_1.text=""orsle_1.text="<编号或姓名>"then
messagebox("提示","请先输入要查找用户的【编号】或【姓名】!
")
sle_1.setfocus()
sle_1.selecttext(1,len(sle_1.text))
return
endif
ifisnumber(sle_1.text)then
fstr="id='"+string(long(sle_1.text),"000")+"'"
else
fstr="namelike'%"+sle_1.text+"%'"
//fstr="namelike"+sle_1.text+""
endif
else
fstr=this.tag
endif
//进行查找
srow=long(sle_1.tag)
frow=dw_1.find(fstr,srow,dw_1.rowcount())
iffrow>0then
this.text="继续"
this.tag=fstr
sle_1.tag=string(frow+1)
dw_1.setrow(frow)
dw_1.scrolltorow(frow)
else
this.text="查找"
this.tag=""
sle_1.tag="1"
messagebox("提示","没找到符合要求的用户!
请重设查找条件")
sle_1.setfocus()
sle_1.selecttext(1,len(sle_1.text))
endif
在dw_1的rowfocuschanged事件中:
dw_1.setcolumn("id")
ifdw_1.gettext()<>""then
dw_2.retrieve(dw_1.gettext())
endif//使之与dw_2关联
在下拉框ddlb_1和ddlb_2中设置item属性
并为ddlb_1和ddlb_2编写代码:
Ddlb_1的selectionchanged事件中:
stringfstr
choosecaseindex
case1
fstr=""
case2
fstr="notisnull(log_return)"
case3
fstr="isnull(log_return)"
endchoose
dw_2.setfilter(fstr)
dw_2.filter()
ddlb_2的selectionchanged事件中:
stringsstr
choosecaseindex
case1
sstr=""
case2
sstr="book_id"
case3
sstr="book_title"
case4
sstr="log_borrow"
case5
sstr="log_return"
endchoose
ifsstr=""then
sstr="log_borrowA,book_idA"
else
ifcbx_1.checkedthen
sstr+="A"
else
sstr+="D"
endif
endif
dw_2.setsort(sstr)
dw_2.sort()
创建w_find查找窗口:
在w_find的open事件中编写代码:
this.width=3000
this.height=1200
pwin=parentwindow()
choosecasepwin.classname()
case"w_type"
ddlb_1.additem("编号*id")
ddlb_1.additem("名称*title")
case"w_user"
ddlb_1.additem("编号*id")
ddlb_1.additem("姓名*name")
case"w_book"
ddlb_1.additem("编号*id")
ddlb_1.additem("类型*typeid")
ddlb_1.additem("书名*title")
ddlb_1.additem("作者*author")
ddlb_1.additem("出版社*company")
case"w_log"
ddlb_1.additem("记录编号*id")
ddlb_1.additem("图书编号*bookid")
ddlb_1.additem("用户编号*userid")
ddlb_1.additem("借出日期*borrow")
ddlb_1.additem("归还日期*return")
endchoose
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()
在w_find的dectivate事件中编写代码:
ifthis.width<>3000then
this.width=3000
this.height=1200
endif
为查找按钮编程,代码如下:
stringmsg="",fstr=""
integernbit
longfrow
pwin.dw_1.selectrow(0,false)//取消之前所有行的加亮显示
ifsle_1.text=""then
msg="查询目标不能为空!
请输入..."
messagebox("提示",msg,exclamation!
)
sle_1.setfocus()
return
endif
nbit=pos(ddlb_1.text,"*")
fstr=mid(ddlb_1.text,nbit+1)
choosecasefstr
case"row"
ifnotisnumber(sle_1.text)orsle_1.text="0"orlong(sle_1.text)>long(sle_1.tag)then
msg="【记录行】的范围是1-"+sle_1.tag+"!
请修改..."
messagebox("提示",msg,exclamation!
)
sle_1.setfocus()
return
endif
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()
return
case"borrow","return"
fstr="string("+fstr+",'yy-mm-dd')"+ddlb_2.text+"'"+sle_1.text+"'"
caseelse
fstr+=""+ddlb_2.text+"'"+sle_1.text+"'"
//fstr="namelike'%"+sle_1.text+"%'"
endchoose
cb_find.tag=fstr
cb_next.tag="1"
cb_next.eventclicked()
为下一条按钮编程,代码如下:
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
msg="没找到满足条件的记录!
请重新设置条件..."
messagebox("提示",msg,exclamation!
)
cb_find.tag=""
cb_next.tag="1"
cb_next.enabled=false
sle_1.setfocus()
sle_1.selecttext(1,len(sle_1.text))
else
pwin.dw_1.scrolltorow(frow)
pwin.dw_1.selectrow(frow,true)
cb_next.tag=string(frow+1)
cb_next.enabled=true
parent.width=300
parent.height=100
cb_close.setfocus()
endif
代码写完后并将w_find的窗口类型设置为响应类型response!
四.运行及测试程序:
六:
实训心得:
通过该图书管理系统所要求的五个基本功能,如图书类型信息的查询和编辑,图书信息的查询和编辑,用户信息的查询和编辑,借还书记录的生成和查询,指定用户借还记录的查询等掌握了开发应用系统的方法、步骤和技能:
主要包括:
窗口及控件的使用、数据窗口对象的创建、数据窗口控件的使用、SQLAnywhere数据库的连接和数据源的创建。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PB 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)