医院药品管理系统系统设计报告

                                                           

医院药品管理系统

系统设计报告

院 (系)

专   业

班   级

组   长

组   员

20##年 11 月 3 日

系统设计说明书

 

1   引言

在我国,随着医药卫生体系改革的深入,医药连锁经营的推行,越来越多的医药经营企业意识到提高企业管理水平的重要性,也迫切要求加快管理信息化的进程。

经调查可知,该医院医药经营企业的物流管理以及相应的财务处理、信息处理,长期以来一直采用手工操作,随着产业结构调整、全新的市场竞争环境,企业管理和运营效率已经成为企业成败的关键所在,手工方式的弊端毕现无疑。这就要求医药管理摆脱过去人手操作的繁琐,以充分满足医药经营企业各个环节对人流、物流、资金流、信息流进行统一系统的管理。

药品信息管理系统是指利用软硬件技术、网络通信技术等现代化手段,对药品的进货、出货、库存、价格及账务进行精确快速的管理,大大降低了管理中的复杂性以及出错率、减轻手工劳动的强度,提高顾客的满意度,从而为医院的整体运行提供全面的,自动化管理及各种服务的信息系统。

1.1     目标

本文档的目的旨在推动软件工程的规范化,使设计人员遵循统一的详细设计书写规范,节省制作文档的时间,降低系统实现的风险,做到系统设计资料的规范性与全面性,以利于系统的实现、测试、维护、版本升级等。详细设计的详细程度,应达到可以编写程序的水平。

1.2     范围

本阶段的设计任务:各子系统的公用模块实现设计、专用模块实现设计、存储过程实现设计、触发器实现设计、外部接口实现设计、部门角色授权设计、其它详细设计等。

1.3     术语说明

2   整体说明

2.1     简介

本系统名称为医院管理系统——库房系统管理子系统。目的是实现库房系统管理员对库房系统监控管理的功能和用户的查询和交易。实现方式为开发一个工作人员管理界面,通过识别不同用户的授权,可以查看不同药品的库存情况,价格以及买卖数量的全部信息。此系统为一个内部系统,医院内部管理人员通过管理库存系统实现整个医院系统的协调运行。该系统主要由基本信息、业务管理、业务查询、用户管理和系统管理5部分组成。

l  基本信息 :药品情况、客户情况、供应商情况。

l  业务管理:药品采购、药品销售、库存盘点、销售退货、客户回款。

l  业务查询:基本信息、入库明细、销售明细、回款信息。

l  用户管理:增加用户、用户维护。

l  系统管理:系统退出。

2.2     系统约束

1、范围约束

因为项目的范围可能会随着项目的进展而发生变化,从而与时间和成本等约束条件之间产生冲突,因此面对项目的范围约束,主要是根据项目的商业利润核心做好项目范围的变更管理。既要避免无原则的变更项目的范围,也要根据时间与成本的约束,在取得项目干系人的一致意见的情况下,合理的按程序变更项目的范围。

2、时间约束

在考虑时间约束时,一方面要研究因为项目范围的变化对项目时间的影响,另一方面要研究,因为项目历时的变化,对项目成本产生的影响。并及时跟踪项目的进展情况,通过对实际项目进展情况的分析,提供给项目干系人一个准确的报告。

在这个项目中,因为项目组成员的时间有限,所以有一定的时间约束

3、资源约束

本项目主要的资源是人,在人的约束上主要表现在成员项目知识不够完整,在系统设计和知识完备方面有所欠缺。

4、成本约束

项目的成本约束就是规定完成项目需要花多少钱。对项目成本的计量,一般用花费多少资金来衡量,但也可以根据项目的特点,采用特定的计量单位来表示。关键是通过成本核算,能让项目干系人,了解在当前成本约束之下,所能完成的项目范围及时间要求。当项目的范围与时间发生变化时,会产生多大的成本变化,以决定是否变更项目的范围,改变项目的进度,或者扩大项目的投资。

5、技术约束

           由于项目组的技术人员的技术不够成熟,所以在编码上有一定的约束。

3   整体设计

3.1     系统架构

A、 文件架构设计

………………………………………程序源文件夹

       ……………………………程序主类文件夹

           ………………………控制类文件夹

           ………………………Spring数据库访问类文件夹

           ………………………Hibernate实体类文件夹

         …………………………内部资源文件夹

         …………………………图片资源文件夹

                         

B、 系统架构设计

3.2     系统功能模块结构图

3.3    系统公共类设计

   

(1)    编写访问数据库的DAO类:该类用来对数据库实行各种操作,包括数据的插入、更新和查询。它继承了Spring框架中的HibernateDaoSupport类的全部功能,整个系统的核心工作有该类完成。

(2)    编写DAO的代理操作类AdapterDao:通过对Hibernate的调用完成对数据后台数据库的操作,通过Spring的IOC机制,通过配置文件实现控制反转。

(3)    编写Spring的配置文件appcontext.xml:文件appcontext.xml是系统初始化资源配置的重要文件,开发人通过在Spring配置文件中定义sessionFactory时,给出Hibernate映射文件的定义,因此使用Spring DAO抽象帝提供的Hibernate集成,使得应用代码不用硬编码对资源进行查找。

(4)    编写处理菜单栏和工具栏按钮的公共类MenuBarEvent

(5)    编写生成表格模型的公共类BuildTable

4   数据库设计

4.1     数据库说明

本系统数据库采用SQLServer2005数据库,系统数据库名称为DB_JXC,一共11张表。在设计数据库时,应考虑以下事项 :

1. 数据库的用途及该用途将如何影响设计,应创建符合用途的数据库计划。

2. 数据库规范化规则,防止数据库设计中出现错误。

3. 对数据完整性的保护。

4. 数据库和用户权限的安全要求。

5. 应用程序的性能需求,设计数据库时必须利用 Microsoft  SQL Server 20## 中能够提高性能的功能。对于性能而言,在数据库大小和硬件配置之间权衡也是很重要的。

4.2     数据库关系及视图

通过之前同用户的交流和咨询、对系统整体的需求分析和总体模块的设计,对本系统的数据库进行了详细的设计,根据各实体之间的相互联系和各实体之间的相互管理,得出了本系统的数据库各表的关系。

4.3   数据库表的详细设计

主要的数据库表:

(1)、药品基本情况表:

主要用来保存药品的基本信息,结构如图

(2) 客户基本情况表:

主要用来保存客户的基本信息数据,结构如图

(3) 药品采购明细表:

    主要用来保存采购药品采购的明细信息。结构如图

(4) 药品采购主表:

    主要保存药品采购数据的汇总信息。结构如图

(5) 药品销售明细表:

     主要用来存储药品销售的明细信息。结构如图

(6)    药品销售主表:

主要用来储存药品的汇总信息的数据。结构如图

(7)    库存盘点情况表:

主要存放对盘点的数据信息。结构如图

5  功能模块设计

5.1      系统登录模块

1、模块编号:G-001

2、  模块功能:

1)、对用户身份进行验证。

2)、根据用户权限进行页面控制访问。

    3、模块算法设计:

        入口说明:用户通过用户界面点击相应的链接。

        输入参数:session对象中记录的用户ID

        出口说明:系统完成相应的操作

4、参数描述:输入用户名和输入密码

5、界面设计图

     欢迎界面如下:

  

   登录界面如下:       

         

5.2      药品基本情况模块

1、模块编号:G-002

2、模块功能:

1)、为整个系统业务操作提供基础数据

2)、进行药品信息的基本录入、查询和修改

3、模块算法说明:

入口说明:用户通过主界面点击相应的链接。

        输入参数:a、药品各项本参数 ,b、查询的索引条件

        出口说明:系统完成相应的操作

4、参数描述:药品编号、药品条码、拼音码、规格、产地、有效期、经营方式、零售价格、批发价格、药品名称、单位等

5、界面设计图:

      药品基本情况录入图

  药品基本情况查询图

5.3      更多的模块。。。。

 

第二篇:社区医院药品管理系统设计与实现

社区医院药品管理系统

设计与实现

Design and Implement of Medicine                Management System for Community Hospital


毕业设计(论文)任务书

摘  要

  软件是利用Delphi 7.0设计开发的医院药品管理系统,是医院信息系统的一个重要组成部分,可实现对医院药品信息的分类管理和数据分析,从而使信息整理快速、准确、简单,以便于相关部门给予统筹安排,从而提高改进传统的管理方法,提高企业管理水平。本文所叙述的内容以及程序代码都是医院药品管理中的常见问题。

  设计完成了医院药品管理系统的开发。系统的前台采用了Delphi 7.0为开发工具,后台使用大型关系数据库SQL Server 2000。此系统的设计特点是人机交互界面友好,操作简单方便。

关键词:药品管理;数据库;Delphi;SQL


Abstract

