数据库期末作品设计报告.doc_第1页
数据库期末作品设计报告.doc_第2页
数据库期末作品设计报告.doc_第3页
数据库期末作品设计报告.doc_第4页
数据库期末作品设计报告.doc_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

宁波工程学院数 据 库 应 用 基 础作 品 设 计 报 告设 计 作 品 题 目: 图书管理系统的设计与实现 学 院 名 称: 电子与信息工程学院 专 业: 电气工程及其自动化 班 级: 电气101 姓 名: 李盛标 学 号 10401170105 指 导 教 师: 邱雪娜 完成日期: 2013 年 11 月 15 日 引言数据库技术,已经成为先进信息技术的重要组成部分,是现代计算机信息系统和计算机应用系统的基础和核心。数据库从诞生到现在,在不到半个世纪的世纪的时间里,形成了坚实的理论基础、成熟的商业产品和广泛的应用领域,吸引了越来越多的研究者加入。 数据库的诞生和发展给计算机信息管理带来了一场巨大的革命。 计算机技术不断地应用到各行各业,大量的企业把数据存放在数据库中,并且通过T相关的代码语句来进行快速查询,获取比传统方式更高的效率。为了进一步加深和巩固我们所学的专业课程PowerBuilder数据库开发技术的基本理论知识,使我们所学的理论能够更好的和实际的专业联系起来,进一步培养学生的综合分析问题和解决问题的能力。使学生的得到收集、处理、应用资料信息的实践训练,同时全面的考核学生所掌握的基本理论知识及其实际的专业能力,从而达到提高学生素质的最终目的。学校安排了为期一个星期的实训课程,在这一个星期的时间里,希望学生能够利用所学到的知识创建一个图书馆的数据系统,来达到图书管理的需要。 2011年5月28日目录1 数据库设计 3 1.1 需求分析 3 1.2 数据库设计内容 3 1.3 概念设计 4 1.4 逻辑设计 5 1.5 窗口界面设计以及控件添加 6 1.6 表的设计以及数据的添加 92 数据库编程 10 2.1 数据库链接变成 10 2.2 操作界面代码 10 2.3 数据显示窗口编程 12 2.4 窗口按钮编程 16 2.5 图书类型窗口编程 18 2.6 查找窗口编程 19 2.7 用户窗口编程 25 2.8图书信息窗口编程 26 2.9 记录信息窗口编程 28 2.10 数据显示控件编程 313 实训心得 331 数据库设计熟悉PowerBuilder数据库开发技术实训环境,熟练掌握数据库、表、窗口界面的设计、图形按钮的添加、数据库的链接及函数的创建与应用,确立数据库创建的方向,对图书管理系统进行分析并设计系统实现需要哪几张表以及各表结构,确立数据库创建的要求,优化数据库界面的设计。1.1需求分析书籍是人类不可缺少的精神食粮,对学校来说,显得尤为重要。所以图书馆管理系统应该是能够为读者提供充足的信息和快捷的查询手段的一种方式。但一直以来人们都是使用传统的人工方式来管理图书,这就给图书馆的管理和图书信息的查阅带来了很大的不便,使得图书管理的效率低下、保密性差,时间一长,还容易造成文件和数据的丢失,给查找、更新和维护带来了很大的困难。图书管理工作繁琐,借阅频繁,包含大量的信息数据,因此就需要一个完善的图书管理系统来实现对这些数据的有效管理。从而达到对图书、读者、员工、借阅信息、查询进行统一管理,满足各类用户的需求。随着计算机信息技术的发展,数据库作为信息技术的一部分也在飞速的发展着。使用数据库对图书资源进行管理具有着手工管理无法比拟的优点,它检索迅速、查找方便、可靠性高、存储量大、成本低,所以数据库成为了图书馆管理最主要的选择。1.2 数据库设计内容利用PowerBuilder开发一个基于SQL Anywhere数据库的小型图书管理系统。该图书管理系统主要具有如下五个功能:图书类型信息的查询和编辑,图书信息的查询和编辑,用户信息的查询和编辑,借还书记录的生成和查询,指定用户借还书记录的查询。其中前三个功能是必须实现的功能,后两个功能为选做。此外,可根据思考题(见群共享中压缩文件PB0520)中的要求优化图书管理系统的功能,也可自行对系统进行功能的优化。1.3 概念设计概念设计是在需求分析上的,用概念数据模型来表示数据以及数据之间的相互联系,从上述的分析中规划处图书馆管理系统的实体有图书信息实体、图书类型实体、用户实体、借书记录实体。用户表性别用户编号用户姓名 用户实体E-R图类型编号图书编号图书信息表出版社作者图书名称 图书信息实体E-R图图书类型表类型名称类型编号 图书类型实体E-R图借书记录表记录编号图书编号 归还日期用户编号借出日期 借书记录实体E-R图1.4 逻辑设计 数据库逻辑设计是整个设计的前半段,包括所需的实体和关系,实体规范化等工作,在图书馆管理系统的数据库设计中,实体与实体之间通过关系得到了很好的连接,主要体现在一对一的关系、一对多的关系、多对多的关系。一个1:n联系可以转换为一个独立的关系模式一个1:1联系可以转换为一个独立的关系模式一个n:n联系可以转换为一个独立的关系模式1.5 窗体界面设计以及控件的添加 窗口设计和控件的添加是数据库开发必不可少的步骤之一,在图书馆管理系统数据库中也是如此,图书馆管理系统的窗口设计采用的是普通方式和继承方式并存的方法。如下图所示: 图11 登录窗口 图1-2 查找窗口 图1-3 记录窗口 图1-4 祖先窗口(数据显示窗口)设置好祖先窗口后,就要进行四个子孙窗口的设置分别是:图书类型窗口、图书信息窗口、用户信息窗口、记录信息窗口。在完成窗口和控件的设置之后,我们就要对控件 create datawindow的 dataobject 属性进行设置,使其与之相关的表格进行关联。 图1-5操作窗口 图1-6 系统树窗口1.6 表的设计以及表中数据的添加 在数据库中表的设计以及表中数据的添加都是至关重要的,此次实训设计中的表格以及数据如下图所示: 图1-7 图书信息表 图1-8 借书记录表 图1-9 图书类型表 图1-10 用户信息表2 数据库编程无论是采用哪种开发工具开发应用程序,编写代码是必不可少的。编写代码的过程也就是平常所说的编程,在 PowerBuilde 中采用的是Powerscript语言,它简单易学,编写程序的格式比较自由,用Powerscript语言编程能够更好、更快捷、更方便的创建数据库,更加准确的添加数据及其实现数据库一系列的功能。2.1 数据库链接代码应用对象的open事件SQLCA.DBMS = ODBCSQLCA.AutoCommit = FalseSQLCA.DBParm=ConnectString=DSN=mybook;UID=caowei;PWD=7077 connect using SQLCA;if SQLCA.SQLCode0 then messagebox(连接失败,原因:+sqlca.sqlerrtext,stopsign!)halt closeend ifopen(dljm)2.2 操作界面编程(1)界面设置代码如下:w_main的closequery事件string wtitle=if not cb_type.enabled then wtitle=图书类型elseif not cb_book.enabled then wtitle=图书信息elseif not cb_user.enabled then wtitle=用户信息elseif not cb_log.enabled then wtitle=借书记录elseif not cb_query.enabled then wtitle=记录查询end ifif wtitle thenmessagebox(系统提示, 请先关闭【+wtitle+】窗口!,exclamation!) return -1end if(2) 窗口关闭代码如下:cb_close的clicked事件close(parent)2.3 数据显示窗口编程(祖先窗口代码编辑)(1) 数据读取代码如下所示:dw_base的open事件this.x=w_main.x+w_main.widththis.y=w_main.ythis.tag=this.title/保存窗口的标题dw_1.settransobject(SQLCA)/连接事务对象dw_1.retrieve()/读取数据dw_1.object.datawindow.readonly=truedw_1.setrowfocusindicator(hand!)/设置行指示标记(2) 函数设置代码如下:1) dw_base的closequery事件string msg=部分数据被改动!是否存盘?if this.titlethis.tag thenchoosecasemessagebox(提示,msg,question!,yesnocancel!,1)case 1cb_save.event clicked()case 2 return 0case 3return 1end chooseend if2) f_checkempty自定义函数string msgdw_1.setcolumn(col_name)/设置当前列if dw_1.gettext()= thenmsg=+col_title+值不能为空!请修改.messagebox(提示,msg,exclamation!)return -1else return 1end if3) f_resetitem自定义函数string org_valueinteger i,cols/i为计数变量,col存放列总数long currow/记录当前行currow=dw_1.getrow()/获得当前行的行号choose case dw_1.getitemstatus(currow,0,primary!) case new!,newmodified!/new表示新插入行,还没设任何值 dw_1.deleterow(0)/直接删除该行case datamodified!/如果数据被修改过则进行恢复cols=integer(dw_1.object.datawindow.column.count)for i=1 to cols/采用循环方式恢复所有数据列的值if dw_1.getitemstatus(currow,i,primary!)=datamodified! then org_value=dw_1.getitemstring(currow,i,primary!,true)dw_1.setitem(currow,i,org_value) end ifnextend choose4) f_setstatus自定义函数long currow /存放当前记录行的行号f_setstart()dw_1.object.datawindow.readonly=viewmodecb_add.enabled=viewmodecb_del.enabled=viewmodecb_find.enabled=viewmodecb_reload.enabled=viewmodecb_close.enabled=viewmodeif viewmode then /若是浏览状态 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()end iff_setend()(5)dw_1的losefocus事件:this.accepttext()/数据窗口控件失去输入焦点时接收悬浮数据dw_1的itemfocuschanged事件long editrow /存放当前记录行的行号if this.tag then /若为编辑状态,见f_setstatus函数editrow=long(this.tag)/获得当前正在编辑的记录行号if editrowrow then/判断是否是当前行号this.setrow(editrow)/不是则修改当前行号this.scrolltorow(editrow)/让当前行可显示end ifend if2.4 窗口按钮编程(1) cb_add(添加)按钮:long newrownewrow=dw_1.insertrow(0)/插入新行到最后dw_1.setrow(newrow)/将新行设为当前行f_setstatus(false)调用f_setstatus函数将窗口设为编辑状态(2) cb_del(删除)按钮:string msg=是否删除当前记录?请确定.dw_1.selectrow(dw_1.getrow(),true)/加亮显示要删除的行if messagebox(提示,msg,Question!,YesNo!,2)=1 thendw_1.deleterow(0)/删除当前行elsedw_1.selectrow(dw_1.getrow(),false)/取消行的加亮显示end if(3) cb_edit(编辑)按钮:if this.text=编辑 thenf_setstatus(false)/若文本为“编辑”设为编辑状态elsef_setstatus(true)/若文本为“取消”设为浏览状态f_resetitem()/恢复原始数据值end if(4) cb_save(保存)按钮:integer rtnif this.text=保存 thenrtn=dw_1.update()/更新操作if rtn=1 then/更新成功 COMMIT USING SQLCA;/提交语句else/更新失败ROLLBACK USING SQLCA;/回滚语句end ifparent.title=parent.tag/让窗口的title恢复为原始titleend if(5) cb_close(关闭)按钮:close(parent)(6)cb_reload(重载)按钮:dw_1.retrieve()2.5 图书类型窗口编程(1) w_type窗口的close事件w_main.cb_type.enabled=true(2) cb_save的clicked事件if this.text=确定 then if f_checkempty(id,编号)=-1 then returnif f_checkempty(title,名称)=-1 then returnf_setstatus(true)/退出编辑状态parent.title=parent.tag+(*)/用户进行了编辑且未保存,修end if(3) 主窗口cb_type按钮的clicked事件:open(w_type)this.enabled=false其执行结果如下图2-1所示2.6 查找窗口编程(1) w_find窗口的编程:定义shared variables:dw_base pwin/注意祖先窗口名(2) w_find的open事件this.width=3000this.height=1200pwin=parentwindow()choose case pwin.classname()case w_typeddlb_1.additem(“编号*id”)ddlb_1.additem(“类型 *title)case w_userddlb_1.additem(“编号*id)ddlb_1.additem(姓名*name)case w_bookddlb_1.additem(编号*id)ddlb_1.additem(类型*typeid)ddlb_1.additem(书名*title)ddlb_1.additem(作者*author)ddlb_1.additem(出版社*company)case w_logddlb_1.additem(记录编号*id)ddlb_1.additem(图书编号*bookid)ddlb_1.additem(用户编号*userid)ddlb_1.additem(借出日期*borrow)ddlb_1.additem(归还日期*return)end chooseddlb_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事件if this.width3000 thenthis.width=3000this.height=1200end if(4) find窗口中ddlb_1控件的selectionchanged事件:if index=1 then/若指定按记录行查找ddlb_2.selectitem(1)/查找关系默认为“=”ddlb_2.enabled=false/禁止选择查找关系cb_next.enabled=falseelse/按其他方式查找ddlb_2.enabled=trueend ifsle_1.setfocus()(5) w_find窗口中cb_find按钮的clicked事件:string msg=,fstr=/fstr用于存放查询条件文本串integer nbitlong frow /存放查找到的记录行的行号pwin.dw_1.selectrow(0,false)/取消之前所有行的加亮显示if sle_1.text= then msg=查询目标不能为空!请输入.messagebox(提示,msg,exclamation!)sle_1.setfocus()returnend ifnbit=pos(ddlb_1.text,* fstr=mid(ddlb_1.text,nbit+1) choose case fstrcase row if not isnumber(sle_1.text) or sle_1.text=0 or & long(sle_1.text)long(sle_1.tag) then msg=【记录行】的范围是1- + sle_1.tag+ !请修改.messagebox(提示,msg,exclamation!)sle_1.setfocus()returnend if frow=long(sle_1.text)pwin.dw_1.scrolltorow(frow)pwin.dw_1.selectrow(frow,true) parent.width=300parent.height=100cb_close.setfocus()/以便按enter键关闭w_find窗口return/不再执行后续代码case borrow,return/查找日期型数据fstr=string(+fstr+,yy-mm-dd)+ddlb_2.text+sle_1.text+ fstr+=+ddlb_2.text+sle_1.text+ end choose cb_find.tag=fstr/查询条件保存到cb_find.tagcb_next.tag=1/设置查询起始行cb_next.event clicked()(6) cb_find窗口中cb_next按钮的clicked事件:string fstr,msglong srow,erow,frowfstr=cb_find.tag/获得查询条件srow=long(cb_next.tag) erow=long(sle_1.tag) frow=pwin.dw_1.find(fstr,srow,erow)if frow=0 thenmsg=没找到满足条件的记录!请重新设置条件.messagebox(提示,msg,exclamation!)cb_find.tag=/清除存放在cb_find.tag中的查找条件即fstrcb_next.tag=1/设置查询起始行cb_next.enabled=falsesle_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=300parent.height=100cb_close.setfocus()end if(7) w_find窗口中cb_close的clicked事件close(parent)(8) 在dw_base的查找按钮(cb_find)的clicked事件中编写:open(w_find)其运行结果如下图2-2所示2.7 用户窗口编程(1) w_user窗口的close事件w_main.cb_user.enabled=true(2) 保存按钮cb_save的clicked事件if this.text=确定 thenif f_checkempty(id,编号)=-1 then return if f_checkempty(name,姓名)=-1 then return f_setstatus(true)parent.title=parent.tag+(*)end if(3) 在w_main中关联w_user,cb_user按钮的clicked事件编程:open(w_user)this.enabled=false其运行结果如下图2-3所示2.8 图书信息窗口编程(1) w_book窗口的close事件w_main.cb_book.enabled=true(2) 保存按钮cb_save的clicked事件:if this.text=确定 thenif f_checkempty(id,编号)=-1 then return if f_checkempty(title,书名)=-1 then return if f_checkempty(author,作者)=-1 then return if f_checkempty(company,出版社)=-1 then return f_setstatus(true)parent.title=parent.tag+(*)end if(3) 添加按钮cb_add的clicked事件代码long rowstring newidrow=dw_1.getrow() /得到新增行行号newid=string(row,00000)dw_1.setitem(row,id,newid)/直接设置列值,id为列名dw_1.setcolumn(2)(4) 在w_main中关联w_book,为cb_book的clicked事件编程:open(w_book)this.enabled=false其运行结果如下图2-4所示2.9 记录信息窗口编程(1) w_log窗口的close事件w_main.cb_log.enabled=true(2) 保存按钮cb_save的clicked事件代码string fstr,msglong rowif this.text=确定 thenrow=dw_1.getrow()choose case dw_1.getitemstatus(row,0,primary!)case new!,newmodified!if f_checkempty(bookid,图书编号)=-1 then return if f_checkempty(userid,用户编号)=-1 then return dw_1.setcolumn(bookid)fstr=bookid=+dw_1.gettext()+and isnull(return)if dw_1.find(fstr,row - 1,1)0 thenmsg=编号为+dw_1.gettext() + 的图书借出!请重选. messagebox(提示,msg,exclamation!)returnend ifcase els

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论