09信计2011-2012(一)
《数据库原理及应用》课程设计
设计题目 医药销售管理系统 设计时间 学生姓名 学生学号
所在班级
指导教师
医药销售管理系统 1 可行性研究
近年来,中国医药行业迅速发展,药店企业多业态经营,仓储式大型超市、中等规模超市、便利连锁综合发展。随着规模的扩大,传统的医药管理已经不能适应发展的需要,很难在激烈的竞争中生存。
通过对从事医药产品的零售、批发等工作企业的深入调查,发现其业务主要包括企业药品销售、出入库管理、企业的财务、人事管理等。医药管理是一项琐碎、复杂而又十分细致的工作。手工进行企业日常的药品销售、出入库的工作,容易出现“开空单”的现象,且呆账、错账时有发生,而且费时费力。本系统在设计中考虑和克服了上述问题,实现了企业管理工作的系统化、规范化和自动化。
2 需求分析
2.1 任务概述
根据医药管理系统的需求分析结果总结系统内实体及联系并绘制系统的局部ER图然后画出全局ER图。结合需求分析与概念结构设计把设计好的ER图转换为DBMS所支持的数据模型所符合的逻辑结构,运用SQL数据库管理系统建好表和相关约束 2.1.1目标
要求本系统能够投入实际的使用并且满足基本的功能要求。要求具有较高的可靠性、安全性和易维护性,具有较高的可移植性。
本系统实现了以下的功能:
基本信息模块:包括药品信息、员工信息、客户信息、供应商信息四个子模块。 (1)进货管理模块:包括入库登记、入库登记查询二个子模块。
(2)库房管理模块:包括库存查询、库存盘点、退货处理三个子模块。 (3)销售管理模块:包括销售登记、销售退货、销售报表查询三个子模块。 (4)财务统计模块:包括当日统计、当月统计二个子模块。
(5)系统维护模块:包括数据安全管理、操作员管理、权限设置三个模块。
说明:根据对现实中医药销售管理业务,将用户分为二类超级管理员(经理)、普通管理员(操作员)。
2.1.2 运行环境
Windows 98/2000/XP/2003操作系统下,安装并配置软件Microsoft SQL Server 2000数据库管理系统。
2.2 数据需求
2.2.1 数据字典(DD)
绘制DFD,只是对数据处理和彼此之间的联系进行了说明。为进一步明确数据的详细内容和数据加工过程,应将数据流图中的全部数据流及其组成部分的数据元素,数据存储,数据加工,通过数据字典描述清楚,以便于此后系统设计的进行。这就需要开发人员编写详细的数据字典,来描述系统开发过程的细节。
下面列出本系统中的数据项、数据流、数据存储、加工处理和数据结构的数据字典。数据字典可采用图表格式或较紧凑的记录格式描述,本文采用的是图表格式。
数据项的DD表列举如下: 表2.1 药品编号的数据字典
表2.2 药品名称
表2.3 密码
2.2.2 数据库描述
使用SQL SERVER2000作为后台数据库,就可以行使基于网络连接的用户认证。从而给不同的子系统分配不同的数据库使用角色,让他们彼此之间使用的数据库隔离开来,以达到较高的安全性。
2.3 功能需求
2.3.1 功能划分
本系统实现了以下的功能: (1)基本信息模块 (2)进货管理模块 (3)库房管理模块 (4)销售管理模块 (5)财务统计模块 (6)系统维护模块
2.3.2 功能描述
(1)基本信息模块:包括药品信息、员工信息、客户信息、供应商信息四个子模块。 (2)进货管理模块:包括入库登记、入库登记查询二个子模块。
(3)库房管理模块:包括库存查询、库存盘点、退货处理三个子模块。 (4)销售管理模块:包括销售登记、销售退货、销售报表查询三个子模块。 (5)财务统计模块:包括当日统计、当月统计二个子模块。
(6)系统维护模块:包括数据安全管理、操作员管理、权限设置三个模块
2.3.3 数据流图(DFD):
数据流图是组织中信息运动的抽象。的合理性、实际运动的可行性角度出发。下,逐层分解,从逻辑上精确地描述数据输出、数据存储及数据来源和去
是在调研的基础上,从系统的科学性、管理将信息处理功能和彼此之间的联系自顶向
系统应具有的数据加工功能、数据输入、向(外部实体)等项目。
在数据流程图中可以很清楚的看到数据的流向,药品信息的数据分别能够流向经理、员工和顾客。药品销售信息的信息也流经理。药品销售信息记录的是药品销售和退还的信息。顾客表信息从顾客流出又可以流回到顾客和员工、经理。
2. 4 一致性需求
在医药销售管理系统相关的表之间,有较强的关联性,为了实现一致性的需求,我们在各个表之间建立起了一致性约束。
2. 5 完整性需求
根据医药销售系统的要求,为保持数据的完整性,采用了数据库的事务机制,防止出现操作故障。
3 概要设计
3.1总体设计
3.1.1 系统结构示意图
医药销售管理系统结构示意图通过对系统的数据流图进行分析,进一步进行功能分解,直到分解成含义明确,功能单一的功能模块,从而得到系统的功能模块结构图。
3.2 接口设计
3.2.1 外部接口
通过一定的计算机硬件,建立服务器系统,管理员通过管理服务器系统,与用户进行交互,从而达到资源共享的目的,实现图书管理系统。 3.2.2 内部接口
程序内部需要共同的数据定义和描述,此系统是智能办公化管理系统的一个子系统,必须和这个系统的其他子系统统一数据定义等,才能使该系统性能达到最好,并且要尽量消除和其他子系统模块之间存在的数据冗余,才能使整个智能办公系统做到高效,方便。 3.3 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图:
4 逻辑设计
4.1关系模式转换
药品信息(药品编号,药品名称,药品类别代号,售价,进价,库存量,供应商,
有效期) 外码:药品类别代号、 供应商
药品分类索引信息(药品类别代号,类别说明)
员工信息(员工号,姓名,用户名,密码,职位,权限)
客户信息(客户号,客户名称,联系人,联系方式,客户所在城市)
供应商信息(供应商号,供应商名称,联系人,联系方式,供应商所在城市)
药品销售信息(销售编码,销售日期,药品编码,药品名称,单价,数量,供应商,总额,销售员编码) 外码:销售员编码、药品编码
4.2模式优化
在上述关系模式中,每一个分量都是不可分割的数据项所以都符合第一范式;而且前四个关系模式都是单个属性作为码,没有任何非主属性对码部分函数依赖,在药品销售信息内虽由三个属性作为码,但也不存在非主性对码的部分函数依赖,所以上都符合第二范式;药品信息、药品类别索引、客户信息、供应商信息四个关系模式中都不存在非主属性对码的传递函数依赖,都属于第三范式。
在员工信息关系模式中,员工是按照权限分类的,职位不同权限也不同,这样该关系模式就存在了非主属性对码的传递依赖:职工号->职位,职位->权限,所以就将用员工信息分解为如下现个模式:
①员工信息(员工号,姓名,用户名,用户口令,职位) ②职位权限信息(职位,权限) 本系统不考虑职工信息的管理,为了使销售员编号与销售员的职工号连系起来,并能通过职工姓名和职位来修改用户信息所以把员工的部分信息(职工号,姓名,职位)和经理(用户名,密码)合成了员工信息(员工号,姓名,用户名,密码,职位,权限)以便系统功能的实现,所以在此不采用模式分解。
药品销售信息中有大量的数据冗余,表达不明确,将其分解为如下两个模式: ①药品销售主表(销售编码,销售日期,销售员编号,总金额)
②药品销售子表(销售编码,销售日期,药品编码,药品名称,单价,数量,供应商)
5数据库实现
5.1 创建数据库表
药品信息(药品编号,药品名称,药品类别代号,售价,进价,库存量,供应商,有效期) 外码:药品类别代号、 供应商
药品分类索引信息(药品类别代号,类别说明)
员工信息(员工号,姓名,用户名,密码,职位,权限)
客户信息(客户号,客户名称,联系人,联系方式,客户所在城市)
供应商信息(供应商号,供应商名称,联系人,联系方式,供应商所在城市)
药品销售信息(销售编码,销售日期,药品编码,药品名称,单价,数量,供应商,总额,销售员编码) 外码:销售员编码、药品编码
5.2 创建视图
由供应商信息表“FirmInfor”建立一个视图,该视图由供应商信息表的所有列构成*/ create view 供应商信息(供应商编码,供应商名称,联系人,联系电话,所在城市)
select* from FirmInfor
5.3 创建存储过程与触发器
建立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 建立DELETE触发器
create trigger delete_MedID on MedID for delete as
select* from MedID
declare @MedKindeCode char(10)
select @MedKindeCode=MedKindeCode from deleted delete from MedID
where MedKindeCode=@MedKindeCode select*from MedID 建立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
6 测试
7 课程设计总结
本次课程设计调查从事医药产品的零售、批发等工作的企业,根据其具体情况,设计医药销售管理系统。加深了对数据库课程知识的理解。由于时间仓促,软件还有很多不足之处,如:药品信息查询部分不够完善,软件代码交冗余、效率不高等等,都相关功能缺乏认识造成的。在今后的学习中我们会加强理论的实践的结合,通过不断摸索来弥补自己在软件制作方面的差距。
参考文献:[1] 苗雪兰,刘瑞新,宋歌.数据库系统原理及应用教程[M].北京.机械工
业出版社.2010
[2] 萨师煊,王 珊.数据库系统概论[M].北京:高等教育出版社.1997 [3] 刘真原.SQL SERVER2000培训教程[M].北京:清华大学出版社.2003
[4] 李清国.Windows 2000+ ASP SQL Server案例教程[M].上海: 中科多媒体电子出版社.2001
[5] 李晓黎.ASP+SQLSERVER网络应用系统开发指南[M].北京.人民邮电出版社.2004
附录: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
@MedKindeCode char(10),@KindExplanation varchar(12) as insert into MedID (MedKindeCode,KindExplanation) values(@MedKindeCode ,@KindExplanation )
exec MedID_proc '0001','口腔溃疡' exec MedID_proc '0002','感冒' exec MedID_proc '0003','发烧' exec MedID_proc '0004','拉肚子' exec MedID_proc '0005' ,'外伤'
create proc MedInfor_proc
@MedicineCode char(6),@MedicineName varchar(8),@MedKindeCode char(10),@Price money,@ListPrice money,
@Number int,@FirmCode char(10),@Userfulllife Datetime as
insert into MedInfor(MedicineCode ,MedicineName,MedKindeCode,Price,ListPrice, Number,Supplicer,Userfulllife)
values(@MedicineCode,@MedicineName,@MedKindeCode,@Price,@ListPrice, @Number,@FirmCode,@Userfulllife)
exec MedInfor_proc '1001','板蓝根','0002',5,3,'100','014','2010-12-5'
exec MedInfor_proc '2002','四季感康','0002',14,10.5,'150','051','2010-12-12' exec MedInfor_proc '2003','银黄颗粒','0002',12,8.8, '120 ','014','2012-10-6'
exec MedInfor_proc '2004','感冒清热软胶囊','0002',17,12, '150','015', '2011-11-1' exec MedInfor_proc '3001','阿斯匹林','0003',15,11,'100','014','2010-12-1' exec MedInfor_proc '3002','布洛芬','0003',21,17.5,'120','051','2010-6-5' exec MedInfor_proc '4001','泻利挺','0004',25,20,'120','015','2012-10-2'
exec MedInfor_proc '4002','诺氟沙星胶囊','0004',15,12,'100','015','2012-9-16' exec MedInfor_proc '5001','碘酒','0005',5,2.5,'50' ,'051','2012-10-12' exec MedInfor_proc '5002','创口贴','0005',2,1,'250','014','2015-5-1'
create proc GueInfor_proc
@GuestCode char(10),@GuestName varchar(16),@GLink varchar(12),@GLinkTell varchar(11), @City varchar(8) as
insert into GueInfor(GuestCode,GuestName,GLink,GLinkTell,
City) values(@GuestCode,@GuestName,@GLink,@GLinkTell,@City)
exec GueInfor_proc '015112','zhangsan','xiaozhang','668401','jiaxing' exec GueInfor_proc '065114','lisi','xiaofang','614425','yuyao'
exec GueInfor_proc '052114','wangwu','xiaowu','659024','wenzhou' exec GueInfor_proc '043115','zhaoliu','xiaowu','615874','shangyu' exec GueInfor_proc '014221','awu','xiaozhang','651283','linan' exec GueInfor_proc '025471','asha','xiaofang','691472','dongyang'
create proc FirmInfor_proc
@FirmCode char(10),@FirmName varchar(16),@Link varchar(12),@LinkTell varchar(11),@City varchar(8) as
insert into FirmInfor(FirmCode,FirmName,Link,LinkTell,City) values(@FirmCode,@FirmName,@Link,@LinkTell,@City)
exec FirmInfor_proc '015','yangshengtang','xiaotai','681472','huzhou' exec FirmInfor_proc '014','baozhilin','zhangqing','658421','deqing'
exec FirmInfor_proc '051','pinmingdayaofang','oudan','65417','xiangshan'
create proc WorkInfor_proc @WorkNo char(10),@Name varchar(12),@UserRegName char(6),@Password char(10),@Position char(10),@Power Int as
insert into WorkInfor(WorkNo,Name,UserRegName,Password,Position,Power) values(@WorkNo,@Name,@UserRegName,@Password,@Position,@Power)
exec WorkInfor_proc '075101','ZKL','zkl01','456789','jingli','' exec WorkInfor_proc '075201','ZJM','zjm01','123789','dongshi','' exec WorkInfor_proc '075215','WMX','wmx05','147258','xiaomi','' exec WorkInfor_proc '075120','ZZW','zzm20','123456','buzhang',''
create proc sellMain_proc
@SaleNo int,@WorkNo char(10),@SaleDate DateTime,@Amount Money as
insert into sellMain(SaleNo,WorkNo,SaleDate,Amount) values(@SaleNo,@WorkNo,@SaleDate,@Amount)