The software designed and developed by Delphi 7.0 is the Medicine Management System for Hospital which is an important part of the Hospital Management System. It can realize the classification and data analysis of hospital medicine information which lead to fast, accurate and simple information management which facilitate other departments to make comprehensive arrangement in order to improve the traditional management methods and the level of corporation performance. The content of this article including the source codes is the common problems in the hospital medicine management.

The design has accomplished the development of the Medicine Management System .The foreground program of this system has utilized the development tool of Delphi 7.0 as well as utilizing the large relational data bank of SQL Server 20## in daemon. The characteristic of this system are the friendly man-machine interface and simple and convenient operation.

Keyword: Medicine Management ; Database ;Delphi; SQL


目  录

摘  要... I

Abstract II

1  绪  论... 1

1.1  任务的提出... 1

1.1.1  系统开发的背景... 1

1.1.2  系统开发的意义... 1

1.2  目标系统的功能要求... 2

1.3  可行性分析... 2

1.3.1  经济可行性... 2

1.3.2  技术可行性... 3

1.3.3  社会可行性... 3

1.3.4  软硬件可行性... 3

1.3.5  时间可行性... 3

2  开发工具及运行环境... 4

2.1  Delphi 简介... 4

2.2  Delphi 7 的新特性... 4

2.3  SQL Server 2000简介... 5

2.4  SQL 语句介绍... 6

2.4.1  SQL 简介... 6

2.4.2  SQL 的特点... 6

2.5  ADO 数据存取技术的选择... 7

2.5.1  ADO 的优点... 7

2.5.2  ADO 技术在Delphi 7中的实现... 7

2.6  运行环境... 8

2.6.1  软件环境... 8

2.6.2  硬件环境... 8

3  系统分析与设计... 9

3.1  功能模块分析... 9

3.1.1  系统功能结构... 9

3.1.2  各模块功能的简介... 9

3.2  系统流程图... 11

3.3  功能分析... 12

3.3.1  信息管理功能... 12

3.3.2  用户浏览功能... 12

3.4  数据库设计... 12

3.4.1  创建数据库和数据表... 12

3.4.2 创建基本信息表... 13

3.5  存储过程的建立... 16

4  程序设计说明... 18

4.1  建立系统主窗体... 18

4.2  创建公用单元... 20

4.3  用户登录... 20

4.4  用户设置... 21

4.5  权限设置... 23

4.6  更改密码... 24

4.7  药品字典... 25

4.8  药商字典... 26

4.9  采购管理... 27

4.10  入库管理... 33

4.11  出库管理... 35

4.12  库存盘点... 36

4.13  药库查询... 38

5  系统的调试和测试... 39

5.1  系统调试目的... 39

5.2  调试中出现的问题即解决的办法... 39

5.3  测试的目的... 40

5.4  测试的经验与体会... 40

总  结... 41

参考文献... 42

致  谢... 43


1  绪  论

1.1  任务的提出

1.1.1  系统开发的背景

随着经济的发展,社会的进步,计算机越来越深入到我们日常的工作学习及生活中,成为我们日常生活中不可缺少的辅助工具。随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。医院药品信息用计算机管理是一种计算机应用技术的创新。医院的药库每天有很多药要取出,又不断有药品补充进去,每天药品的流量是很大的。如果只用人工的方法去统计是不可能的,医院药品信息管理与药品供应有着密切的关系。为了解决这个矛盾,实现科学化、现代化的医院药品信息管理,就必须设计开发医院药品信息管理系统,并用于实践。

医院药品管理系统是对医药信息进行管理的计算机网络软件系统,它可完成医院中各类药品信息的收集、传输、存储、使用。是融合了医院的管理思想、各部门的业务经验,以及对计算机技术的恰当运用的软件开发成果。

医院药品管理系统以医院医疗用药管理为主线,实现全面的信息化。系统设计主要突出强化了系统与数据的安全性,构架、构件设计的标准化,实时响应速度的快速化,及人机界面设计的友善性等方面。医院管理系统用计算机管理医院药品,从功能上覆盖了系统设置,基础资料,药品采购,药品入库,药品出库,药品盘点,药品查询等。

1.1.2  系统开发的意义

药品管理系统的开发运用,将在以下管理方面取得了突出的意义:

(1) 药品管理规范化

在药品管理方面,实行的是品种管理模式。从药品的采购,到药品的入库、销售,全部通过网络调配,杜绝了已往手工运行所带来的管理不清、药品流失、不正常的价格波动等弊端。

(2) 工作程序系统化

药库与各药房联网后,可随时传递、查询数据,使药品数量实现动态显示。

(3) 查询统计科学化

对全部药品的所有信息,可以进行任意组合的条件查询。能自动统计任意时段的药品入、出、存数量及金额。

(4) 信息处理一体化

以药库为中心,实现药品名称、规格、编码、价格的统一。药品的计划、采购、验收等能做到连贯处理。药品的信息审核、批准,最后到执行全部自动化、流程化,极大地提高了药品的管理水平。

总之,药品管理系统,能够及时、准确地收集、传输、处理和反馈各项医药信息,增强和扩展医务人员的信息功能,增强医务人员对医药信息的变换、存贮、识别处理和决策,从而提高医护人员的工作效率。

1.2  目标系统的功能要求

医院药品管理系统是为了满足医院或诊所对药品进贷、销售以及库存管理而开发的。一般而言,药品进销存管理系统应达到以下目标:

(1) 能够管理所有药品的基本信息资料,包括药品名称、药品描述、药品单位、药品保质期以及药品用法说明等信息。

(2) 能够管理所有供药厂商的基本信息资料,包括厂商名称、联系地址、联系电话和厂商负责人等信息。

(3) 能够管理医院或诊所内药品采购信息,包括采购单的建立、审核等功能。

(4) 能够管理医院或诊所内药品入库信息,包括入库批次、入库的日期以及入库单审核等功能。

(5) 能够管理医院或诊所内药品出库或领药并及时更新药品的库存,为保证数库存的准确性,即对库存进行盘点以及盘点单打印等功能。

(6) 能够快速地查询药库内的药品信息。

1.3  可行性分析

1.3.1  经济可行性

软件的经济可行性是指软件的所有带来经济效益与开发所需的投资费用相比较,是否适宜,随着近几年计算机技术的普及和发展,用计算机辅助管理所带来的经济效益远远大于对计算机硬件和软件的投资。开发的这套系统完全可以在医药现有的计算机上运行,因此系统具有了良好的硬件基础。从软件方面考虑,医院配备一套SQL Server 2000数据库和Delphi 7.0软件完全可以接受。本系统所采用的硬件和软件无论是开发环境还是运行环境都是社会上很普及的资源,即不需要很大的投资。鉴于开发本系统所带来的经济效益大于对其所做的投资,因此在经济上是可行的。

1.3.2  技术可行性

由于所采用SQL Server 2000和Delphi开发工具功能很强大,使开发者短时间内开发出复杂而又高要求的应用,减少了设计难度。鉴于所使用的计算机软硬件均具有良好的性能并足以实现开发系统的目的,因此,在技术上是可行的。

1.3.3  社会可行性

现代管理方法必须以计算机的应用为基础,二者的结合可谓相辅相成、缺一不可。医院药品管理系统是一个医院不可缺少的部分,药品管理系统能够为用户提供充足的信息和快捷的数据处理手段。本系统的完成可以使医院药品管理人员从繁重的手工操作中解脱出来,减轻了劳动强度。因此,具有社会可行性。

1.3.4  软硬件可行性

系统在软件上选用网络动态编程中处于领先地位的Delphi7.0企业版。Delphi 7.0企业版最大的特点是易学、高效、功能强大。数据库选用适于网络开发的SQL Server 2000,易于改进和扩充。系统要求界面友好、容易掌握、方便用户的操作和使用,并具有稳定安全的特点。对客户端硬件的配置要求不太高,很适合当前医院药品管理机构用机配置,使系统具有较广的适用面。

1.3.5  时间可行性

软件的时间可行性是指软件的开发时间和使用时间的比例,虽然药品管理系统不断完善和发展,但本系统所采用功能强大的软硬件配置及优良的开发技术,在近一段时间内可以满足医院的要求。本系统的开发时间很短且具有较强的兼容性,可以在一段很长时间内使用,所以在时间上是可行的。


2  开发工具及运行环境

2.1  Delphi 简介

Delphi是Inprise公司(即原Borland)推出的基于真正面向对象语言Object Pascal语言的可视化编程工具,是当今世界上最快的编译器。能大大提高编程效率。面向对象的程序设计(Object-Oriented Programming,简写为OOP)是现在最成功的高级语言程序设计方法,面向对象的程序设计的目的是创建可重用代码,通过把属性和方法封装进“对象”中,以更好地模拟现实世界。“真正的程序员用C,聪明的程序员用Delphi”,这句话是对Delphi最经典、最实在的描述[1]

