资源描述
《数据库原理及应用》课程设计
设计题目 医药销售管理系统
设计时间 2011.12.29至 2012.1.4
学生姓名
学生学号
所在班级
指导教师
摘 要
根据医药管理系统的需求分析结果总结系统内实体及联系并绘制系统的局部ER图然后画出全局ER图。结合需求分析与概念结构设计把设计好的ER图转换为DBMS所支持的数据模型所符合的逻辑结构,运用SQL数据库管理系统建好表和相关约束。
关键词: 医药管理系统;ER图;DBMS;数据模型;SQL
目 录
1课题描述 3
2设计过程 4
2.1 需求分析 4
2.1.1 系统目标与要求 4
2.1.2 系统分析 4
2.1.3 业务流程图 4
2.2 系统逻辑方案 5
2.2.1 数据流程图(DFD): 5
2.2.2 数据字典(简称DD) 6
2.3系统总体结构设计 7
2.3.1软件系统总体结构设计 7
2.3.2数据存储的总体设计 7
2.3.3系统功能模块设计 7
2.4数据库详细设计 8
2.4.1数据库设计 8
2.4.2 数据库的完整性和安全性 12
2.5 数据库操作(SQL Server2000语句完成) 一三
2.5.1创建医药销售管理系统 一三
2.5.2创建药品类别索引信息表 一三
2.5.3建立存储过程向表中插入、修改、删除数据 14
2.5.4建立存储过程实现单表查询 一五
2.5.5视图建立 17
2.5.6建立INSERT触发器 17
2.5.7建立DELETE触发器 17
2.5.8建立UPDATE触发器 17
总 结 19
参考文献 20
1课题描述
近年来,中国医药行业迅速发展,药店企业多业态经营,仓储式大型超市、中等规模超市、便利连锁综合发展。随着规模的扩大,传统的医药管理已经不能适应发展的需要,很难在激烈的竞争中生存。
通过对从事医药产品的零售、批发等工作企业的深入调查,发现其业务主要包括企业药品销售、出入库管理、企业的财务、人事管理等。医药管理是一项琐碎、复杂而又十分细致的工作。手工进行企业日常的药品销售、出入库的工作,容易出现“开空单”的现象,且呆账、错账时有发生,而且费时费力。本系统在设计中考虑和克服了上述问题,实现了企业管理工作的系统化、规范化和自动化。
开发环境:CPU:Intel Pentium4 2GHz
内存:1G
操作系统:Microsoft Windows XP
后台数据库在Microsoft SQL Server 2000
2设计过程
本系统进行了建立数据库的必要性和可行性的分析,需求分析,数据库的概念设计、逻辑设计、物理设计和数据库的实现、运行、维护以及相应的前台的主要功能模块的开发。
2.1 需求分析
2.1.1 系统目标与要求
要求本系统能够投入实际的使用并且满足基本的功能要求。要求具有较高的可靠性、安全性和易维护性,具有较高的可移植性。
本系统实现了以下的功能:
基本信息模块:包括药品信息、员工信息、客户信息、供应商信息四个子模块。
(1)进货管理模块:包括入库登记、入库登记查询二个子模块。
(2)库房管理模块:包括库存查询、库存盘点、退货处理三个子模块。
(3)销售管理模块:包括销售登记、销售退货、销售报表查询三个子模块。
(4)财务统计模块:包括当日统计、当月统计二个子模块。
(5)系统维护模块:包括数据安全管理、操作员管理、权限设置三个模块。
说明:根据对现实中医药销售管理业务,将用户分为二类超级管理员(经理)、普通管理员(操作员)。
2.1.2 系统分析
用户活动及活动图
(1)经理主要参与活动有:
① 查询销售情况和财务状况以便了解本企业的经营状况,作出相应的决策;
② 管理员工,了解不同员工的上班时间和他的相关的业绩;
③ 客户的管理,了解客户的数量,注销有问题的客户;
④ 供应商的管理,了解供应信息,选择最合适的供应商。
(2)营业员主要活动有:
①医药销售管理是指对药品信息的录入、更新、修改和删除;
②查询药品信息,以了解是否有该药品和库存等信息;
③销售药品,出库记录;
④退还药品,入库记录;
⑤现金收支是指对进出帐目的记录统计。
(3)顾客主要活动:
①查询药品信息;
②选购药品。
2.1.3 业务流程图
2.2 系统逻辑方案
系统分析的主要成果是系统的逻辑模型。本系统的逻辑模型主要是以系统的数据流图和数据字典为主要描述工具。即在无纸化网络考试系统管理方式和业务流程进行认真分析和研究的基础上,排除现有组织机构和业务分工所造成的信息障碍。
2.2.1 数据流程图(DFD):
数据流图是组织中信息运动的抽象。是在调研的基础上,从系统的科学性、管理的合理性、实际运动的可行性角度出发。将信息处理功能和彼此之间的联系自顶向下,逐层分解,从逻辑上精确地描述系统应具有的数据加工功能、数据输入、数据输出、数据存储及数据来源和去向(外部实体)等项目。
在数据流程图中可以很清楚的看到数据的流向,药品信息的数据分别能够流向经理、员工和顾客。药品销售信息的信息也流经理。药品销售信息记录的是药品销售和退还的信息。顾客表信息从顾客流出又可以流回到顾客和员工、经理。
2.2.2 数据字典(简称DD)
绘制DFD,只是对数据处理和彼此之间的联系进行了说明。为进一步明确数据的详细内容和数据加工过程,应将数据流图中的全部数据流及其组成部分的数据元素,数据存储,数据加工,通过数据字典描述清楚,以便于此后系统设计的进行。这就需要开发人员编写详细的数据字典,来描述系统开发过程的细节。
下面列出本系统中的数据项、数据流、数据存储、加工处理和数据结构的数据字典。数据字典可采用图表格式或较紧凑的记录格式描述,本文采用的是图表格式。
数据项的DD表列举如下:
表2.1 药品编号的数据字典
数 据 项
系统名:医药销售管理系统 编号:I001 名称:药品编码 别名:
数据项值: 类型:字符型 长度:6个字节 取值范围:
简述:每种药品都具有唯一的编号,它是某种药品的唯一标识符,每种药品都有唯一的编号,如“011976”通常用前两位数字表示入库的年份,中间两位表示类别,最后两位表示该药的序号。如果该类药数超过100种时,可用“0119A0”表示第100种药。
修改记录:
编写
日期
审核
日期
表2.2 药品名称
数 据 项
系统名:医药销售管理系统 编号:I002 名称:药品名称 别名:
数据项值: 类型:字符型 长度:32个字节 取值范围:
简述:每种药品都具有唯一药品标识。
修改记录:
编写
日期
审核
日期
表2.3 密码
数 据 项
系统名:医药销售管理系统 编号:I003 名称:售价 别名:
数据项值: 类型:数值型 长度:8个字节 取值范围:
简述:每种药品都要设置一个销售价格。
修改记录:
编写
日期
审核
日期
2.3系统总体结构设计
2.3.1软件系统总体结构设计
软件系统总体结构设计的主要任务就是将整个系统合理的划分成各个功能模块,正确处理模块之间与模块内部的联系及它们之间的调用关系和数据联系,定义各模块的内部结构等,本系统的软件总体结构按分解-协调的原则,信息隐蔽抽象的原则,自顶向下的原则,一致性原则,面向用户的原则进行设计。
2.3.2数据存储的总体设计
按用途分类可把本系统文件分成以下几种:
(1) 主文件:系统中的主文件是最重要的共享文件,主要存放具有固定值属性的数据。它需要长期保存,并不断更新。
(2) 处理文件:处理文件包含下一次更新文件所需要的全部记录,本系统中的处理文件如新闻登录日志文件、待审核项目信息文件。
2.3.3系统功能模块设计
通过对系统的数据流图进行分析,进一步进行功能分解,直到分解成含义明确,功能单一的功能模块,从而得到系统的功能模块结构图。
2.4数据库详细设计
2.4.1数据库设计
数据库的设计是指对一个给定的应用环境,构造数据库模式,建立数据库及其应用系统,满足各种用户需求。作为信息资源开发、管理和服务的一种有效的手段,数据库技术的应用已越来越广泛,从小型的单项事务处理系统到大型的信息系统大都用先进的数据库技术来保持系统数据的安全性、完整性和共享性。对一个实际的系统来说,数据库表的设计在遵循数据库理论的同时,必须能用开发工具来实现用户在各方面提出的功能要求。
⑴ E-R图:
在系统的数据库设计中,先要对系统分析得到的数据字典中的数据存储进行分析,分析各数据存储之间的关系,然后才能得出系统的关系模式。可以采用E-R图的方法来进行数据结构分析,E-R设计方法是一种通过E-R图来描述现实世界信息结构的DB设计方法。E-R图由实体、属性、联系三部分组成。各分E-R图说明如下:
① 经理E-R图:
② 供应商E-R图:
③ 员工E-R图:
④ 药品销售清单E-R图:
⑤ 客户E-R图:
⑥ 药品E-R图:
⑦ 整体E-R图:
⑵ 关系模式与码:
药品信息(药品编号,药品名称,药品类别代号,售价,进价,库存量,供应商,有效期) 外码:药品类别代号、 供应商
药品分类索引信息(药品类别代号,类别说明)
员工信息(员工号,姓名,用户名,密码,职位,权限)
客户信息(客户号,客户名称,联系人,联系方式,客户所在城市)
供应商信息(供应商号,供应商名称,联系人,联系方式,供应商所在城市)
药品销售信息(销售编码,销售日期,药品编码,药品名称,单价,数量,供应商,总额,销售员编码) 外码:销售员编码、药品编码
⑶ 关系模式优化:
在上述关系模式中,每一个分量都是不可分割的数据项所以都符合第一范式;而且前四个关系模式都是单个属性作为码,没有任何非主属性对码部分函数依赖,在药品销售信息内虽由三个属性作为码,但也不存在非主性对码的部分函数依赖,所以上都符合第二范式;药品信息、药品类别索引、客户信息、供应商信息四个关系模式中都不存在非主属性对码的传递函数依赖,都属于第三范式。
在员工信息关系模式中,员工是按照权限分类的,职位不同权限也不同,这样该关系模式就存在了非主属性对码的传递依赖:职工号->职位,职位->权限,所以就将用员工信息分解为如下现个模式:
①员工信息(员工号,姓名,用户名,用户口令,职位)
②职位权限信息(职位,权限)
本系统不考虑职工信息的管理,为了使销售员编号与销售员的职工号连系起来,并能通过职工姓名和职位来修改用户信息所以把员工的部分信息(职工号,姓名,职位)和经理(用户名,密码)合成了员工信息(员工号,姓名,用户名,密码,职位,权限)以便系统功能的实现,所以在此不采用模式分解。
药品销售信息中有大量的数据冗余,表达不明确,将其分解为如下两个模式:
①药品销售主表(销售编码,销售日期,销售员编号,总金额)
②药品销售子表(销售编码,销售日期,药品编码,药品名称,单价,数量,供应商)
⑷ 数据库设计
对上述E-R图所需的实体需要的几个关键表的设计如下:
表名:药品信息表
字段名
字段类型
长度
主键或外键
字段值约束
对应中文属性名
MedicineCode
Char
6
Primary Key
Not Null
药品编码
MedicineName
Varchar
32
Not Null
药品名称
MedKindCode
Char
10
Foreign key
Not Null
药品类别代码
Price
Money
8
售价
ListPrice
Money
8
进价
Number
Int
4
库存量
FirmCode
Char
10
Foreign key
供应商
Usefulllife
Datetime
8
有效期至
表名:客户信息
字段名
字段类型
长度
主键或外键
字段值约束
对应中文属性名
GuestCode
Char
10
Primary Key
Not Null
客户编码
GuestName
Varchar
16
Not Null
客户名称
gLink
Varchar
12
联系人
gLinkTell
Varchar
11
联系方式
City
Varchar
8
所在城市
表名:供应商信息
字段名
字段类型
长度
主键或外键
字段值约束
对应中文属性名
FirmCode
Char
10
Primary Key
Not Null
供应商编码
FirmName
Varchar
16
Not Null
供应商名称
Link
Varchar
12
联系人
LinkTell
Varchar
11
x
City
Varchar
8
所在城市
表名:药品销售主表
字段名
字段类型
长度
主键或外键
字段值约束
对应中文属性名
SaleNo
int
4
Primary Key
Not Null
销售编码
WorkNo
Char
10
Foreign key
Not Null
销售员编码
SaleDate
DateTime
8
销售日期
Amount
Money
8
总金额
表名:药品销售子表
字段名
字段类型
长度
主键或外键
字段值约束
对应中文属性名
SaleNo
int
4
Primary Key
Not Null
销售编码
MedicineCode
Char
6
Foreign key
Not Null
药品编码
MedicineName
Varchar
32
Not Null
药品名称
Price
Money
8
售价
Number
Int
4
数量
Unit
Char
8
单位
Amount
Money
8
金额
表名:药品类别索引信息
字段名
字段类型
长度
主键或外键
字段值约束
对应中文属性名
MedKindCode
Char
10
Primary Key
Not Null
药品类别代码
KindExplanation
Varchar
12
Not Null
类别说明
表名:员工信息
字段名
字段类型
长度
主键或外键
字段值约束
对应中文属性名
WorkNo
Char
10
Primary Key
Not Null
职工号
Name
Varchar
12
姓名
UserRegName
Char
6
Not Null
用户登录名
Password
Char
10
Not Null
用户口令
Position
Char
10
用户身份
Power
Int
4
用户权限
2.4.2 数据库的完整性和安全性
⑴ 数据库的完整性
数据库的完整性是指数据的正确性和相容性。数据库管理系统(DBMS)用一定的机制来检查数据库中的数据是否满足规定的条件——完整性约束条件,数据的约束条件是语义的体现,将作为模式的一部分存入数据库中。
本系统中定义了表与表之间的联系有助于实现完整性规则,一般在程序中实现具体的完整性控制。
实体完整性
例如:CREATE TABLE MedInfor/*创建药品信息表*/
(MedicineCode char(6) constraint M_PRIM PRIMARY KEY,
MedicineName varchar(8) NOT NULL,
MedKindeCode char(10) FOREIGN KEY REFERENCES MedID(MedKindeCode),
Price Money(8),
ListPrice Money(8),
Number Int(4),
FirmCode char(10) FOREIGN KEY REFERENCES FirmInfor(FirmCode),
Userfulllife Datetime)
参照完整性
例如:create table sellMain/*创建医药销售主表*/
(SaleNo int constraint SM_PRIM PRIMARY KEY,
WorkNo char(10) FOREIGN KEY REFERENCES WorkInfor(WorkNo),
SaleDate DateTime,
Amount Money)
⑵ 数据库的安全性
数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄漏、更改或破坏。在数据库系统中,大量的数据集中存放,而且为许多用户直接共享,是宝贵的信息资源,系统的安全保护措施就显得更为重要,它保护数据库防止恶意的破坏和非法的存取。
本系统包括数据库的安全和服务器的安全。采用管理员表示和鉴定的方法实现数据库的安全,此安全管理措施并不在前台开发工具中实现,而是在后台数据库中实现。在登录数据库时,系统让管理员户表示自己的身份,不同的管理员权限不同,系统进行核实,鉴别此管理员是否为合法用户,若是,系统进一步核实用户,通常要求用户输入口令,系统和对用户口令以鉴别用户身份。服务器的安全也是通过用户在登录服务器时输入合法的用户名和密码来实现的。这是一种简单可行的方法,实现起来比较方便。没有采用更加复杂的系统安全管理措施是因为本管理系统一般是应用在校园网中,采用安全管理措施主要是为了防止没有修改权限的用户无意间修改了数据,因此采用用户标识和鉴定的安全管理措施就能够保障数据库的安全性。
2.5 数据库操作(SQL Server2000语句完成)
数据库的选择和部分重要SQL代码
2.5.1创建医药销售管理系统
create database MedicalManagerSystem/*创建医药销售管理系统*/
use MedicalManagerSystem
2.5.2创建药品类别索引信息表
create table MedID//创建药品类别索引信息表
(MedKindeCode char(10) constraint MI_PRI PRIMARY KEY,
KindExplanation varchar(12) NOT NULL)
其余略
2.5.3建立存储过程向表中插入、修改、删除数据
⑴ 插入数据的存储过程
create proc MedID_proc
xMedKindeCode char(10),xKindExplanation varchar(12)
as
insert into MedID (MedKindeCode,KindExplanation) values(xMedKindeCode ,xKindExplanation )
exec MedID_proc '0001','口腔溃疡'
exec MedID_proc '0002','感冒'
exec MedID_proc '0003','发烧'
exec MedID_proc '0004','拉肚子'
exec MedID_proc '0005' ,'外伤'
其余略
⑵ 删除数据的存储过程
create proc MedID_delete_proc
xMedKindeCode char(10)
as
delete from MedId
where MedKindeCode=xMedKindeCode
exec MedID_delete_proc '0002'
其余略
⑶ 修改数据的存储过程
create proc MedID_update_proc
xMedKindeCode char(10),xKindExplanation varchar(12),xMedKindeCode1 char(10)
as
update MedID
set MedKindeCode=xMedKindeCode,KindExplanation=xKindExplanation
where MedKindeCode=xMedKindeCode1
其余略
2.5.4建立存储过程实现单表查询
/*建立名为“单表查询1”的存储过程,用来查询某种药品的信息*/
create proc 单表查询1
xMedicineCode char(6)
AS
select *
from MedInfor
where MedicineCode=xMedicineCode
其余略
建立存储过程实现连接查询
/*建立名为“连接查询1”的存储过程,用来查询某个药品名称对应的药品类型的信息*/
create proc 连接查询1
xMedicineName varchar(8)
as
select MedicineName ,KindExplanation
from MedInfor,MedID
where MedID.MedKindeCode=MedInfor.MedKindeCode and
MedicineName=xMedicineName
/
建立存储过程实现嵌套查询
/*建立名为“嵌套查询1”的存储过错,用来查询某类药品的销售量*/
create proc 嵌套查询1
xKindExplanation varchar(12)
as
select Number
from sellChild
where MedicineCode In(select MedicineCode
from MedID
where KindExplanation=xKindExplanation)
/*建立名为“嵌套查询2”的存储过错,用来查询某个供应商提供的商品*/
create proc 嵌套查询2
xFirmName varchar(16)
as
select MedicineName
from MedInfor
where FirmCode In (select FirmCode
from FirmInfor
where FirmName=xFirmName)
建立存储过程实现集合查询
/*建立名为“集合查询1”的存储过错,用来查询提供某类商品的供应商数*/
create proc 集合查询1
xMedicineName varchar(8)
as
select avg(FirmCode)
from FrimInfor
where FirmCode in(select FirmCode
from MedInfor,FrimInfor
where MedInfor.FirmCode=FrimInfor.FirmCode and
MedicineName=xMedicineName)
其余略
2.5.5视图建立
由供应商信息表“FirmInfor”建立一个视图,该视图由供应商信息表的所有列构成*/
create view 供应商信息(供应商编码,供应商名称,联系人,x,所在城市)
as
select* from FirmInfor
2.5.6建立INSERT触发器
/*建立INSERT触发器*/
create trigger MedID_insert on MedID
for insert
as if(select count(*)
from MedID_med,inserted
where MedID_med.MedKindeCode=inserted.MedKindeCode)=0
rollback transaction
2.5.7建立DELETE触发器
create trigger delete_MedID on MedID
for delete
as
select* from MedID
declare xMedKindeCode char(10)
select xMedKindeCode=MedKindeCode from deleted
delete from MedID
where MedKindeCode=xMedKindeCode
select*from MedID
2.5.8建立UPDATE触发器
create trigger MedID_update on MedID
for update
as
if update(MedKindeCode)
begin
raiserror('you can not modify this column',16,1)
rollback transaction
end
总 结
本次课程设计调查从事医药产品的零售、批发等工作的企业,根据其具体情况,设计医药销售管理系统。加深了对数据库课程知识的理解。由于时间仓促,软件还有很多不足之处,如:药品信息查询部分不够完善,软件代码交冗余、效率不高等等,都相关功能缺乏认识造成的。在今后的学习中我们会加强理论的实践的结合,通过不断摸索来弥补自己在软件制作方面的差距。
参考文献
[1] 苗雪兰,刘瑞新,宋歌.数据库系统原理及应用教程[M].北京.机械工业出版社.2010
[2] 萨师煊,王 珊.数据库系统概论[M].北京:高等教育出版社.1997
[3] 刘真原.SQL SERVER2000培训教程[M].北京:清华大学出版社.2003
[4] 李清国.Windows 2000+ ASP SQL Server案例教程[M].上海: 中科多媒体电子出版社.2001
[5] 李晓黎.ASP+SQLSERVER网络应用系统开发指南[M].北京.人民邮电出版社.2004
附件:医药销售管理系统SQL语句,如下:
create database MedicalManagerSystem/*创建医药销售管理系统*/
use MedicalManagerSystem
create table MedID/*创建药品类别索引信息*/
(MedKindeCode char(10) constraint MI_PRI PRIMARY KEY,
KindExplanation varchar(12) NOT NULL)
create table MedInfor/*创建药品信息表*/
(MedicineCode char(6) constraint M_PRIM PRIMARY KEY,
MedicineName varchar(8) NOT NULL,
MedKindeCode char(10) FOREIGN KEY REFERENCES MedID(MedKindeCode),
Price Money,
ListPrice Money,
Number Int,
FirmCode char(10) FOREIGN KEY REFERENCES FirmInfor(FirmCode),
Userfulllife Datetime)
create table GueInfor/*创建客户信息表*/
(GuestCode char(10) constraint G_PRIM PRIMARY KEY,
GuestName varchar(16) NOT NULl,
GLink varchar(12),
GLinkTell varchar(11),
City varchar(8))
create table FirmInfor/*创建供应商信息表*/
(FirmCode char(10) constraint F_PRIM PRIMARY KEY,
FirmName varchar(16) NOT NULL,
Link varchar(12),
LinkTell varchar(11),
City varchar(8))
create table WorkInfor/*创建员工信息表*/
(WorkNo char(10) constraint W_PRIM PRIMARY KEY,
Name varchar(12),
UserRegName char(6) NOT NULL,
Password char(10) NOT NULL,
Position char(10),
Power Int)
create table sellMain/*创建医药销售主表*/
(SaleNo int constraint SM_PRIM PRIMARY KEY,
WorkNo char(10) FOREIGN KEY REFERENCES WorkInfor(WorkNo),
SaleDate DateTime,
Amount Money)
create table sellChild/*创建医药销售子表*/
(SaleNo int constraint SC_PRIM PRIMARY KEY,
MedicineCode char(6) FOREIGN KEY REFERENCES MedInfor(MedicineCode),
MedicineName varchar(32) NOT NULL,
Price Money,
Number Int,
Uint char(8),
Amount Money)
/*插入数据的存储过程 */
create proc MedID_proc
xMedKindeCode char(10),xKindExplanation varchar(12)
as
insert into MedID (MedKindeCode,KindExplanation) values(xMedKindeCode ,xKindExplanation )
exec MedID_proc '0001','口腔溃疡'
exec MedID_proc '0002','感冒'
exec MedID_proc '0003','发烧'
exec MedID_proc '0004','拉肚子'
exec MedID_proc '0005' ,'外伤'
create proc MedInfor_proc
xMedicineCode char(6),xMedicineName varchar(8),xMedKindeCode char(10),xPrice money,xListPrice money,
xNumber int,xFirmCode char(10),xUserfulllife Datetime
as
insert into MedInfor(MedicineCode ,MedicineName,MedKindeCode,Price,ListPrice,
Number,Supplicer,Userfulllife) values(xMedicineCode,xMedicineName,xMedKindeCode,xPrice,xListPrice,
xNumber,xFirmCode,xUserfulllife)
exec MedInfor_proc '1001','板蓝根','0002',5,3,'100','014','2010-12-5'
exec MedInfor_proc '2002','四季感康','0002',14,10.5,'一五0','051','2010-12-12'
exec MedInfor_proc '2003','银黄颗粒','0002',12,8.8, '120 ','014','2012-10-6'
exec MedInfor_proc '2004','感冒清热软胶囊','0002',17,12, '一五0','0一五', '2011-11-1'
exec MedInfor_proc '3001','阿斯匹林','0003',一五,11,'100','014','2010-12-1
展开阅读全文