医院住院管理系统
1、系统
1.1系统设计目的及意义
医院住院管理系统是每一个医疗机构管理病人及医师收入和支出的不可缺少的一个管理信息系统,它的1
对病人的信息进行及时的更新和统计;
对医生信息进行及时的更新和统计,并根据统计数字得出相关的其他数据,
如根据医生的出诊情况等;
对各种库存信息的及时更新和统计以及相关的自动处理,系统应根据存量,
入库量,出库量,自动得出新的即时的库存量,完成更新。
) 安全性与完整性要求: (三
系统应设置访问用户的标识以鉴别是否为合法用户,并要求合法用户设置密码,保证用户身份不被盗用;
系统应对不同的数据设置不同的访问级别,限制访问用户可查询和处理数
据的类别和内容。
(四) 完整性要求:
各种信息
的完整性,信息记录不能为空;
各种数据之间相互联系的正确性;
相同的数据在不同表中的一致性。
1.3系统功能分析
系统开发的总体任务是实现医院住院管理的系统化、规范化、和自动化。实现企业高效、科学、现代化的员工管理。考勤信息管理系统的主要功能如下: 对医院基本信息进行浏览。如病人、医生、药品等的基本信息的浏览; 医生就知及其离职处理。对新的医生的加入需进行添加和离职医生的删除处理功能;
病人入院、出院的管理以及病人的用药情况记录;
完成一些简单的基本统计功能。如医生总人数、病人的住院时间、药品的种类等。
1.4系统功能模块设计
本系统中模块共分为两块,分别为数据库模块、系统功能模块。
数据库模块指的是对数据库的建立,同时建立医生基本信息表、病人基本信息表、医生诊断病人信息表、药品基本信息表以及病人用药信息表、用户表。用户表所实现的功能主要有用户登陆、注册新用户、密码修改。基本信息表所实现的功能 2
主要是员工信息的添加和对员工基本信息的修改、删除等。查询模块是指在建表的基础上,用户根据所需的信息进行查询对所需要的资料,包括单一条件查询和多条件查询。另外还增设了统计功能,对病人的统计主要用于对病人的住院天数和住院病人总数;对医生的统计体现于对医生人数的统计和不同职称人数的统计;对药品的统计则是种类的统计。
系统功能模块划分如图1所示:
图1 系统功能模块
1.5与其他系统的关系
就大局而言,住院管理系统只是为医院管系统的一个子系统。所以,住院管理系统与后勤管理子系统,行政管理子系统有着密切的联系。其关系图如图2所示:
图
2
3
1.6数据流程图
系统的数据流程图如图3所示:
2.1数据库需求分析
计算机的发展速度是惊人的,其运用的领域已经涉及各个方面。对于医院来说,利用计算机支持企业高效率完成医院管理的日常事务,如医生信息的管理、病人的添加、药品的管理等。是适应现代医院住院
要求、推动医院由劳动型管理转向科学化、规范化的必要条件;而医院管理是一项繁琐、复杂而又十分细致的工作,医院人员对病人的入院、出院、服药等
的记录,这些记录是不允许出错,如果出错则会严重损害病人的身体健康甚至造成生命危险。如果实行手工操作,须手工填制大量的表格,这就会耗费工作人员大量的时间和精力,计算机进行医院的管理,不仅能够保证各项信息准确无误、快速输出,同时计算机具有手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密
图3 数据流程图 2 、数据库设计 4
性好、寿命长、成本低等。这些优点能够极大地提高医院管理的效率,也是医院管理走向科学化、正规化管理,与世界接轨的重要条件。根据数据流程,可以列出以下管理系统所需的数据项和数据结构:
医生信息:医生号、姓名、性别、年龄、家庭住址、电话、职称
病人信息:病人号、姓名、年龄、性别、住址、入院时间、出院时间 药品信息:药品编号、药品名称、生产日期、保质期
诊断记录:病人号、医生号、诊断结果
用药记录:病人号、药品编号
用户信息:用户名、密码
2.2数据库概念结构设计
医院住院管理系统的E-R模型图如图4所示:
图4 E-R模型图
2.3数据库逻辑结构设计
根据系统的E-R图,总共需要6个数据支持。其中医生信息、病人信息、药品信息和用户信息可以使用已有的数据表。这6个数据表的结构如表1到表6所示。
5
表1 医生基本信息表
表2 病人基本信息表
表3 药品基本信息表
表4 病人用药信息表
6
表5 医生诊断信息表
表6 用户信息表
3、数据库结构的实现
3.1创建数据库
医院住院管理系统数据库的建立,采用的是PowerDesigner 12,首先对数据库的实体进行确立并输入其相应的属性名以及确定数据类型。然后生成建立数据库的代码,最后在Mcrosoft SQL Server 2000中利用查询分析器生成名为“医院住院管理”数据库。 源代码如下:
if exists (select 1
from dbo.sysreferences r join dbo.sysobjects o on (o.id = r.constid and o.type = „F?)
where r.fkeyid = object_id(„医生诊断病人?) and o.name = „FK_医生诊断病人_医生诊断病人_医生基本信息?) alter table 医生诊断病人
drop constraint FK_医生诊断病人_医生诊断病人_医生基本信息 go
if exists (select 1
from dbo.sysreferences r join dbo.sysobjects o on (o.id = r.constid and o.type = „F?)
where r.fkeyid = object_id(„医生诊断病人?) and o.name = „FK_医生诊断病人_医生诊断病人
2_病人基本信息?) alter table 医生诊断病人
drop constraint FK_医生诊断病人_医生诊断病人2_病人基本信息 go
7
if exists (select 1
from dbo.sysreferences r join dbo.sysobjects o on (o.id = r.constid and o.type = „F?)
where r.fkeyid = object_id(„病人用药?) and o.name = „FK_病人用药_ASSOCIATI_病人基本
信息?)
alter table 病人用药
drop constraint FK_病人用药_ASSOCIATI_病人基本信息
go
if exists (select 1
from dbo.sysreferences r join dbo.sysobjects o on (o.id = r.constid and o.type = „F?)
where r.fkeyid = object_id(„病人用药?) and o.name = „FK_病人用药_ASSOCIATI_药品?) alter
table 病人用药
drop constraint FK_病人用药_ASSOCIATI_药品
go
if exists (select 1
from sysobjects
where id = object_id(„医生基本信息?)
and type = „U?)
drop table 医生基本信息
go
if exists (select 1
from sysindexes
where id = object_id(„医生诊断病人?)
and name = „医生诊断病人2_FK?
and indid > 0
and indid < 255)
drop index 医生诊断病人.医生诊断病人2_FK
go
if exists (select 1
from sysindexes
where id = object_id(„医生诊断病人?)
and name = „医生诊断病人_FK?
and indid > 0
and indid < 255)
8
drop index 医生诊断病人.医生诊断病人_FK go
if exists (select 1
from sysobjects
where id = object_id(„医生诊断病人?) and type = „U?)
drop table 医生诊断病人
go
if exists (select 1
from sysobjects
where id = object_id(„病人基本信息?) and type = „U?)
drop table 病人基本信息
go
if exists (select 1
from sysindexes
where id = object_id(„病人用药?) and name = „Association_3_FK?
and indid > 0
and indid < 255)
drop index 病人用药.Association_3_FK go
if exists (select 1
from sysindexes
where id = object_id(„病人用药?) and name = „Association_2_FK?
and indid > 0
and indid < 255)
drop index 病人用药.Association_2_FK go
if exists (select 1
from sysobjects
9
where id = object_id(„病人用药?)
and type = „U?)
drop table 病人用药
go
if exists (select 1
from sysobjects
where id = object_id(„药品?)
and type = „U?)
drop table 药品
go
/*==============================================================*/ /* Table: 医生基本信息 */ /*==============================================================*/ create table 医生基本信息 (
医师号 char(15) not null,
姓名 char(10) null,
性别 char(2) null,
年龄 int null,
家庭住址 char(40) null,
电话 char(20) null,
职称 char(10) null,
constraint PK_医生基本信息 primary key nonclustered (医师号)
)
go
/*==============================================================*/ /* Table: 医生诊断病人 */ /*==============================================================*/ create table 医生诊断病人 (
医师号 char(15) not null,
病人号 char(20) not null,
诊断结果 char(20) null,
constraint PK_医生诊断病人 primary key (医师号, 病人号)
)
10
go
/*==============================================================*/ /* Index: 医生诊断病人_FK */ /*==============================================================*/ create index 医生诊断病人_FK on 医生诊断病人 (
医师号 ASC
)
go
/*==============================================================*/ /* Index: 医生诊断病人2_FK */ /*==============================================================*/ create index 医生诊断病人2_FK on 医生诊断病人 (
病人号 ASC
)
go
/*==============================================================*/ /* Table: 病人基本信息 */ /*==============================================================*/ create table 病人基本信息 (
病人号 char(20) not null,
姓名 char(10) null,
年龄 int null,
性别 char(2) null,
住址 char(40) null,
电话 char(20) null,
入院时间 datetime null,
出院时间 datetime null,
constraint PK_病人基本信息 primary key nonclustered (病人号)
)
go
/*==============================================================*/ /* Table: 病人用药 */
11
/*==============================================================*/ create table 病人用药 (
病人号 char(20) not null,
药品编号 char(20) not null,
constraint PK_病人用药 primary key (病人号, 药品编号)
)
go
/*==============================================================*/ /* Index: Association_2_FK */
/*==============================================================*/ create index Association_2_FK on 病人用药 (
病人号 ASC
)
go
/*==============================================================*/ /* Index: Association_3_FK */
/*==============================================================*/ create index Association_3_FK on 病人用药 (
药品编号 ASC
)
go
/*==============================================================*/ /*
Table: 药品 */
/*==============================================================*/
create table 药品 (
药品编号 char(20) not null,
药品名称 char(20) null,
生产日期 datetime null,
保质期 int null,
constraint PK_药品 primary key nonclustered (药品编号)
)
go
12
alter table 医生诊断病人
add constraint FK_医生诊断病人_医生诊断病人_医生基本信息 foreign key (医师号) references 医生基本信息 (医师号)
go
alter table 医生诊断病人
add constraint FK_医生诊断病人_医生诊断病人2_病人基本信息 foreign key (病人号) references 病人基本信息 (病人号)
go
alter table 病人用药
add constraint FK_病人用药_ASSOCIATI_病人基本信息 foreign key (病人号) references 病人基本信息 (病人号)
go
alter table 病人用药
add constraint FK_病人用药_ASSOCIATI_药品 foreign key (药品编号)
references 药品 (药品编号)
go
3.2创建用户信息表
在3.1中创建的数据库中利用查询分析器建立系统的最终用户的信息表,代码如下:
CREATE TABLE 用户信息
(用户名 CHAR(10) NOT NULL,
密码 CHAR(10) NOT NULL);
4、功能模块的创建
本系统采用的是以VB做为前台而建立的,所以系统的功能模块由VB所完成的。各模块
的主要算法对应的源代码如下:
4.1数据模块的创建
数据模块用于后台数据库与前台VB界面的链接。相关代码如下所示: Public Mycon As
New ADODB.Connection
Public MyRs As New ADODB.Recordset
13
Public MyRs1 As New ADODB.Recordset
Public MyRs2 As New ADODB.Recordset
4.2登录窗口的建立
登陆窗口如图5所示:
图5
登陆界面的语句与数据库的连接有关联,其主要代码如下:
Private Sub Command1_Click()
If Text1.Text = "" Then
MsgBox "用户名不能为空~", vbInformation
Exit Sub
End If
If Text2.Text = "" Then
MsgBox "用户密码不能为空~", vbInformation
sql = "select * from 用户信息 where 用户名=„" & Trim(Text1.Text) &
"?"
Adodc1.RecordSource = sql
Adodc1.Refresh
Adodc1.Recordset.Find ("用户名=„" & Text1.Text & "?")
If Adodc1.Recordset.EOF = True Then
MsgBox "用户名不存在,请重新输入~", vbInformation
If Adodc1.Recordset.EOF = False Then „如果帐号存在
If Trim(Adodc1.Recordset.Fields("密码")) = Trim(Text2.Text) Then
frmMain.Show
Mycon.ConnectionString = "Driver={SQL Server};Server=PC-201005242055;Database=
医院住院管理"
Mycon.Open
Else „帐号密码错误
MsgBox "用户密码错误,请重新输入~", vbInformatio
End Sub
14
4.3主窗体的建立
用户登陆后,就会显示主窗体,如图6所示:
图6
其一些主要代码如下:
Private Sub mnuClientXG_Click()
frmModifykey.Show
End Sub
Private Sub mnuCompbin_Click()
frmTonji2.Show
End Sub
Private Sub mnuCompDays_Click()
frmTonji1.Show
End Sub
Private Sub mnuCompdoc_Click()
frmTonji3.Show
End Sub
Private Sub mnuDeletbin_Click()
frmDeletbin.Show
End Sub
4.4菜单中“浏览”项各个窗体的创建
菜单栏目中“浏览基本表”一共有5个字菜单,分别为“浏览医生基本信息”、“浏览病人基本信息”、“浏览药品信息”、“浏览诊断结果”、“浏览病人用药信息”下面图7、图8、图9为其中三个窗体:
15
图7医生基本信息表
图8病人基本信息表
图9药品基本信息
其实现一些主要代码如下:
Private Sub mnuScanyao_Click()
frmScan.Show
sql1 = "select * from 药品"
frmScan.Adodc1.RecordSource = sql1
frmScan.Adodc1.Refresh
Set frmScan.DataGrid1.DataSource = frmScan.Adodc1.Recordset End Sub
Private Sub mnuScanyi_Click()
16
frmScan.Show
sql1 = "select * from 医生基本信息"
frmScan.Adodc1.RecordSource = sql1
frmScan.Adodc1.Refresh
Set frmScan.DataGrid1.DataSource = frmScan.Adodc1.Recordset
End Sub
4.5菜单中“查询”项各个窗体的创建
查询菜单中包括3个子菜单,即“查询医生信息”、“查询病人信息”、“查询药信息”。其各个窗体如图10、图11、图12所示:
图10查询医生信息
图11查询病人信息
图12查询药品信息
17
实现查询医生信息的主要代码如下:
Dim sql1 As String
Private Sub Command1_Click()
If Text1.Text = "" And Text2.Text = "" Then „工号,姓名都为空
MsgBox "请输入医师号或者姓名", vbExclamation, "查询错误"
Exit Sub
End If
If Text1.Text <> "" And Text2.Text = "" Then „只填了工号
sql1 = "select 医师号,姓名,性别,年龄,家庭住址,电话,职称 from 医生基本信息 where 医师号=„" & Text1.Text & "?"
End If
If Text1.Text = "" And Text2.Text <> "" Then „只填了姓名
sql1 = "select 医师号,姓名,性别,年龄,家庭住址,电话,职称 from 医生基本信息 where 姓名=„" & Text2.Text & "?"
End If
If Text1.Text <> "" And Text2.Text <> "" Then „只填了工号&姓名
sql1 = "select 医师号, 姓名,性别,年龄,家庭住址,电话,职称 from 医生基本信息 where 医师号=„" & Text1.Text & "?and 姓名=„" & Text2.Text
& "?"
End If
Adodc1.RecordSource = sql1
Adodc1.Refresh
If Adodc1.Recordset.EOF = True Then
MsgBox "没有您要找的医生信息", vbInformation
Exit Sub
Else
frmYishen.Show 0
frmYishen.Text1.Text = Adodc1.Recordset.Fields("医师号")
frmYishen.Text3.Text = Adodc1.Recordset.Fields("姓名")
frmYishen.Text2.Text = Adodc1.Recordset.Fields("性别")
frmYishen.Text4.Text = Adodc1.Recordset.Fields("年龄")
frmYishen.Text5.Text = Adodc1.Recordset.Fields("职称")
frmYishen.Text6.Text = Adodc1.Recordset.Fields("电话")
frmYishen.Text7.Text = Adodc1.Recordset.Fields("家庭住址")
End If
End Sub
18
4.6菜单中“统计”项各个窗体的创建
统计菜单中包括3个子菜单,即“统计病人住院时间”、“统计病人总人数”、“统计医生人数”。其各个窗体如图13、图14、图15所示:
图13统计病人住院时间
图14统计总病人数
图15统计医生总人数
完成统计病人住院时间的代码如下:
Dim sql1 As String
Private Sub Command1_Click()
If Text1.Text = "" Then
MsgBox "请输病人号", vbInformation
Exit Sub
End If
If Text1.Text <> "" Then
19
sql1 = "select 姓名,性别,入院时间,出院时间,cast(出院时间-入院时间 as int) as 住院时间 from 病人基本信息 where 病人号=„" & Text1.Text & "?"
End If
Adodc1.RecordSource = sql1
Adodc1.Refresh
If Adodc1.Recordset.EOF = True Then
MsgBox "没有您要找的病人号", vbInformation
frmMbinzhu.Show 0
frmMbinzhu.Text1.Text = Adodc1.Recordset.Fields("姓名")
frmMbinzhu.Text3.Text = Adodc1.Recordset.Fields("入院时间")
frmMbinzhu.Text2.Text = Adodc1.Recordset.Fields("性别")
frmMbinzhu.Text5.Text = Adodc1.Recordset.Fields("出院时间")
frmMbinzhu.Text4.Text = Adodc1.Recordset.Fields("住院时间")
End Sub
4.7菜单中“添加”项各个窗体的创建
添加菜单中包括3个子菜单,即“添加病人信息”、“添加医生信息”、“添加药品信息”。其各个窗体如图16、图17、图18所示:
图16添加医生信息
图17添加病人信息
20
图18添加药品信息
实现添加药品的代码如下:
Private Sub Command1_Click()
If Trim$(Text1.Text) = "" Then
MsgBox "请输入药品编号~", vbInformation
Text1.SetFocus
Exit Sub
End If
Adodc1.Refresh
Adodc1.Recordset.Find ("药品编号=„" & Text1.Text & "?")
If Not Adodc1.Recordset.EOF Then
MsgBox "药品编号重复,请重新输入~", vbInformation
Exit Sub
End If
If Not IsDate(Text4.Text) Then
MsgBox "生产日期应按日期
(yyyy-mm-dd)输入~", vbInformation Exit Sub
Else
Text4.Text = Format(Text4.Text, "yyyy-mm-dd")
With Adodc1.Recordset
.AddNew
.Fields("药品编号") = Trim$(Text1.Text)
.Fields("药品名称") = Trim$(Text2.Text)
.Fields("保质期") = Trim$(Text3.Text)
.Fields("生产日期") = Trim$(Text4.Text)
.Update
End With
MsgBox "药品信息已添加成功~", vbInformation
End Sub
21
4.8菜单中“删除”项各个窗体的创建
删除菜单中包括3个子菜单,即“删除病人信息”、“删除医生信息”、“删除药品信息”。其各个窗体如图19、图20、图21所示:
图19删除医生信息
图20删除病人信息
图21删除药品信息
实现药品删除的代码如下:
Private Sub Command1_Click()
If Text1.Text = "" Then
MsgBox "请输入药品编号", vbInformation
sql1 = "delete 病人用药 where 药品编号 like „" & Text1.Text &
"?"
Mycon.BeginTrans „ 开始事务
Mycon.Execute (sql1) „ 执行添加
Mycon.CommitTrans „ 提交事务
sql2 = "delete 药品 where 药品编号 like „" & Text1.Text &
"?"
Mycon.BeginTrans „ 开始事务
Mycon.Execute (sql2) „ 执行添加
Mycon.CommitTrans „ 提交事务
MsgBox "删除药品信息成功" „ 显示添加操作完成的提示消息
End Sub
22
4.9菜单中“修改”项各个窗体的创建
删除菜单中包括3个子菜单,即“修改病人信息”、“修改医生信息”、“修改药品信”。其各个窗体如图22、图23、图24所示:
图22修改医生信息
图23修改病人信息
图24修改药品信息
实现修改医生信息的主要代码如下:
Private Sub mnuUpdatedoc_Click()
frmModify.Show
sql1 = "select * from 医生基本信息"
frmModify.Adodc1.RecordSource = sql1
frmModify.Adodc1.Refresh
Set frmModify.DataGrid1.DataSource = frmModify.Adodc1.Recordset
End Sub
23
4.10菜单中“用户管理”项各个窗体的创建
用户管理菜单中包括2个子菜单,即“添加用户信息”、“修改用户密码”。其各个窗体如图25、图26所示:
图25添加用户信息
图26修改用户密码
实现过户密码的主要代码如下:
Private Sub Command1_Click()
If Text3.Text = "" Then
MsgBox "请输入新用户密码~", vbInformation
If Text4.Text = "" Then
MsgBox "请确认新用户密码~", vbInformation
If Trim$(Text3.Text) <> Trim$(Text4.Text) Then
MsgBox "确认密码错误,请重新输入~", vbInformation
With Adodc1
.RecordSource = "select * from 用户信息 where 用户名=„" & Text1.Text
& "?"
.Refresh
.Recordset("密码") = Text3.Text
.Recordset.Update
End With
MsgBox "用户密码修改成功~", vbInformation
End Sub
24
5、课程设计小结
首先要感谢老师,如果没有她的耐心指导,我就连数据库是什么都不可能懂。通过这次的课程设计,让我首次编写连接数据库的程序,大约地了解程序设计是怎样一回事,并总结到一些经验,也使老师的教导化成了成果。虽然这一个星期需要不断查资料,然后对着电脑,把一个一个郁闷得问题解决,那过程真的是苦不堪言。但当自己把所学的东西化成成品以后,也便忘了那黑暗的一个星期了。记得有人说过:“学习过程的彷徨犹豫、挫折困顿、在日积月累的渐悟或剎那之间的顿悟之后,彷佛都成了遥远模糊的回忆。”似乎又一次的感受到这种喜悦。
在进行需求分析、建立E-R图和建立数据模型,我跟同学进行了探讨,一次一次的修正,终于确定好了数据模型。一个良好的数据模型,给以后的编写程序带来了很大方便。在编写代码的过程中,学会了怎么连接数据库,而且对其进行操作,真的是获益匪浅。相信这次的经验,对我日后工作会有相当大的帮助。
但是,在程序设计过程中遇到的主要问题是如何将数据库数据和vb连接起来,设置外码与被参照关系中主码的及联关系以及如何高效地实现查询功能。同时由于在数据库基本资料表中添加了照片属性,但由于能力有限,至今仍不懂往数据库表中插入图片的
。另外一个方面的问题就是界面不够漂亮,显得有点死板。不管怎么样以后我会好好学习,用知识去充实自我,相信以后我会讲一个系统做的更加完美。
5、参考文献
,1, 罗云模,王珊著 SQL Server 数据库系统基础. 高等教育出版社 ,2, 求是科技 著 Visual Basic程序设计与开发 人民邮电出版社 ,3, 王珊,萨师煊著 数据库系统概论 高等教育出版社 ,4, 易纲,刘少华著 新编VB程序设计教程 国防科技大学出版社 25