Delphi实际上是Pascal语言的一种版本,但它与传统的Pascal语言有天壤之别。一个Delphi程序首先是应用程序框架,而这一框架正是应用程序的“骨架”。在骨架上即使没有附着任何东西,仍可以严格地按照设计运行。您的工作只是在“骨架”中加入您的程序。缺省的应用程序是一个空白的窗体(Form),您可以运行它,结果得到一个空白的窗口。这个窗口具有Windows窗口的全部属性:可以被放大缩小、移动、最大最小化等,但您却没有编写一行代码。因此,可以说应用程序框架通过提供所有应用程序共有的东西,为用户应用程序的开发打下了良好的基础[2]。Delphi已经为您做好了一切基础工作,程序框架就是一个已经完成的可运行应用程序,只是不处理任何事情。您所需要做的,只是在程序中加入完成您所需功能的代码而已。在空白窗口的背后,应用程序的框架正在等待用户的输入。由于您并未告诉它接收到用户输入后作何反应,窗口除了响应Windows的基本操作(移动、缩放等)外,它只是接受用户的输入,然后再忽略。Delphi把Windows编程的回调、句柄处理等过程都放在一个不可见的Romulam覆盖物下面,这样您可以不为它们所困扰,轻松从容地对可视部件进行编程[3]

2.2  Delphi 7 的新特性

Delphi7是窗口操作系统中快速应用开发环境的最新版本。它的第6个版本是Windows平台上第一个全面支持最新Web服务的快速开发工具,而在该版本中它又成为了第一个正式支持.Net的开发工具,使得Delphi程序员能够开始发展他们为.Net开发的技巧,而不必抛弃他们目前在Windows平台上的工作和技巧。同时,Delphi7继续加强了对Web服务程序开发的支持。无论是企业级用户,还是个人开发者,都能够利用Delphi7轻松、快捷地构建新一代电子商务应用[4]

(1) 企业应用MDA开发。通过让开发者从设计到部署都复用一个应用,加速开发进程,同时显著减少代码量和需要开发的时间。

(2) 可视化的快速Web开发。开发者能够在Delphi7环境中可视化的创建Web应用。

(3) Linux的跨平台支持。Delphi7内建了对Linux的跨平台支持,出售时附带Delphi7语言版本的Kilix3。Kilix3是第一个Linux操作系统上的高性能的可视化整合开发环境IDE。

(4) 企业级的报表能力。Delphi7让企业能创建跨平台的报表。这些报表能帮助查看应用程序运行的效率。

(5) 免费的Data Snap多层应用开发。Data Snap以前的名字是MIDAS.DateSnap不但强化了MIDAS原有的功能,更加入了许多新的组件。让程序员可以使用它开发出的功能更为强大的应用系统。

(6) Windows XP应用。Delphi7包含了对Windows XP风格的支持,让开发者能够创建Windows XP用户界面风格的程序。

(7) 加强的Indy组件。

(8) 继续加强dbExpress.。

(9) 强化Delphi开发环境。Delphi7改善了集成开发环境,以帮助程序员更好的开发环境[5]

2.3  SQL Server 2000简介

SQL Server 2000数据库管理系统是目前世界上最为流行的关系数据库系统之一,作为大型数据库管理系统。它能够满足大型Web站点和企业数据处理系统的数据存储和分析需求,是一套组件的集合,由许许多多的组件共同完成强大的功能[6]

SQL Server 2000数据库管理系统近年来一直在世界上的高端数据库占有很大份额,在其国内引起强大需求,完善的数据库管理功能而装机量最大[7]

Microsoft SQL Sever是一个客户/服务器关系式数据库系统。客户/服务器关系式数据库系统分为两部分定义:客户/服务器部分和关系式数据库系统部分。客户/服务器也称作分布式计算技术,它指的是程序的所有数据处理过程,不像基于桌面、小型或大型的计算机系统那样,发生在一台单独的计算机上。相反,SQL Sever的不同部分同时运行于两个或者更多的计算机上。例如,使用SQL Sever,程序的数据库引擎部分(数据和程序代码驻留的位置,完成大多数工作的地方)驻留在一个指定的服务器计算机上,而程序的另一部分客户界面则驻留在用户的台式机中。客户/服务器系统的组件通过网络进行通信,好像它们是同一个程序一样[8]

关系式数据库系统是SQL Sever采用的一种数据库结构类型,它广泛地被软件开发方所采用。一个关系式数据库分成多个数据表,每一个表进一步分成记录和字段。可以把表看成是电子数据表。大多数数据库包括多张表和其他的数据库对象[9]

SQL Sever 2000作为Microsoft家族的重要成员,是新一代基于客户/服务器的大型关系数据库系统。它能够满足大型Web站点和企业数据处理系统的数据存储和分析需求,是一套组件的集合,由许许多多的组件共同完成强大的功能[9]

2.4  SQL 语句介绍

2.4.1  SQL 简介

SQL(Structured Query Language),意思为结构化查询语言,是一种介于关系代数与关系演算之间的结构化查询语言。它的主要功能就是同各种数据库建立联系,进行沟通。ANSI(美国国家标准协会)规定SQL是关系型数据库管理系统的标准语言。SQL语句可以用来执行各种各样的操作,例如更新数据库中的数据、从数据库中提取数据等。SQL语言之所以能够为用户和业界所接受,并成为国际标准,是因为它是一个综合的、功能极强同时又简捷易学的语言。SQL语言集数据查询、数据操纵、数据定义和数据控制功能于一体[10]

2.4.2  SQL 的特点

(1) 综合统一

SQL语言集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动,包括定义关系模式、建立数据库、插入数据、查询、更新、维护、数据库重构、数据库安全性控制等一系列操作要求,这就为数据库应用系统的开发提供了良好的环境。用户在数据库系统投入运行后,还可根据需要随时地逐步地修改模式,且并不影响数据库的运行,从而使系统具有良好的可扩展性。

(2) 高度非过程化

非关系数据模型的数据操纵语言是面向过程的语言,用其完成某项请求必须指定存取路径。而用SQL语言进行数据操作,只要提出“做什么”,而无须指明“怎么做” ,因此无须了解存取路径,存取路径的选择以及SQL语言句的操作过程由系统自动完成。这不但大大减轻了用户负担,而且有利于提高数据独立性。

(3) 面向集合的操作方式

非关系数据模型采用的是面向记录的操作方式,操作对象是一条记录。而SQL语言采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。

(4) 以同一种语法结构提供两种使用方式

SQL语言既是自含式语言,又是嵌入式语言。作为自含式语言,他能够独立地用于联机交互的使用方式,用户何以在终端键盘上直接键入SQL命令对数据库进行操作;作为嵌入式语言,SQL语句能够嵌入到高级语言中,供程序员设计程序时使用。而在两种不同的使用方式下,SQL语言的语法结构基本上是一致的。

(5) 语言简捷,易学易用[11]

2.5  ADO 数据存取技术的选择

ADO数据控件(ADO Data Control)是Delphi 7新增加的一种数据库访问控件,是目前主要的数据存取技术。它使用数据访问对象ADO来连接到后端数据库,并快速创建记录集,然后将数据通过数据绑定控件提供给用户。它不但能访问标准的关系数据库,还能访问邮件数据、Web上的文本或图形以及目录服务等。ADO数据控件是一种建立在最新的数据访问接口OLE DB之上的高性能、统一的数据访问对象,通过它可以访问文件数据库、客户/服务器数据库甚至非关系型数据库。

ADO是Microsoft 提出的各种数据存取技术的演化结果,因为随着数据日益复杂,数据存取技也必须不断地进步以适应应用系统的需求。目前,ADO已成为Windows平台存取数据的标准技术[12]

2.5.1  ADO 的优点

(1) 它性能高,开销小,易于使用,速度快,内存支出少,操作灵活,ADO还支持建立客户服务器和基于Web的应用程序的关键功能。

(2) 由于数据访问对象ADO可以访问各种后端数据库,因此通过以它为基础的ADO数据控件同样可以访问Access, FoxPro ,SQL Sever, Oracle等各种关系型数据库以及非关系型数据库。

(3) ADO是“远程数据库访问”,能够通过一个来回的传输将数据从服务器移到客户端应用程序或Web页中,然后将更新数据返回服务器。

2.5.2  ADO 技术在Delphi 7中的实现

ADO通过OLE DB引擎实现数据访问,为此Delphi 7提供了Access Jet 、 ODBC 、Oracle及SQL Sever等OLE DB提供者。使用ADO 时,首先要通过“部件”对话框中的“Microsoft ADO Data Control 6.0”进行添加。ADO 控件也具有一组属性、方法和可响应的事件,并且可以和数据绑定控件配合使用[12]

2.6  运行环境

