医院药品管理系统的设计与实现 开题报告

时间:2024.4.27

中国矿业大学徐海学院

本科生毕业论文(设计)

开题报告

姓    名: 程国升         学  号 22090105    

专    业:  信息与电气工程系自动化09-2班       

题    目:  医院药品进销存管理系统设计与实现    

专    题:                                      

指导教师:  周林娜       职 称:     讲师       

              

 

              20## 年    4 月     徐州



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


社区医院药品管理系统

设计与实现

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


更多相关推荐:
药品管理系统的设计与实现开题报告

毕业论文设计开题报告

.NET药店管理系统开题报告

廊坊师范学院本科生毕业论文设计开题报告书

开题报告_中小型药房药品进销存管理系统

毕业设计论文开题报告题目名称中小型药房药品进销存管理系统题目类别毕业设计中小型药房药品进销存管理系统一题目来源科研真题二研究目的和意义随着医疗制度改革的运行药品招标采购的逐年规范和扩大药品进销存管理已经成为各大...

医院信息管理系统 开题报告0507

填表说明12研究生须认真填写本表相关内容开题报告内容见电子科技大学在职攻读工程硕士专业学位研究生管理暂行规定3所列栏目填写不下的可以另加附页4本表采取双面印制且保持原格式不变纸张限用A4页边距为上下25cm左为...

文献管理系统开题报告

东北大学软件学院毕业设计论文开题报告设计论文题目科技文献管理系统姓名专业软件工程住址电话电子邮箱实习单位学号班级开题日期20xx年3月22日指导教师评语及改进意见选题来自实际需求选题合理缺少业务描述和功能介绍同...

仁爱医院住院管理系统设计开题报告

附件4123

药品订购系统开题报告

本科毕业论文设计开题报告系院届别姓名学号专业1115070142计算机科学与技术指导教师姓名职称教务处制二一五年二月计算机与信息工程学院20xx届罗婵胡秦斌讲师1广西师范学院本科毕业论文设计开题报告234

祥乐大药房进销管理系统的设计与实现开题报告

附件4注此表由学生填写开题报告会结束后由指导教师和小组签署意见论文答辩前学生将此表交指导老师此表按要求装订在论文文本内

企业人事管理系统毕业论文毕业论文开题报告

Xxxx毕业设计论文开题报告学生姓名学号专业论文题目指导教师20xx年10月8日新疆财经大学毕业设计论文开题报告计算机科学与工程学院计算机科学与技术专业计算机042班注1本表一式三份指导教师与学生各执一份一份交...

人事管理系统毕业设计开题报告

附件5北京理工大学珠海学院毕业设计论文开题报告题目某食品公司人事管理信息系统的设计与实现学院管理与经济学院专业信息管理与信息系统学生姓名林敬虎指导教师郑述招

车辆管理系统-开题报告

北方工业大学本科毕业设计论文开题报告书题目车辆管理系统指导教师专业班级学号姓名日期年月日一选题的目的意义二本题的基本内容三完成期限和主要措施四预期达到的目标五主要参考文献六指导教师意见包括毕业实习七系审查意见八...

房产信息管理系统开题报告

毕业设计开题报告学院学生姓名专业学号班级指导教师年月毕业设计论文开题报告表

医药管理系统开题报告(10篇)