《药品库房管理系统毕业设计.doc》由会员分享,可在线阅读,更多相关《药品库房管理系统毕业设计.doc(33页珍藏版)》请在三一办公上搜索。
1、学校代码:12904学 号:1004109112中图分类: 密 级:无吉林农业工程职业技术学院毕 业 论 文药品库房管理系统学生姓名: 指导教师: 所在学院(系):信息工程系学科专业:计算机信息管理吉林农业工程职业技术学院中国四平2013年5月题 目:药品库房管理系统摘 要在药店里,药品库房管理是一项非常重要的工作,使用人工方式管理各项品信息不仅效率低下,而且容易出错、安全性很差。并且在实际操作中,数据的查找和维护都不容易实现。药品库房管理系统,就是为了解决这些问题而设计的。其目的是实现药品信息管理和出入库记录的快速高效检索,使操作简单安全,提高工作效率和质量。本系统的主要功能是完成品库房管理
2、的日常工作,包括材料的入库、出库以及库存材料信息的管理维护等。目 录第一章 技术背景和分析.1第二章 系统实施.1 2.1 系统设计.1 2.1.1系统分析.2 2.1.1.1用户需求分析.2 2.1.1.2系统可行性分析.2 2.1.2系统功能模块划分.3 2.2数据库设计.4 2.2.1数据库需求分析.4 2.2.2数据库逻辑设计.4 2.2.3数据库实现.5 2.3表单设计.7 2.3.1材料信息维护表单.7 2.3.2材料信息查询表单.14 2.3.3出入库管理表单.15 2.3.4用户向导制作报表.23 2.3.5主表单设计.25 2.4主控程序设计.26第三章 问题讨论.27 3.
3、1系统功能设计的不完善.27 3.2代码维护.27 3.3数据维护.27 3.3.1数据库的安全问题.27 3.3.2数据的安全问题.27第四章 总结.284.1论文总结 284.2工作展望 28参考文献 29 致谢30第一章 技术背景和分析Visual FoxPro是为数据库结构和应用程序开发而设计的功能强大的面向对象的软件。无论是组织信息、运行查询、创建集成的关系型数据库系统,还是为最终用户编写功能全面的数据管理应用程序,Visual FoxPro都可以提管理数据所需的工具,可以在应用程序或数据库开发的任何一个领域中提供帮助。本系统使用Visual FoxPro来设计开发的原因是Visua
4、l FoxPro具有三大特点。一、强大的管理功能VFP提了一种称为“项目管理器”(program manager)的管理工具,可供用户对所开发项目中的数据、文档、源代码和类库(class library)等资源进行集中高效的管理,开发与维护均更加方便。二、大量使用可视化的界面操作工具VFP 6.0提供向导(wizard)、 设计器(designer)、生成器(builder)等3类界面操作工具,达40种之多。它们普遍采用图形界面,能帮助用户简便快捷地完成各种查询和设计任务。VFP的设计器普遍配有工具栏和弹出式的快捷菜单。每个工具按钮对应一项功能;用户可通过它们方便地完成操作或设计控件,不必编程
5、或很少编程即可实现美观实用的应用程序界面。大多数设计器还提快捷菜单,内含最常用的菜单选项,供用户随时调用。三、支持面向对象的程序设计VFP除继续使用传统的面向过程的程序设计外,还支持面向对象的程序设计。允许用户对“对象”(object)和“类”(class)进行定义,并编写相应的代码。由于VFP预先定义和提供了一批基类,用户可以在基类的基础上定义自己的类和子类(subclass),从而利用类的继承性(inheritance),减少编程的工作量,加快软件的开发过程。使用结构化的程序设计,同时应用面向对象的程序设计,构成了VFP程序设计的特点,同时为用户的编程带来了很大的方便。第二章 系统实施2.
6、1系统设计本系统设计包括两个部分:系统分析和系统功能模块设计。2.1.1系统分析2.1.1.1用户需求分析某药店根据业务发展的要求,选定建立一个“药品库房管理系统”,以取代人工管理。开发目的如下:l、必须要指定的专门人员才能对药品仓库的日常事务进行管理。2、能够对药品库房内的有关各种药品材料的数据进行输入、修改与查询。3、当有药品入库或出库时,能够更新药品的数据进行输入、修改与查询。4、要求有专门的报表存储药品材料的出入库信息,能够打印报表。2.1.1.2 系统可行性分析1、四项基本内容的实现用户在该药品库房管理系统中需要的四项基本内容完全可以利用VFP进行的相关设置(主要是表单设置)来加以实
7、现。例如可以用VFP进行登录界面设计,在表单上添加命令按钮以实现对用户身份的验证,达到用户要求的“必须要指定的专门人才对药品仓库的日常事务进行管理”的目的。2、数据库分析药店中所有药品材料的信息都可以在VFP项目管理器的数据库中建立与维护。该药品仓库管理系统查询药品信息只需要两张数据表(即材料信息表和出入库信息表)就可以满足需求。3、系统的发布及其运行环境。(1)系统的发布:VFP项目管理器提供了一个管理应用系统的集成环境,而且VFP提供的安装向导,支持用户为所开发的项目创建一套“安装(磁)盘”,供系统发布使用。(2)系统的运行环境:操作系统Windows9x系列、用户自定义安装需要85MB硬
8、盘空间,完全安装需要90MB硬盘空间,内存要求16MB以上。推荐使用VGA或更高分辨率的显示器。2.1.2 系统功能模块划分根据以上分析,可以进行系统的功能模块划分,如图21所示: 图21系统功能模块功能模块划分图中各个模块的功能如下:1、登录界面通过输入管理员的用户名和密码进入系统。2、主表单用户可以在主表单上根据需要进行选择以实现各种不同的操作。3、库存材料信息的维护新材料入库时,系统允许管理员添加新材料的记录。材料出库或产品过期需要清除时,管理员可以删除产品信息。记录有误时管理员可以修改数据表中的记录。4、库存材料信息的查询信息查询是仓库管理系统的重要组成部分。用户可以按照材料编号和材料
9、名称等查询条件查询仓库中的材料信息。5、材料的入库、出库新产品或材料需要出入库时,管理员可以直接进行出入库操作;出入库操作后,程序自动修改库存材料的信息。6、报表打印功能可以打印库存表,出入库记录的报表。2.2 数据库设计2.2.1数据库需求分析根据上一节的系统分析,本系统主要是实现仓库药品信息和出入库信息的管理。因此,该药品仓库管理系统的数据关系比较简单,只需要两张数据表:材料信息表和出入库记录信息表。2.2.2 数据库逻辑设计本系统中需要两个数据表:材料信息表和出入库信息表,数据表的字段和结构如表1和表2所示:表1材料信息表表2出入库信息表2.2.3 数据库实现本系统开发中,首先创建库房管
10、理系统的数据库,然后在数据库中创建需要的数据表,为数据表添加记录。如果需要,还可以设计视图和存储过程以及触发器等。下面设计本系统数据库,详细步骤如下:1、创建项目文件“库房管理.pjx”,保存路径为project库房管理系统。2、在该项目中新建数据库“仓库管理”,保存路径为project仓库管理系统data。3、在数据库中新建材料信息表,保存路径为project仓库管理系统data材料信息.dbf。在Table Designer的Fields选项卡中根据表1的内容设置数据表的字段及其属性,如22图所示:图22 “材料信息”表的字段设置切换到Indexes选项卡,设置表索引。如图23所示。将“材
11、料编号”设置为主索引,索引类型为Primary。将“材料名称”设置为普通索引,索引类型为Regular。图23 “材料信息”表的索引设置关闭Table Designer,在“材料信息”表中添加记录。具体做法是:在Project Designer中选中材料信息表,单击Browse按钮,浏览数据表。然后在Visual FoxPro 6.0的主窗口中选取Table | Append New Record菜单命令,在数据表中添加新的记录。出入库信息的创建方法与材料信息表相似,保存路径也与材料信息表相同。表的字段设置和索引分别如图24、图25所示:图24 “出入库信息”表的字段设置图25 “出入库信息”
12、表的索引设置表建立完成后,打开Database Designer,创建数据表之间的关联关系。其结果如图26所示。其中,材料信息表和出入库信息表之间通过索引“材料编号”相关联。图26 数据表的关联关系至此,数据库和数据表的设计完成。下面进入库房管理系统的表单设计。2.3 表单设计本系统主要功能模块的实现由4个表单完成,分别是:材料信息维护表单、材料信息查询表单、出入库管理表单和用于选择操作类型的主界面。2.3.1 材料信息维护表单材料信息维护表单的功能主要是完成材料信息的添加、修改和删除等操作。1、材料信息维护表单设计在项目中新建表单,保存路径为“project仓库管理系统forms材料信息.s
13、cx”,在表单的Data Environment中添加“材料信息”表。在表单上添加控件并设置控件的属性,得到如图27所示的表单。图27材料信息维护表单整个“材料信息维护”表单分为3部分,最上面的一部分是在一个Container控件中显示当前材料记录的信息,如材料编号、材料名称、规格、单位和单价等。中间是4个命令按钮分别表示第一条记录、上一条记录、下一条记录、和最后一条记录。下面是维护操作功能按钮,包括添加、修改、删除、保存和退出5种功能按钮。2、添加响应代码下面为表单添加响应代码,实现上述各项功能。“首记录”按钮。单击按钮时,显示“材料信息”表的第一记录。即表中第一条记录被设为当前记录。该按钮
14、的Click事件代码如下:Go topThisform.Refresh“末记录”按钮。单击按钮时,显示“材料信息”表的最后一条记录,即表中最后一条记录被设置为当前记录。该按钮的Click事件代码如下:Go bottomThisform.Refresh“上一条”按钮。单击按钮时,显示当前记录上一条记录。该按钮的Click事件代码如下:thisform.text1.readonly=.t.thisform.text2.readonly=.t.thisform.text3.readonly=.t.thisform.text4.readonly=.t.thisform.text5.readonly=.
15、t. thisform.text6.readonly=.t. thisform.text7.readonly=.t.thisform.text8.readonly=.t.thisform.edit1.readonly=.t.&设置各Text Box和Edit的ReadOnly属性if eof() go bottomelse skip 1endifthisform.refresh“下一条”按钮。单击按钮时,显示当前记录的下一条记录。该按钮的Click事件代码如下:thisform.text1.readonly=.t.thisform.text2.readonly=.t.thisform.text
16、3.readonly=.t.thisform.text4.readonly=.t.thisform.text5.readonly=.t.thisform.text6.readonly=.t.thisform.text7.readonly=.t.thisform.text8.readonly=.t.thisform.edit1.readonly=.t.&设置各Text Box控件的属性if eof() go topelse skip 1endifthisform.refresh“添加”按钮。单击按钮时,完成材料添加功能,在材料信息表中加入一条新记录。该按钮的Click事件代码如下:go bott
17、omtempnum=val(材料信息.材料编号)&获取最后一条记录的材料编号字段append blankgo bottomreplace 材料信息.材料编号 with alltrim(str(tempnum+1)&在表尾添加一条新记录mand1.enabled=.f.mand2.enabled=.f.mand3.enabled=.f.mand4.enabled=.f.mand5.enabled=.f.mand6.enabled=.f.mand7.enabled=.f.mand8.enabled=.f.mand9.enabled=.f.&设置各按钮的有效状态,在添加新记录的过程中,为防止出错,应
18、设置除“保存”按钮之外的其他按钮为无效。这样,在输入完成后,只能使用“保存”按钮来保存记录。thisform.text1.readonly=.f.thisform.text2.readonly=.f.thisform.text3.readonly=.f.thisform.text4.readonly=.f.thisform.text5.readonly=.f.thisform.text6.readonly=.f.thisform.text7.readonly=.f.thisform.text8.readonly=.f.thisform.edit1.readonly=.f.&设置各TextBox
19、控件的属性thisform.refresh“修改”按钮。单击按钮时,修改当前记录。该按钮的Click事件代码如下:mand1.enabled=.f.mand2.enabled=.f.mand3.enabled=.f.mand4.enabled=.f.mand5.enabled=.f.mand6.enabled=.f.mand7.enabled=.f.mand8.enabled=.f.mand9.enabled=.f.thisform.text1.readonly=.f.thisform.text2.readonly=.f.thisform.text3.readonly=.f.thisform.
20、text4.readonly=.f.thisform.text5.readonly=.f.thisform.text6.readonly=.f.thisform.text7.readonly=.f.thisform.text8.readonly=.f.thisform.edit1.readonly=.f.thisform.refresh&本段代码主要功能是设置表单上各控件的可读写状态。“删除”按钮。单击按钮时,删除表中当前记录。该按钮的Click事件代码如下:tempstr=messagebox(“是否删除记录?”,4+32+256,”删除对话框”)if tempstr=6set exclus
21、ive ondeletepackset exclusive offthisform.refreshendif&在删除记录之前,首先设置表的操作方式为Exclusive(独占方式),然后用Delete语句为当前记录加上删除标记,最后使用Pack语句删除有标记的记录。“保存”按钮。单击按钮时,将表单中用户输入的信息保存到“材料信息”表。该按钮的Click事件代码如下:dimension aaa(9)&定义数组aaa(1)=thisform.text1.valueaaa(2)=thisform.text2.valueaaa(3)=thisform.text3.valueaaa(4)=thisform
22、.text4.valueaaa(5)=thisform.text5.valueaaa(6)=thisform.text6.valueaaa(7)=thisform.text7.valueaaa(8)=thisform.text8.valueaaa(9)=thisform.text9.value&将表单中的输入值存储到数组中replace 材料信息.材料编号 with aaa(1)replace 材料信息.规格 with aaa(2)replace 材料信息.单价 with aaa(3)replace 材料信息.产地 with aaa(4)replace 材料信息.生产厂家 with aaa(5
23、)replace 材料信息.材料名称 with aaa(6)replace 材料信息.单位 with aaa(7)replace 材料信息.数量 with aaa(8)replace 材料信息.备注 with aaa(9)&用数组修改表记录的各字段mand1.enabled=.t.mand2.enabled=.t.mand3.enabled=.t.mand4.enabled=.t.mand5.enabled=.t.mand6.enabled=.t.mand7.enabled=.t.mand8.enabled=.t.mand9.enabled=.t.&设置各按钮的有效状态thisform.tex
24、t1.readonly=.t.thisform.text2.readonly=.t.thisform.text3.readonly=.t.thisform.text4.readonly=.t.thisform.text5.readonly=.t.thisform.text6.readonly=.t.thisform.text7.readonly=.t.thisform.text8.readonly=.t.thisform.edit1.readonly=.t.thisform.refresh&设置TextBox控件为只读“退出”按钮。单击该按钮,退出表单。该按钮的Click事件代码如下:This
25、form.Release另外表单初始化时“保存”按钮应该为不可用,且显示的内容应该处于只读状态,因此为表单的Init事件添加如下代码:thisform.text1.readonly=.t.thisform.text2.readonly=.t.thisform.text3.readonly=.t.thisform.text4.readonly=.t.thisform.text5.readonly=.t.thisform.text6.readonly=.t.thisform.text7.readonly=.t.thisform.text8.readonly=.t.thisform.edit1.re
26、adonly=.t.mand8.enabled=.f.设计完成后,运行表单。如图28所示:图28材料信息维护表单的运行结果2.3.2材料信息查询表单材料信息查询表单的功能是实现材料信息的快速检索。当用户输入材料编号或名称后,可快速检索出所有符合条件的材料记录。1、材料信息查询表单设计新建表单“材料信息查询”,保存路径为“project库房管理系统forms材料信息查询.scx”,在表单的Data Environment中添加“材料信息表”。在表单上添加控件并设置相应的属性,得到如图29所示的表单。图29材料信息查询表单在表单上添加了一个Grid控件,用来显示查询的结果,将Grid的Readon
27、ly属性设置为.t.。并且通过一个Combo下拉框控件来实现多依据的查询,本系统中根据材料编号和材料名称实现名称查询,将Combo的Readonly属性设置为.t.。2、添加响应代码Combo用于选择查询依据。此处用户分别选择“材料编号”或“材料名称”进行查询。因此,在表单初始化时,要为Combo Box控件输入初始值。为存储查询结果,还要定义一个在表单运行过程中有效的Cursor公共变量。因此,为表单的Init事件添加如下代码:Public tempcursorThisform.Combo1.additem(“材料编号”)Thisform.Combo1.additem(“材料名称”)This
28、form.refresh“查询”按钮完成材料信息的查询。根据用户选择的查询依据和输入的查询数据的值,在表中查找符合条件的记录,显示在表格中。“查询”按钮的Click事件代码如下:if thisform.Combo1.text=”材料编号” select *;from project库房管理系统data材料信息.dbf;where 材料编号=alltrim(thisform.text1.value);into cursor tempcursor; thisform.grid1.recordsource=tempcursor;endifthisform.refresh&按照材料编号查询if thi
29、sform.Combol,text=“材料名称”select *;from project仓库管理系统data材料信息.dbf;where 材料名称=alltrim(thisform.text1.value);into cursor tempcursor; thisform.grid1.recordsource=tempcursor;endifthisform.refresh&按照材料名称查询3、运行表单设计完成后,运行表单,结果如图210所示:图210材料信息查询表单的运行结果2.3.3出入库管理表单出入库管理表单实现的功能是记录材料的出入库信息,并修改相应材料信息表。1、出入库管理表单设计
30、出库和入库的功能、结构都比较相似,因而这里用一个表单来实现它们。表单中使用PageFrame控件,分两个页面分别实现入库和出库的功能。新建表单“出入库管理”,保存路径为“project仓库管理系统forms出入库管理.scx”。在表单的Data Environment中添加“出入库信息”数据表。该表单使用了一个PageFrame控件Pageframe1,将Pageframe的PageCount属性值设置为2,即PageFrame设置为两页,分别用于“入库”管理和“出库”管理。将Page1的标题设为“入库管理”;将Page2的标题设为“出库管理”。2、入库管理(1)入库管理表单设计在表单的Pag
31、eFrame控件单击鼠标右键,在弹出的菜单中选取Edit命令,使其处于编辑状态。切换到Page1页面,添加所需控件并设置其相应属性,界面如图211所示。图211入库管理表单在Page1上添加的控件类型有Label、Text、Command Button、Container和Edit Box。Edit Box控件和Text Box控件类似,不同之处在于Edit Box控件可以对多行字符串进行编辑,并且有垂直滚动条,通常用来显示或设置备注字段。下面首先介绍Edit Box控件特有的属性。如表3所示:表3 Edit Box控件的常用属性Edit Box控件具有的与Text Box控件一样的属性,这里
32、不再赘述。(2)添加响应代码“确定” 按钮的Click事件代码如下:select材料编号;from project仓库管理系统data材料信息.dbf; where 材料编号=alltrim(thisform.pageframe1.page1.text1.value);into cursor tempcursor&根据材料编号在材料信息表中查找记录 temp 材料编号=tempcursor.材料编号 if empty(temp 材料编号) then messagebox(“你要添加的材料在材料库中”+chr(13)+chr(10)+”没有找到,请先到材料库中”+chr(13)+chr(10)+
33、”登记新材料 ”+temp材料编号,0+64,”材料检测”) thisform.pageframe1.page1.text2.readonly=.t.thisform.pageframe1.page1.text3.readonly=.t.thisform.pageframe1.page1.text4.readonly=.t.thisform.pageframe1.page1.text5.readonly=.t.thisform.pageframe1.page1.edit1.readonly=.t.&材料信息表中没有该编号的材料,提示用户更新材料信息表,并设置各Text控件为只读。elsemes
34、sagebox(“继续下面的入库信息填写”,0+64,”材料检测”)thisform.pageframe1.page1.text2.readonly=.f.thisform.pageframe1.page1.text3.readonly=.f.thisform.pageframe1.page1.text4.readonly=.f.thisform.pageframe1.page1.text5.readonly=.f.thisform.pageframe1.page1.edit1.readonly=.f.endif&材料编号正确,允许用户继续输入。Close tablesthisform.pag
35、eframe1.page1.refresh当进行入库登记时,用户首先输入“入库材料编号”。如果材料信息表中有该材料的信息,且“Txt出入库编号”、“Txt出入库日期”、“Txt经手人”、“Txt数量”、“Txt备注”的ReadOnly属性为.F.,用户才可以继续输入。如果该材料不在材料信息表中,将提示用户首先检查材料信息表。如图212所示,当输入的“入库材料编号”不在材料表中时,提示用户检查材料表。图212材料编号不在材料表中时的运行结果如果材料编号正确,用户可以进行“入库”操作。单击“入库”按钮时,根据用户的输入完成入库操作并更新入库信息表。“入库”按钮的Click事件代码如下:dimens
36、ion bbb(7)&定义数组temp 数量=val(alltrim(thisform.pageframe1.page1.text4.value)bbb(1)= alltrim(thisform.pageframe1.page1.text2.value)bbb(2)= “i”bbb(3)= alltrim(thisform.pageframe1.page1.text1.value)bbb(4)= alltrim(thisform.pageframe1.page1.text3.value)bbb(5)= alltrim(thisform.pageframe1.page1.text4.value)
37、bbb(6)= alltrim(thisform.pageframe1.page1.text5.value)bbb(7)= alltrim(thisform.pageframe1.page1.editt1.value)&将入库信息存储在数组中replace 出入库信息.出入库编号 with bbb(1)replace 出入库信息.类型 with bbb(2)replace 出入库信息.材料编号 with bbb(3)replace 出入库信息.出入库日期 with bbb(4)replace 出入库信息.数量 with bbb(5)replace 出入库信息.经手人 with bbb(6)re
38、place 出入库信息.备注 with bbb(7)&将记录插入出入库信息表中select *;from “project仓库管理系统data材料信息.dbf”; where 材料编号=alltrim(thisform.pageframe1.page1.text1.value);into cursor tempcursornum1= tempcursor.数量在材料信息表中按“材料编号”查找记录update project仓库管理系统data材料信息.dbf set;数量=num1+temp数量;where 材料编号=alltrim(thisform.pageframe1.page1.text
39、1.value);&修改材料信息表thisform.pageframe1.page1.text1.value=”thisform.pageframe1.page1.text2.value=”thisform.pageframe1.page1.text3.value=”thisform.pageframe1.page1.text4.value=”thisform.pageframe1.page1.text5.value=”thisform.pageframe1.page1.text6.value=”thisform.pageframe1.page1.edit1.value=”&重置Text Bo
40、x控件和Edit值thisform.pageframe1.page1.text2.readonly=.t.thisform.pageframe1.page1.text3.readonly=.t.thisform.pageframe1.page1.text4.readonly=.t.thisform.pageframe1.page1.text5.readonly=.t.thisform.pageframe1.page1.edit1.readonly=.t.&重置控件的ReadOnly属性thisform.refresh单击“取消”按钮时,取消用户的前一次操作,表单恢复为初始状态。“取消”按钮的C
41、lick事件代码如下:thisform.pageframe1.page1.text1.value=”thisform.pageframe1.page1.text2.value=”thisform.pageframe1.page1.text3.value=”thisform.pageframe1.page1.text4.value=”thisform.pageframe1.page1.text5.value=”thisform.pageframe1.page1.text6.value=”thisform.pageframe1.page1.edit1.value=”&重置Text Box控件和Ed
42、it值thisform.pageframe1.page1.text2.readonly=.t.thisform.pageframe1.page1.text3.readonly=.t.thisform.pageframe1.page1.text4.readonly=.t.thisform.pageframe1.page1.text5.readonly=.t.thisform.pageframe1.page1.edit1.readonly=.t.&重置控件的ReadOnly属性thisform. pageframe1.page1.refresh“退出”按钮的功能是返回主控界面。该按钮的Click事件代码如下:do form project仓库管理系统forms主表单.scxthisform.release3、出库管理(1)出库管理表单设计出库管理的页面设计与入库管理的页面相似,如图213所示:图213出库管理表进行出库管理时,用户必须先输入“出库材料编号”,然后单击