2.6.1  软件环境

服务器:WINDOWS 2000/ XP,SQL Server 2000。

工作站:WINDOWS me/2000/XP,TCP/IP协议,Delphi 7.0。

2.6.2  硬件环境

工作站:硬盘20G,内存128M以及通讯电缆、集线器、网卡及相应设备。

服务器:PIV2.8G或更高,硬盘120G或更大,内存512M。


3  系统分析与设计

3.1  功能模块分析

3.1.1  系统功能结构

    系统功能结构图如图3-1所示。

                         图3-1 药品信息管理系统功能模块划分

图3-1概括了系统的功能模块,可以看出,不同类型的用户对系统有不同的权限,对系统的操作内容也不同。

3.1.2  各模块功能的简介

(1) 系统设置

系统设置可以分为用户设定、权限设定和更改密码,如图3-2所示。

① 用户设定:维护和设置药品进销存管理系统用户基本信息。

② 权限设定:设置系统用户对各个模块所拥有的使用权限。

③ 密码设定:为当前已经登陆的用户修改密码。

    

                     

                       

图3-2 系统设置

(2) 基础资料管理

基础资料管理可以分为药品字典和厂商字典,如图3-3所示。

① 药品字典:维护药品的基本信息,如药品的名称、药品的类型、规格、单位、和药品描述、药品用法以及零售转换率等。

② 药商字典:维护药品供货厂商的基本资料,如厂商名称、联系方式、厂商地址、负责人和联系电话等。

图3-3 基础资料模块

(3) 药品业务信息管理

药品进销存业务信息管理可以分为采购管理、入库管理、出库管理、库存盘点和药库查询五大模块。管理员登录到本系统后可以看到用来管理药品业务信息的所有模块,可以应用任何模块对本系统进行有效的药品业务信息管理。普通用户也可以根据自己所拥有的权限使用本系统的药品业务信息管理的部分功能。药品进销存业务模块如图3-4所示。

① 采购管理:记录采购单的详细信息,包括采购日期和采购厂商以及各种药品的信息和购入价格、购入数量,并实现采购单据的审核等。可以实现管理医院或诊所内药品采购信息。

② 入库管理:对采购或退药的药品进行入库登记,包括入库类别、入库日期、药品的入库信息等。可以实现管理医院或诊所内药品入库信息。

③ 出库管理:药房领药或药品销售领药出库的登记,包括出库日期、出库类别、销售价格和销售数量,以及出库单据的审核等。能够实现管理医院或诊所内药品出库信息。

④ 库存盘点:定期对药库中的药品进行盘点登记,核对药品账面数量和药品实际数量,统计盈亏等。可以保证数据库的正确性

⑤ 药库查询:快捷方便地查询当前药库中药品的库存数量和药品的其他信息等。

图3-4 药品进销存业务模块

3.2  系统流程图

如图3-5所示,实现了该系统的登录流程。

                                                                                                                    

图3-5 系统登录流程图

3.3  功能分析

本系统主要是实现了信息管理功能和信息浏览功能。

3.3.1  信息管理功能

管理人员进入系统后,可看到系统的全部内容,可以对用户权限进行管理,并把操作后的信息重新写进数据库。此系统还可以进行药品入库管理、出库管理、药品库存管理。具有不同权限的人可以对系统进行相对应的操作,从而保证了系统的安全性。

3.3.2  用户浏览功能

本系统可以让用户浏览信息,例如供用户检索药品信息、药品库存信息和药商信息等。

3.4  数据库设计

3.4.1  创建数据库和数据表

首先用Microsoft SOL Server 2000创建数据库,根据需求分析创建,药品进销存管理系统总共需要13个表,各表的含义如表3-1所示。

表3-1 药品进销存管理系统数据表说明

3.4.2 创建基本信息表

药品进销存管理系统的基本信息表包括药品信息表、药商信息表和用户信息表,用户的权限表,采购主表和采购明细表,入库主表和入库明细表,销售主表和销售明细表,盘点主表和盘点明细表,以及库存主表等等,各信息表的具体的描述和说明如下。

(1) 药品信息表(Medicine)的定义如表3-2所示。

表3-2 药品信息表说明

(2) 药商信息表(Provider)的定义如表3-3所示。

表3-3 药商信息表说明

(3) 用户信息表(User)的定义如表3-4所示。

表3-4 用户信息表说明

(4) 权限表(Popedom)的定义如表3-5所示。

表3-5 权限表说明

(5) 采购主表(StockHeader)的定义如表3-6所示。

表3-6 采购主表说明

(6) 采购明细表(StockBody)的定义如表3-7所示。

表3-7 采购明细表说明

(7) 入库主表(InDepotHeader)的定义如表3-8所示。

表3-8 入库主表说明

(8) 入库明细表(InDepotBody)的定义如表3-9所示。

表3-9 入库明细表说明

(9) 销售主表(SaleHeader)的定义如表3-10所示。

表3-10 销售主表说明

(10) 销售明细表(SaleBody)的定义如表3-11所示。

表3-11 销售明细表说明

(11) 盘点主表(CheckHeader)的定义如表3-12所示。

表3-12 盘点主表说明

续表3-12 盘点主表说明

(12)盘点明细表(CheckBody)的定义如表3-13所示。

表3-13 盘点明细表说明

(13)库存表(Storage)的定义如表3-14所示。

表3-14 库存表说明

以上表是系统所要求数据库中应有的几个重要的表,医院药品管理人员对相关数据信息的操作其实是对这些表的相应内容的操作,表的设计的优劣直接关系到系统的性能。

3.5  存储过程的建立

存储过程是Transact_SQL 语句的预编译集合,这些语句在一个名称下存储并作为一个单元处理。SQL Server中的存储过程与其他编译语言中的过程类似,使用存储过程可以接受输入参数或输出参数对数据进行处理,存储过程可以向调用过程或批处理返回状态值表明执行成功或者失败。

在系统中使用存储过程,数据库的新增,删除,更新等操作就变得轻松和便于管理。存储过程是一组共同实现某种功能的SQL语句的集合。存储过程可以向用户返回执行的结果集,使用存储过程可以极大的提高,程序的性能,减少网络流量和防止SQL注入式攻击。

本系统在SQL Serve 20## 数据库中建立了以下存储过程:

(1) proc_Base:封装了所有设计基础资料查询操作的SQL语句。存储过程是Transact_SQL 语句的预编译集合,这些语句在一个名称下存储并作为一个单元处理。SQL Serverr中的存储过程与其他编译语言中的过程类似,使用存储过程可以接受输入参数或输出参数对数据进行处理,存储过程可以向调用过程或批处理返回状态值表明执行成功或者失败。

在系统中使用存储过程,数据库的新增,删除,更新等操作就变得轻松和便于管理。存储过程是一组共同实现某种功能的SQL语句的集合。存储过程可以向用户返

(2) proc_StockTask:此存储过程主要用来实现采购模块后台数据所有的业务逻辑。

(3) proc_InDepot:此存储过程主要用来实现入库模块后台数据所有的业务逻辑。

(4) proc_Sale:此存储过程主要用来实现入库模块的业务逻辑。

(5) proc_Check:此存储过程主要用来实现库存盘点模块功能。

(6) proc_Storage:此存储过程主要用来实现库存的查询功能。


4  程序设计说明

4.1  建立系统主窗体

系统主窗体的设计界面如图4-1所示。

图4-1 药品进销存管理系统主界面

(1) 添加主窗体的MainMenu菜单和快捷按钮对应的事件,这些事件分别发打不同的模块窗体。

(2) 添加主窗体的GetADOConnStr方法,此方法的功能适当数据库连接不存在时自动弹出“数据库连接属性”对话框,用于设置数据库连接字符串,并将连接信息保存在INI文件中。其代码如下:

procedure TfrmLeechdomMain.GetADOConnStr(FileName: string);

var

  ADOConnStr: string;

begin

  ADOConnStr := '';

  try                                               //动态加载DLL,DLL中包含了读取INI文件的函数

    if ReadIni(FileName,'BDConn','DBConFileName') = '' then

    begin

//弹出UDL连接数据窗体   

      ADOConnStr := PromptDataSource(Application.Handle, ADOConn.ConnectionString);

      WriteIni(FileName,'BDConn','DBConFileName',ADOConnStr);

    end else

      ADOConnStr := ReadIni(FileName,'BDConn','DBConFileName');

  finally

    try

      ADOConn.Close;

      ADOConn.ConnectionString := ADOConnStr;

      ADOConn.Open;

    except

      Application.MessageBox('连接数据库失败!','提示',16);

      WriteIni(FileName,'BDConn','DBConFileName','');

    end;

  end;

end;

(3) 添加主窗体的OnShow事件,此事件的功能是启动主程序时调用数据库连接方法,然后显示登陆窗体。其代码如下:

procedure TfrmLeechdomMain.FormShow(Sender: TObject);

begin

//连接数据库

  GetADOConnStr(FileName);

//登录窗体的现实

  frmLogin := TfrmLogin.Create(Self);

  frmLogin.ShowModal;

procedure TfrmLeechdomMain.GetADOConnStr(FileName: string);

var

  ADOConnStr: string;

begin

  ADOConnStr := '';

  try                                               //动态加载DLL,DLL中包含了读取INI文件的函数

    if ReadIni(FileName,'BDConn','DBConFileName') = '' then

    begin

//弹出UDL连接数据窗体   

      ADOConnStr := PromptDataSource(Application.Handle, ADOConn.ConnectionString);

      WriteIni(FileName,'BDConn','DBConFileName',ADOConnStr);

    end else

      ADOConnStr := ReadIni(FileName,'BDConn','DBConFileName');

  finally

    try

      ADOConn.Close;

      ADOConn.ConnectionString := ADOConnStr;

      ADOConn.Open;

    except

      Application.MessageBox('连接数据库失败!','提示',16);

      WriteIni(FileName,'BDConn','DBConFileName','');

    end;

  end;

end;

4.2  创建公用单元

通过公用单元来调用存储过程,实现对数据库的操作。公用单元主要实现调用存储过程打开数据集,执行SQL语句更新数据库信息和通过SQL语句查询信息等。公用单元中函数和方法的功能描述如下所示。

(1) WriteIni方法:将数据字符串保存在初始化INI文件中。

(2) ReadIni函数:初始化数据库连接并保存连接。

(3) FileName函数:用于获取初始化文件路径。

(4) OpenDataSQL方法:通过传入指定的SQL语句打开数据集。

(5) FindSQL函数:执行SQL语句,查询数据。

(6) ExecSQL方法:用于执行插入、更新或删除等数据库操作。

4.3  用户登录

此模块通过验证用户的编号和密码来实现用户登录功能。

“用户登录”窗体,主要用于验证用户编号和密码的合法性并登录主系统。

为了实现这些功能,需要如下控件:

1个TImage控件,显示登录画面;

2个TBitBtn控件,装载按钮图片,分别执行登录和放弃功能;

2个TEdit控件,分别显示用户输入的用户编码和密码;

2个TLabel控件,显示用户提示信息;

1个TADOQuery控件,获取用户登陆权限。

窗体的设计界面如图4-2所示。

图4-2 用户登录界面

(1) 在“proc_Base”存储过程中添加判断用户登录和用户权限的SQL语句。

(2) 添加“登录”按钮的单击事件,此事件的功能首先是调用proc Base存储过程中的判断用户登录方法,当用户登录成功后判断用户所拥有的模块权限,通过权限来控制菜单模块是否可以使用。

(3) 添加“放弃”按钮的单击事件,此事件的功能是放弃登录并关闭应用程序。

(4) 添加edtUserID控件的OnKeyPress事件,使用回车键控制光标的焦点。

4.4  用户设置

用户设置模块实现了系统用户维护功能。

“用户设定”窗体主要实现对“药品进销存管理系统”中的使用者进行管理,其中包含了用户编号、用户姓名和初始密码以及备注等基本信息。

为了实现这些功能,需要如下控件:

1个TDBGrid控件,显示用户信息;

4个TBitBtn控件,装载按钮图片,分别执行添加、修改、删除和保存功能;

2个TDBEdit控件,分别显示用户输入的用户名称和密码;

1个TADOQuery控件,数据查询控件,用来执行SQL语句,查询用户数据;

1个TDBText控件,用于显示登陆编号信息;

1个TDataSource控件,数据源控件。

窗体的设计界面如图4-3所示。

图4-3 “用户设定”窗体

(1) 向存储过程proc_Base中添加一段用于检查用户编号是否存在的SQL语句。其代码如下:

if @Flag='Select_LoginID_Max'    --药商的最大编号

      begin

             Select ISNULL(Max(LoginID), @LoginID) + 1  as LoginID From [User]

end

(2) 依次添加“添加”、“修改”、“删除”和“保存”按钮的单击事件,这些事件的功能主要是对数据库执行添加、删除、修改、保存等基本的数据库操作。其代码如下:

procedure TfrmUserSet.btnAddClick(Sender: TObject);

var

  SQLMaxID, MaxID, LoginID: string;

begin

  qryUser.Insert;

  LoginID := '1000';

  SQLMaxID := 'Exec proc_Base @Flag=''Select_LoginID_Max''' + ',@LoginID=' + Quotedstr(LoginID); //调用存储过程

  OpenDataSQL(frmLeechdomMain.qryMaxID, SQLMaxID);

  //执行SQL语句的过程

  MaxID := frmLeechdomMain.qryMaxID.FieldByName('LoginID').AsString;

  txtLoginID.Caption := MaxID;

  qryUser.FieldByName('LoginID').AsString := MaxID;

end;

procedure TfrmUserSet.btnModifyClick(Sender: TObject);

begin

  qryUser.Edit;

end;

procedure TfrmUserSet.btnDeleteClick(Sender: TObject);

begin

  if Application.MessageBox('确定要删除此条记录吗?','提示',68) = IDNo then

    Exit;

  qryUser.Delete;

  qryUser.UpdateBatch;

end;

procedure TfrmUserSet.btnSaveClick(Sender: TObject);

begin

  if qryUser.State in [dsInsert,dsEdit] then

    qryUser.UpdateBatch;

end;

(3)在窗体的OnShow事件中调用公用单元的OpenDataSQL方法打开用户信息表数据集。其代码如下所示。

procedure TfrmUserSet.FormShow(Sender: TObject);

begin

  OpenDataSQL(qryUser, 'Select * From [User]');

end;

(4)在窗体的OnClose事件中释放窗体实例。

4.5  权限设置

此模块实现了设置系统使用者权限的功能。

“权限设定”窗体主要实现对用户进行权限管理,控制用户在药品进销存管理系统中拥有的权限。

为了实现这些功能,需要如下控件:

1个TTreeView控件,用来显示用户信息的树形列表;

2个TBitBtn控件,确定和取消权限操作按钮;

1个TCheckListBox控件,权限列表框;

1个TADOQuery控件,用于获取数据集。

窗体的设计界面如图4-4所示。

图4-4 权限设定

(1) 添加窗体的OnShow事件,此事件的功能主要是当窗体打开时初始化TCheckListBox控件和TTreeView控件,分别显示权限列表和当前系统中的用户信息。

(2) 添加“权限列表”的单击事件,此事件的功能主要是当选择某一用户是调用存储过程,查询处当前用户所拥有的权限并显示在列表框中。

4.6  更改密码

“更改密码”窗体主要实现对当前已经登录了的用户修改密码。用户通过输入原密码,再通过一次输入新密码,之后再一次确认输入新密码,来更改之前所使用的密码。

为了实现这些功能,需要如下控件:

2个TBitBtn控件,分别用来保存数据和关闭模块窗体;

3个TEdit控件,分别用来输入“原密码”、“新密码”和“确认新密码”;

5个TLabel控件,显示信息描述简介;

1个TADOQuery控件,用于获取数据集。

窗体的设计界面如图4-5所示。

图4-5 更改密码

(1) 向“proc_Base”存储过程中添加更新密码的SQL语句。其实现代码如下:

(2) 添加“确定”按钮的单击事件,此事件的功能主要是调用“proc_Base”存储过程中修改密码的SQL语句,通过传入制定的用户编号和密码来实现密码修改。其实现代码如下:

if @Flag1 ='Password'   --修改密码的时候

             begin

                    update [User] set [Password] = @Pass where LoginID=@LoginID

             end

      end

(3) 添加窗体的OnShow事件,此事件的功能主要是显示当前登录的用户的编号信息。添加窗体的OnClose事件和“取消”按钮的单击事件,这两个事件分别用来释放窗体实例和关闭窗体。

4.7  药品字典

“药品字典维护”窗体主要用于药品基本信息的建立和维护。

为了实现这些功能,需要如下控件:

1个TDBGrid控件,用来显示数据表格;

5个TBitBtn控件,分别用来实现添加、修改、删除、保存和取消操作;

3个TDBEdit控件,用来输入或显示数据字段值;

1个TDBText控件,用于显示编号信息;

2个TComboBox控件,用来选择药品单位和药品类型;

9个TLabel控件,显示信息描述简介;

3个TDBMemo控件,用来输入或显示药品描述,用法,备注信息;

1个TDataSource控件,数据源控件;

1个TADOQuery控件,用于获取数据集。

窗体的设计界面如图4-6所示。

图4-6 药品字典维护

(1) 添加窗体的OnShow事件,在此事件中调用公用单元的OpenDataSQL方法,通过传入指定的SQL语句打开药品字典数据集。添加窗体的OnClose事件,其主要功能是释放窗体实例。

(2) 依次添加“添加”、“修改”、“删除”、“保存”和“取消”按钮的单击事件,这些事件的功能主要是对数据库执行添加、删除、修改、保存等基本的数据库操作。

(3) 添加edtChangeRate控件的OnKeyPress事件,此事件限制了在edtChangeRate控件中只能输入数字类型数据。

4.8  药商字典

“药商字典维护”窗体主要实现对供药厂商基本资料的维护。为了实现这些功能,需要如下控件:

1个TDBGrid控件,用来显示数据表格;

5个TBitBtn控件,分别用来实现添加、修改、删除、保存和取消操作;

4个TDBEdit控件,用来输入或显示数据字段值;

1个TDBText控件,用于显示编号信息;

5个TLabel控件,显示信息描述简介;

1个TDataSource控件,数据源控件;

1个TADOQuery控件,用于获取数据集。

窗体的设计界面如图4-7所示。

图4-7 药商字典维护

(1) 添加窗体的OnShow事件,在此事件中调用公用单元的OpenDataSQL方法,通过传入指定的SQL语句打开药商字典数据集。添加窗体的OnClose事件,其主要功能是释放窗体实例。

(2) 依次添加“添加”、“修改”、“删除”、“保存”和“取消”按钮的单击事件,这些事件的功能主要是对数据库执行添加、删除、修改、保存等基本的数据库操作。

4.9  采购管理

“采购建立”窗体主要实现采购管理,其中包含了采购主单据的录入和药品明细的录入。

为了实现这些功能,需要如下控件:

2个TComboBox控件,用来选择采购公司编号和药品编号;

5个TBitBtn控件,分别用来实现对数据库的添加、修改、删除、保存和查找,报表的打印和审核;

4个TEdit控件,分别用来输入;

1个TDateTimePicker控件,用来输入采购时间;

1个TDBMemo控件,显示输入备注信息;

1个TDBGrid控件,用来显示采购数据。

窗体的设计界面如图4-8所示。

图4-8 采购建立

(1) 在数据库中添加名为“proc_StockTask”的存储过程,此过程主要用来实现采购模块后台数据库所有的业务逻辑。在存储过程中使用“@Flag”将代码分为了七大段,分别处理不同的采购业务数据。其中,SelectMaxID用于获取最大的单据号;InsertHeader、InsertBody和DelHeader、DelStock分别用于向采购主表和明细表添加记录及删除记录;Auditing用于更改单据审核字段状态;SelectStock用于查询采购单。

(2) 添加窗体的OnShow事件,此事件的功能主要是初始化采购模块一些控件的初值。

(3) 添加“添加”按钮的单击事件,此事件的功能主要是调用存储过程,清空输入条件并新建采购流水单号,实现添加操作。其实现代码如下:

procedure TfrmStock.btnAddClick(Sender: TObject);

var

  InsertHeaderStr, MaxID: string;

begin

  qryStockBody.Close;

  cmbxProviderID.Text := '';

  cmbxMedicineID.Text := '';

  edtByPrice.Text := '';

  edtJobPrice.Text := '';

  edtRetailPrice.Text := '';

  edtAmount.Text := '';

  lblAuditing.Caption := '未审核';

  MaxID := 'Exec proc_StockTask @Flag=''SelectMaxID''' ;

  OpenDataSQL(frmLeechdomMain.qryMaxID, MaxID);

  if frmLeechdomMain.qryMaxID.FieldByName('MaxID').AsString = '' then

    lblStockID.Caption := 'PR' + FormatDatetime('yyyymm',Date) + '0001'

  else

    lblStockID.Caption:='PR'+

frmLeechdomMain.qryMaxID.FieldByName('MaxID').AsString;

end;

(4) 添加“删除”按钮的单击事件,此事件的功能主要是判断单据是否已经审核,当单据还未审核时可以删除单据信息。通过调用“proc_StockTask”存储过程,当“@Flag”变量标记为“DelStock”和“DelHeader”时删除从表和主表数据,维持主从表数据的完整性。其实现代码如下:

procedure TfrmStock.btnDelClick(Sender: TObject);

var

  DelBodyStr,DelHeadStr, SelectBody, SelectAll: string;

begin

  if lblAuditing.Caption = '已审核' then

  begin

    Application.MessageBox('已审核不能修改!','提示',16);

    Exit;

  end;

  if DBGrid1.DataSource.DataSet.IsEmpty then

    Exit;

  if Application.MessageBox('确定要删除此条信息吗?','提示',68) = IDYes then

  begin

    DelBodyStr := 'Exec proc_StockTask @Flag=''DelStock'''

            + ',@StockID=' + Quotedstr(lblStockID.Caption)

            + ',@MedID=' + Quotedstr(cmbxMedicineID.Text);

    DelHeadStr := 'Exec proc_StockTask @Flag=''DelHeader'''

                + ',@StockID = ' + QuotedStr(lblStockID.Caption);

    ExecSQL(qryStockBody,DelBodyStr);

    if FindSQL('Select * From StockBody where StockID=' + QuotedStr(lblStockID.Caption)) = False then

      ExecSQL(qryStockHeader,DelHeadStr);

    SelectAll := 'Exec proc_StockTask @Flag=''SelectStock'''

                +',@StockID=' + Quotedstr(lblStockID.Caption);

    OpenDataSQL(qryStockBody, SelectAll);

    Application.MessageBox('明细删除成功!','提示',64);

  end;

end;

(5) 添加“保存”按钮的单击事件,此事件的功能是调用“proc_StockTask”存储过程,判断“@Flag”标记是否为“InsertHeader”和“InsertBody”,若是则执行数据插入操作,将数据保存至数据库中。其实现代码如下:

procedure TfrmStock.btnSaveClick(Sender: TObject);

var

  InsertHeader, InsertBody, SelectBody: string;

begin

  try

    if lblAuditing.Caption = '已审核' then

    begin

      Application.MessageBox('已审核不能再保存数据!','提示',16);

      Exit;

    end;

    if (cmbxMedicineID.Text = '') or (edtByPrice.Text = '') or (edtJobPrice.Text = '') or (edtRetailPrice.Text = '') then

    begin

      Application.MessageBox('明细数据不能为空!','错误',16);

      cmbxMedicineID.SetFocus;

      Exit;

    end;

    if lblStockID.Caption = '自动生成' then

    begin

      Application.MessageBox('主项数据没有单号,请添加!','错误',16);

      Exit;

    end;

    InsertHeader := 'Exec proc_StockTask @Flag=''InsertHeader'''

                 + ',@StockID=' + Quotedstr(lblStockID.Caption)

                 + ',@ProviderID=' + Quotedstr(cmbxProviderID.Text)

                 + ',@StockDatetime=' + Quotedstr(DateToStr(Date))

                 + ',@TabMan=' + Quotedstr(LoginID)      

                 + ',@Remark=' + Quotedstr(edtRemark.Text);

    InsertBody := 'Exec proc_StockTask @Flag=''InsertBody'''

                + ',@StockID=' + Quotedstr(lblStockID.Caption)

                + ',@MedID=' + Quotedstr(cmbxMedicineID.Text)

                + ',@ByPrice=' + edtByPrice.Text

                + ',@JobPrice=' + edtJobPrice.Text

                + ',@RetailPrice=' + edtRetailPrice.Text

                + ',@Amount=' + edtAmount.Text;

    SelectBody := 'Exec proc_StockTask @Flag=''SelectStock'''

                 +',@StockID='  + QUotedstr(lblStockID.Caption);

    ExecSQL(qryStockHeader,InsertHeader);

    ExecSQL(qryStockBody,InsertBody);

    OpenDataSQL(qryStockBody, SelectBody)

  except

    Application.MessageBox('保存数据错误,请查实!','错误',16);

  end;

end;

(6) 添加“审核”按钮的单击事件,此事件主要实现了单据的审核锁定,为入库管理更新库存作准备。其实现代码如下:

procedure TfrmStock.btnAuditingClick(Sender: TObject);

var

  Auditing: string;

begin

  if lblAuditing.Caption = '已审核' then

  begin

    Application.MessageBox('不能重复审核!','提示',16);

    Exit;

  end;

  if DBGrid1.DataSource.DataSet.IsEmpty then

    Exit;

  if Application.MessageBox('确定要审核此单吗?','提示',68) = IDNo then

    Exit;

  Auditing := 'Exec proc_StockTask @Flag=''Auditing'''

             +',@StockID=' + Quotedstr(lblStockID.Caption);

  ExecSQL(qryAudtiting,Auditing);

  Application.MessageBox('审核成功!','提示',64);

  lblAuditing.Caption := '已审核';

end;

(7) 添加“查找”按钮的单击事件,此事件的功能主要是查找采购单。其实现代码如下:

procedure TfrmStock.btnFindClick(Sender: TObject);

var

  SelectAll, FindID: string;

  FindBool: Boolean;

begin

  try

    FindID := lblStockID.Caption;

    FindBool := InputQuery('查询', '输入查询的编号', FindID);

    if FindBool then

    begin

      if lblStockID.Caption = '自动生成' then Exit;

      SelectAll := 'Exec proc_StockTask @Flag=''SelectStock'''

                  +',@StockID=' + Quotedstr(FindID);

      OpenDataSQL(qryStockBody, SelectAll);

      OpenDataSQL(qryStockHeader, SelectAll);

      lblStockID.Caption := qryStockHeader.FieldByName('StockID').AsString;

      cmbxProviderID.Text := qryStockHeader.FieldByName('ProviderID').AsString;

      dtpStockDatetime.Date := StrToDate(qryStockHeader.FieldByName('StockDatetime').AsString);

      lblAuditing.Caption := qryStockHeader.FieldByName('Auditing').AsString;

      edtRemark.Text := qryStockHeader.FieldByName('Remark').AsString;

    end;

  except

    Application.MessageBox('查询错误,请核实后重新查询!','错误',16);

    lblStockID.Caption := '自动生成';

  end;

end;

4.10  入库管理

“入库建立”窗体主要实现进货入库管理,其中包含了入库主单据的录入。

为了实现这些功能,需要控件如下:

3个TComboBox控件,用来选择入库类别、采购单号和药品编号;

5个TBitBtn控件,分别用来实现对数据库的添加、修改、删除、保存、查找和审核;

4个TEdit控件,用来输入入库资料的详细信息;

2个TComboBox控件,用来选择采购单号和药品编号;

2个TDateTimePicker控件,用来输入入库时间和有效日期;

1个TDBMemo控件,显示输入备注信息;

1个TDBGrid控件,用来显示入库数据。

窗体的设计界面如图4-9所示。

图4-9 入库建立

(1) 在数据库中添加名为“proc_InDepot”的存储过程,此过程主要用来实现入库模块后台数据库所有的业务逻辑。在存储过程中使用“@Flag”将代码分为了八大段,分别处理不同的入库业务数据。其中,SelectMaxID用于获取最大的入库单据号;InsertHeader、InsertBody和DelHeader、DelInDepot分别实现了向入库主表和从表添加记录及删除记录;“UpdateAuditing”用于更改单据审核字段状态;SelectInDepot和SelectType分别根据入库单号和入库类型查询数据。

(2) 添加窗体的OnShow事件,此事件的功能主要是初始化入库模块一些控件的初值。

(3) 添加“添加”按钮的单击事件,此事件的功能主要是调用存储过程,清空输入条件并新增入库流水单号,实现添加操作。

(4) 添加“删除”按钮的单击事件,此事件的功能主要是判断单据是否已经审核,当单据还未审核时可以删除单据信息。通过调用“proc_InDepot”存储过程,当“@Flag”变量标记为“DelInDepot”和“DeleteHeader”时删除从表和主表数据,维持主从表数据的完整性。

(5) 添加“保存”按钮的单击事件,此事件的功能是调用“proc_ InDepot”存储过程,判断“@Flag”标记是否为“InsertHeader”和“InsertBody”,若是则执行数据插入操作,将数据保存至数据库中。

(6) 添加“审核”按钮的单击事件,入库单据的审核除了将入库单据锁定以外,还将当前入库单信息更新到系统的库存表中。在这里使用到了另一个存储过程proc_Storage。

(7) 添加“查找”按钮的单击事件。实现代码如下:

procedure TfrmInDepot.btnFindClick(Sender: TObject);

var

  SelectAll, FindID: string;

  FindBool: Boolean;

begin

  try

    FindID := lblInDepotID.Caption;

    FindBool := InputQuery('查询', '输入查询的编号', FindID);

    if FindBool then

    begin

      SelectAll := 'Exec proc_InDepot @Flag=''SelectInDepot'''

                  +',@InDepotID=' + Quotedstr(FindID);

      OpenDataSQL(qryInDepotHeader, SelectAll);

      OpenDataSQL(qryInDepotBody, SelectAll);

      cmbxType.Text := qryInDepotHeader.FieldByName('InDepotType').AsString;

      cmbxStockID.Text := qryInDepotHeader.FieldByName('StockID').AsString;

      InDepotDatetime.Date := StrToDate(qryInDepotHeader.FieldByName('InTime').AsString);

      lblInDepotID.Caption := qryInDepotHeader.FieldByName('InDepotID').AsString;

      lblProviderID.Caption := qryInDepotHeader.FieldByName('ProviderID').AsString;

      memRemark.Text := qryInDepotHeader.FieldByName('Remark').AsString;

      lblAuditing.Caption := qryInDepotHeader.FieldByName('Auditing').AsString;

    end;

4.11  出库管理

“出库建立”窗体主要实现销售出货管理,其中包含了销售主单据的录入和药品明细的录入。

为了实现这些功能,需要如下控件:

2个TComboBox控件,用来选择销售类别和药品编号;

6个TBitBtn控件,分别用来实现对数据库的添加、修改、删除、保存和查找,报表的打印和审核;

2个TEdit控件,分别用来输入销售价格和销售数量;

2个TDateTimePicker控件,用来输入销售时间和有效日期;

1个TDBMemo控件,显示输入备注信息;

1个TDBGrid控件,用来显示销售数据。

窗体的设计界面如图4-10所示。

图4-10 销售出库建立

(1) 在数据库中添加名为“proc_Sale”的存储过程,此过程主要用来实现出库模块的业务逻辑。“@Flag”将代码分为了七大段,分别处理不同的出库业务数据。其中,SelectMaxID用于获取最大的出库单据号;InsertHeader、InsertBody和DelHeader、Del Sale分别用于向出库主表和从表添加记录及删除记录;“UpdateSale”用于更改单据审核字段状态;SelectSale根据出库查询数据。

(2) 添加窗体的OnShow事件,此事件的功能主要是初始化销售模块一些控件的初值。

(3) 添加“添加”按钮的单击事件,此事件的功能主要是调用存储过程,清空输入条件并新增出库流水单号,实现添加操作。

(4) 添加“删除”按钮的单击事件,此事件的功能主要是判断单据是否已经审核,当单据还未审核时可以删除单据信息。通过调用“proc_ Sale ”存储过程,当“@Flag”变量标记为“DelSale”和“DelHeader”时删除从表和主表数据,维持主从表数据的完整性。

(5) 添加“保存”按钮的单击事件,此事件的功能是调用“proc_ Sale”存储过程,判断“@Flag”标记是否为“InsertHeader”和“InsertBody”,若是则执行数据插入操作,将数据保存至数据库中。

(6) 添加“审核”按钮的单击事件,在此事件中调用存储过程proc_Storage中参数@Flag为“OutUpdateStorage”的SQL语句段,实现审核出货功能。“审核”按钮单击事件还实现了更改审核状态并更新库存,将库存量减少。

(7) 添加“查找”按钮的单击事件。

4.12  库存盘点

“盘点建立”窗体主要实现库存盘点管理,其中包含了盘点主单据的录入和盘点药品明细的录入以及盘点单的打印。

为了实现这些功能,需要如下控件:

3个TComboBox控件,用来选择盘点人员编号、药品类别和药品编号;

6个TBitBtn控件,分别用来实现对数据库的添加、修改、删除、保存和查找,报表的打印和审核;

1个TEdit控件,用来输入盘点数量;

2个TDateTimePicker控件,用来输入盘点日期和有效日期;

1个TDBMemo控件,显示输入备注信息;

1个TDBGrid控件,用来显示盘点数据;

1个TRvProject控件,Rave报表工程控件;

1个TRvSystem控件,用来管理Rave报表的控件;

1个TRvDataSetConnection控件,报表数据集连接控件。

窗体的设计界面如图4-11所示。

图4-11 盘点建点

(1) 在数据库中添加名为“proc_Check”的存储过程,此存储过程主要用来实现同的库存盘点业务库存盘点模块功能。在存储过程中使用“@Flag”将代码分为了七大段,分别处理不数据。其中,SelectMaxID用于获取最大的盘点单据号;InsertHeader、InsertBody和DelCheck、DelHeader分别用于向盘点主表和从表添加记录及删除记录;“UpdateCheck”用于更改单据审核字段状态;SelectCheck根据盘点单查询数据。

(2) 添加窗体的OnShow事件,此事件的功能主要是初始化盘点模块一些控件的初值。

(3) 添加“添加”按钮的单击事件,此事件的功能主要是调用存储过程,清空输入条件并新增盘点流水单号,实现添加操作。

(4) 添加“删除”按钮的单击事件,此事件的功能主要是判断单据是否已经审核,当单据还未审核时可以删除单据信息。通过调用“proc_ Check”存储过程,当“@Flag”变量标记为“DelCheck”和“DelHeader”时删除从表和主表数据,维持主从表数据的完整性。

(5) 添加“保存”按钮的单击事件,此事件的功能是调用“proc_ Check”存储过程,判断“@Flag”标记是否为“InsertCheck”和“InsertBody”,若是则执行数据插入操作,将数据保存至数据库中。

(6) 添加“审核”按钮的单击事件,此事件主要用来实现盘点单审核功能。

(7) 添加“查找”按钮的单击事件,此事件的功能主要是查找盘点信息。

4.13  药库查询

“库存的查询”窗体主要按照查询项目和条件查找仓库药品库存的信息。

为了实现这些功能,需要如下控件:

2个TComboBox控件,用来选择查询项目和查询条件;

1个TBitBtn控件,用来实现查询操作;

1个TDateTimePicker控件,用来选择日期查询条件;

1个TDBGrid控件,用来显示查询结果的数据表格。

窗体的设计界面如图4-12所示。

图4-12 库存查询

(1) 在数据库中修改存储过程“proc_Storage”,依次添加“@Flag”参数为“Select_Type”、“Select_MedicineID” “Select_ValidityTime” “Select_Big” “Select_Small”五段SQL语句,这些语句分别根据传入的参数而执行不同的查询。

(2) 添加“查询”按钮的单击事件,此事件的功能是按选择的条件查询库存信息。


5  系统的调试和测试

对于每一个开发的应用系统都需要对其进行调试与测试,系统是否具有严密性、正确性,是否在功能上达到完善,实现功能需求,只能通过严格的调试和测试,发现和解决问题,才能达到完整的开发一个应用软件的要求。如果测试不能通过,则所做的系统就不能投入使用,设计就是失败的,同时要也要做大量的系统调试。调试对于开发者来说也是很关键的。

5.1  系统调试目的

所谓系统调试[12]就是在计算机上用各种可能的数据和操作条件反复的对程序进行试验,发现错误就及时修改,从而使其完全符合设计要求的过程。单独运行的各个程序和模块,看看是否能够达到预期的目标,在出错的地方仔细分析,查找产生错误的原因,并找出解决的方法,再进行逐步调试,达到真正的无误后,开始进行总体调试,对系统整体上进行调试,检查各模块数据之间是否准确,模块间的接口是否恰当,能否满足用户的需要。在软件的产品中难以避免地隐藏着各种错误和缺陷,不可能十分完美。为了保证软件的质量和可靠性,在软件投入运行之前进行软件调试与测试是非常关键的步骤。为了保证本软件运行的正确性和有效性,必须做好系统的调试,把一切有可能发生错误的几率降低到最小,使运行时尽量不发生错误,这是一个系统进行调试的主要目的所在。

5.2  调试中出现的问题即解决的办法

经过总结共有3类经常出现的错误,即语法错误、逻辑错误和例外错误。

(1) 语法错误:是其中最容易出现和纠正的。编译程序代码是查找大多数语法错误的最快方法,但是有一些与语法相关的错误并不能在编译中表达出来。常见的语法错误例如:忘记书写表达式中的等号与其它运算符;不正确地拼写命令或函数名;字符串两边的引号不配对;常见的错误是在字符串中使用了与区分字符串界限的引号相同的引号;复杂表达式中的括号不配对;变量未定义或定义错误;对象引用错误;赋值类型不匹配。

(2) 逻辑错误:很难发现和排除,编译通过却不能达到预期的运行结果。这时必须认真分析解决问题思路的每一个细节,程序语句所实现的局部功能是否与全局环境相兼容等,作各种尝试,直至将问题,调试成功。

(3) 例外错误:是由程序直接控制的外部环境引起的。例如,程序因为找不到它所需要的文件而出错,也许这个文件已被删除或移动;或者访问数据库的权限不足,需要分配更高级的权限。

5.3  测试的目的

设计好的程序需要经过测试才能明确的知道其功能上的不足之处。系统测试是管理信息系统开发期间中一个十分重要而漫长的阶段。其重要性体现在它是保证系统质量与可靠性的最后关口。且对整个系统开发过程包括系统分析、系统设计和系统实现的最终审查。在程序中往往存在着许多预料不到的问题,可能会被疏漏,许多隐藏的错误只有在特定的环境下才可能暴露出来,会遗留到运行阶段中去,所以我们把测试的目标对准发现程序中存在的错误,在选取测试用例时,考虑那些易于发现程序错误的数据。通过用随机数据,逻辑数据,和典型数据的测试,确认软件的功能和性能与用户的要求基本一致,软件可以接受。最后,进行系统测试。把软件作为整个计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其它系统元素结合在一起,在实际运行(使用)环境下,对计算机系统进行一系列的组装测试和确认测试。验证软件的可行性。

系统的测试与调试是不相同的,系统进行调试的目的是为了找出该系统的问题和错误,而测试是为了检测系统是否能够达到预期的效果,我们在进行系统测试时选择了黑盒测试方法,即不关心软件的结构,只强调测试的功能。我们采用了多组数据分别进行测试,发现运行结果和手工的结果一致,说明设计基本成功,如果发现问题在详细的进行调试,尽量使整套系统完美。

5.4  测试的经验与体会

  本系统用尽量多的各种数据进行测试。在测试“修改密码”模块时,输新密码之后,数据库中数据未发生改变。检查编写的代码,发现存储过程语句有问题,存储过程声明的变量与主程序中声明的变量不一致,统一变量名称后实现了密码修改。在“药品盘点”模块中,选择盘点人员编号时盘点人员编号未能与盘点人员名称对应,检查源代码发现变量声明时对应数据表数据发生错误,修改为应对应数据表数据后实现所需求的功能。其实解决这种问题并不复杂,但对不熟悉软件内部构造的操作人员来说是相当困难的。所以我尽可能用各种数据进行测试,以便发现问题及时解决。经过不断测试,本系统基本无错。


总  结

  医院管理系统基本实现了最初的设计思想,满足了医院对药品进货,销售以及库存管理的基本需求,比较接近预定的性能指标。本系统采用的是典型的客户端/服务器(C/S)设计模式。系统采用SQL Server 2000数据库,而且系统中所有的后台数据库业务操作都由存储过程来实现;首先根据大部分药品进销存公司的实际情况,将药品进销存管理系统的业务逻辑划分开来,然后通过存储过程完成系统功能。本系统中利用Delphi开发工具把SQL Server 2000存储过程与Delphi数据库应用程序开发相结合做出来合理的系统解决方案,并对系统模块进行合理的业务划分和权限划分。使用SQL Server 2000存储过程开发的系统业务,结合Delphi开发工具快速简便的调用方式使系统的可扩展性和运行效率得到了提高。

  本系统也有很多不足之处:许多程序模块还可以进一步细化,如利用存储过程将主从表数据进行批量提交,在后台存储过程中应该适当加入事务处理来进行数据库操作异常处理。


参考文献

1          唱江华,邓文新.Delphi面向对象程序设计教程[M].北京:北京航空航天大学.2003,10~23

2          赵应丁.Delphi 7 数据库应用技术与实例[M].北京:中国水利水电出版社.2003,1~160

3          侯太平,童爱红.Delphi 数据库编程[M]. 北京:清华大学出版社.北京交通大学出版社.2004,56~123

4          赛奎春,陈紫鸿,宋坤. Delphi 数据库开发关键技术与事例应用[M].北京:人民邮电出版社. 2004,56~113

5          肖明.信息系统分析与设计[M].北京:高等教育出版社.2002,56~123

6          求是科技. SQL Server 2000数据库开发技术与工程实践[M].北京:人民邮电出版社2005,105~120

7          宋振会.SQL Sever 2000中文版基础教程[M].北京:清华大学出版社.2005,30~37

8          赵杰,李涛,朱慧. SQL Sever数据库管理设计与实现教程[M].北京:清华大学出版社.2004,290~299

9          张莉,王强,赵文等.SQL Server数据库原理及应用教程[M].北京:清华大学出版, 2003,35~30

10      (美)尼尔森,刘瑞.Microsoft SQL Server 20## 宝典[M].北京:中国铁道出版社.2001,114~201

11      微软公司.Microsoft SQL Sever 2000数据库编程[M].美国:微软公司.2002,99~120

12      李军,张桂英,徐波.Delphi7项目开发实践[M].北京:中国铁道出版社.2003,78~213

13      Cem Kaner, Jack Falk, Hung Quo. Naguyen. Testing Computer Software[M]. 北京:机械工业出版社. 2004,57~66

14      Read Jacobson.SQL Server Analysis Services 学习指南[M].北京:机械工业出版社.2002,87~96

15      Ian Sommerville .Software Engineering[M].北京:机械工业出版社.2004,120~169


相关推荐