住院管理系统实验报告(1)
住院管理系统实验报告
1. 实验目的:
数据库课程设计的主要目标是:
(1)加深对数据库系统、软件工程、程序设计语言的理论知识的理解和应用水平。
(2)通过设计实际的数据库系统应用课题,进一步熟悉数据库管理系统的操作技术,提高动手能力,提高分析问题和解决问题的能力。
2. 实验简述
为医院所属各部门提供病人信息和病房信息的收集、存储、处理、提取和数据交换的能力,并满足所有授权用户的功能需求。作为其中的模块之一:住院管理系统,其意义同样不可忽视。
住院管理系统主要用来管理病人和病房的关系
其中包括在住病人的基本信息,病房的基本信息。 此系统可以让医院增加删除病房, 还可以登记和出院病人
操作员可以根据系统内设定好的费用,在病人出院的同时准确计算出病人在住院期间内的住院费用。
3.课程设计全过程
(1)可行性分析 (2)系统分析 (3)需求分析 (4)数据库设计
概念(模型) 设计 (实际到概念) 逻辑设计 (逻辑推导) 物理设计 (理论到实现)
SQL 编程、调试 (测试验证) (实践反复检验)
(5)应用程序编程、调试、测试
可行性分析
1 技术可行性
硬件、软件要求不高,目前市场上的一般计算机软硬件资源均能满足系统开发需要。该管理系统以VB 和SQL Server 为主要开发工具,通过ADO 方式与后台数据库Microsoft SQL Server 2000 相连接,建立了一个基于C/S(客户机/服务器)的数据库应用管理系统。维护工作方便,由于SQL2000的易用性,使得后台的操作十分便捷,操作人员可以在短时间内完全掌握系统的维护工作。 2 经济可行性
对于每个住院部门,可以根据自己需要,配置性能一般的计算机做为终端,向服务器存储数据或搜索数据。这些电脑的费用对整个住院系统来说并不是一个很重点负担。 3 社会可行性
由于医院住院病人数量众多,因而通过电脑化操作可以减少纸张的使用,同时由于数据直接通过局域网传输,可以减少信息传递时间,提高效率,同时也方便医生,病人搜查相关住院信息,提高医院工作透明度和工作效率。
系统分析
注重系统的易用性
本系统设计过程中力求人性化,结合强大的搜索功能帮助医生、护士、病人随时查找到所需的信息,同时在数据录入过程中,尽可能减少人工输入部分,降低人工输入错误的可能性。 注重系统的可移植性
由于医院整体系统庞大复杂,可以根据需要实际取系统中的部分功能。同时由于数据库采用微软的SQL2000,可以很方便地备数据,转移数据。 系统的名称、目标
名称:医院住院管理系统
目标:(1) 方便医院对病人和病房的管理 (2) 方便医院管理病人的住院费用
需求分析
总体功能操作流程
1. 操作员
操作员的操作流程图
操作员可以登录/查询病人、查看病房的状态和信息、给要出院的病人登
记出院、查询已经出院的病人的信息。
2. 管理人员
管理人员登录系统流程
管理人员除了具有操作员的功能以外,还可以对病房进行管理、对操作员----
用户进行管理、备份/恢复现在的数据库、更改管理员的密码!
3. 病人
病人登记住院
概念模型设计
数据库要表示的信息如下:
1. 管理员的信息。 2. 病人的信息。 3. 病房的信息
4. 病人和病房之间的联系
5. 总体联系图
逻辑设计
管理员/操作员→ (name,psw,权限)
病人信息 →(编号, 患者姓名, 性别,出生日期,证件类型,证件号码,血型,RH 因子,过敏史, 病房类型,病房号,主治医师,住院时间,定金,登记员,备注)
出院病人信息→(编号, 患者姓名, 性别,出生日期,证件类型,证件号码,血型,RH 因子,过敏史, 病房类型,病房号,主治医师,住院时间,定金,登记员,备注, 出院时间)
病房类型/价格→(病房类型,病房价格)
病房表→(病房号,病房类型,在住状态,flag )
物理结构设计
用SQL 实现设计
实现该设计的环境为Windows xp Perfessinal+MSSQLServer 2000.0
1.建立病房类型/价格表
CREATE TABLE [dbo].[bflx] ( [病房类型] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL , [病房价格] [int] NULL
) ON [PRIMARY]
2.建立病房表
CREATE TABLE [dbo].[bfno] ( [病房号] [varchar] (5) COLLATE Chinese_PRC_CI_AS NULL , [病房类型] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL , [flag] [tinyint] NULL , [在住状态] [varchar] (6) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
4. 建立管理员/操作员信息表
CREATE TABLE [dbo].[psw] (
[name] [char] (20) COLLATE Chinese_PRC_CI_AS NULL , [psw] [char] (10) COLLATE Chinese_PRC_CI_AS NULL , [权限] [tinyint] NULL
) ON [PRIMARY]
5.建立病人信息表
CREATE TABLE [dbo].[sufferer] ( [编号] [varchar] (8) COLLATE Chinese_PRC_CI_AS NOT NULL , [患者姓名] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL , [性别] [varchar] (2) COLLATE Chinese_PRC_CI_AS NULL , [出生日期] [datetime] NULL , [证件类型] [varchar] (8) COLLATE Chinese_PRC_CI_AS NULL , [证件号码] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL , [血型] [varchar] (2) COLLATE Chinese_PRC_CI_AS NULL , [rh因子] [varchar] (5) COLLATE Chinese_PRC_CI_AS NULL , [过敏史] [varchar] (8) COLLATE Chinese_PRC_CI_AS NULL , [病房类型] [varchar] (8) COLLATE Chinese_PRC_CI_AS NULL , [病房号] [varchar] (5) COLLATE Chinese_PRC_CI_AS NULL , [主治医师] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL , [住院时间] [datetime] NULL , [登记员] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL , [备注] [text] COLLATE Chinese_PRC_CI_AS NULL , [压金] [int] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
6.建立出院病人信息表
CREATE TABLE [dbo].[出院病人] ( [编号] [varchar] (8) COLLATE Chinese_PRC_CI_AS NULL , [患者姓名] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL , [性别] [varchar] (2) COLLATE Chinese_PRC_CI_AS NULL , [出生日期] [datetime] NULL , [证件类型] [varchar] (8) COLLATE Chinese_PRC_CI_AS NULL , [证件号码] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL , [血型] [varchar] (2) COLLATE Chinese_PRC_CI_AS NULL ,
[RH因子] [varchar] (5) COLLATE Chinese_PRC_CI_AS NULL , [过敏史] [varchar] (5) COLLATE Chinese_PRC_CI_AS NULL , [病房类型] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL , [病房号] [varchar] (5) COLLATE Chinese_PRC_CI_AS NULL , [主治医师] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL , [住院时间] [datetime] NULL , [出院时间] [datetime] NULL , [登记员] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL , [备注] [text] COLLATE Chinese_PRC_CI_AS NULL , [住院费用] [int] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
7. 所有操作
1. 登录
rs.Open "select name,psw from psw where name= '" & Trim(Text1.Text) & "' and psw= '" & Trim(Text2.Text) & "'", cn, adOpenStatic, adLockReadOnly
2. 更改密码
rs.Open "select name,psw from psw where name= '" & cname & "' and psw= '" & Trim(Text1.Text) & "'", cn, adOpenStatic, adLockOptimistic
rs("psw") = Trim(Text2.Text)
3. 新增用户
rs.Open "select * from psw", cn, adOpenDynamic, adLockOptimistic
rs.AddNew
rs("name") = Trim(Text1.Text) rs("psw") = Trim(Text2.Text) rs.Update rs.Close
4. 删除用户
rs.Open "select name from psw", cn, adOpenStatic, adLockOptimistic
rs.delect
5. 更换用户
和登录用户一样操作!
6. 备份/恢复
备份和恢复住院管理系统的ZY 数据库 备份:
sql = "use master;restore database zy from disk= '" & a & "'" cn.Execute (sql) 恢复:
sql = "use master;restore database zy from disk= '" & a & "'" cn.Execute (sql)
7. 登记病人
登记成功把病人信息写到病人信息表中
rs.Open "select * from sufferer", cn, adOpenStatic, adLockOptimistic rs.AddNew
rs.Fields(0) = Trim(Text1.Text) rs.Fields(1) = Trim(Text2.Text) rs.Fields(2) = Trim(Combo1.Text) rs.Fields(3) = DTPicker1.Value rs.Fields(4) = Trim(Combo2.Text) rs.Fields(5) = Trim(Text5.Text) rs.Fields(6) = Trim(Combo3.Text) rs.Fields(7) = Trim(Combo4.Text) rs.Fields(8) = Trim(Text6.Text) rs.Fields(9) = Trim(Combo5.Text) rs.Fields(10) = Trim(Combo6.Text) rs.Fields(11) = Trim(Text8.Text) rs.Fields(12) = Trim(Text9.Text) rs.Fields(13) = Trim(Text10.Text) rs.Fields(14) = Trim(Text7.Text) rs.Fields(15) = Val(Text11.Text) rs.Update
8. 查询病人
包含精确查询和模糊查询 编号查询:
1. rs.Open "select * from sufferer where 编号='" & Trim(Text1.Text) & "'", cn,
adOpenStatic, adLockReadOnly
2. rs.Open "select * from sufferer where 编号 like'%" + Trim(Text1.Text) + "%' order
by 编号", cn, adOpenStatic, adLockReadOnly 资料查询:
1. rs.Open "select * from sufferer where 患者姓名='" & Trim(Text2.Text) & "' and
证件号码='" & Trim(Text3.Text) & "'", cn, adOpenStatic, adLockReadOnly 2. rs.Open "select * from sufferer where 证件号码 like'%" + Trim(Text3.Text) + "%'
order by 证件号码", cn, adOpenStatic, adLockReadOnly 病房查询:
1. rs.Open "select * from sufferer where 病房类型='" & Trim(Text5.Text) & "' and
病房号='" & Trim(Text6.Text) & "'", cn, adOpenStatic, adLockReadOnly
2. rs.Open "select * from sufferer where 病房类型 like'%" + Trim(Text5.Text) + "%'
order by 病房类型", cn, adOpenStatic, adLockReadOnly
9. 病房管理
包括增加/删除病房类型和增加/删除病房 增加: 类型增加:
rs.Open "select * from bflx ", cn, adOpenStatic, adLockOptimistic rs.AddNew
rs("病房类型") = Trim(Text1.Text) rs("病房价格") = Val(Text2.Text) rs.Update rs.Close 病房增加:
rs1.Open "select * from bfno", cn, adOpenStatic, adLockOptimistic rs1.AddNew
rs1("病房类型") = Trim(DataCombo2.Text) rs1("病房号") = Trim(Text3.Text) rs1("在住状态") = "空闲" rs1("flag") = 0 rs1.Update rs1.Close 删除:
类型删除:
rs1.Open "select * from bflx where 病房类型='" & Trim(Text1.Text) & "'", cn, adOpenStatic, adLockOptimistic rs1.Delete 病房删除:
rs.Open "select * from bfno where 病房类型='" & Trim(DataCombo2.Text) & "' and 病房号= '" & Trim(Text3.Text) & "'", cn, adOpenStatic, adLockOptimistic
10. 登记出院
登记出院时把病人的信息增加到出院病人表中
rs.Open "select * from 出院病人", cn, adOpenStatic, adLockOptimistic
rs1.Open "select * from sufferer where 编号='" & Trim(Text1.Text) & "'", cn, adOpenStatic, adLockOptimistic rs.AddNew
rs.Fields("编号") = Trim(rs1.Fields("编号"))
rs.Fields("患者姓名") = Trim(rs1.Fields("患者姓名")) rs.Fields("性别") = Trim(rs1.Fields("性别")) rs.Fields("出生日期") = rs1.Fields("出生日期") rs.Fields("证件类型") = Trim(rs1.Fields("证件类型"))
rs.Fields("证件号码") = Trim(rs1.Fields("证件号码"))
rs.Fields("血型") = Trim(rs1.Fields("血型"))
rs.Fields("RH因子") = Trim(rs1.Fields("rh因子"))
rs.Fields("过敏史") = Trim(rs1.Fields("过敏史"))
rs.Fields("病房类型") = Trim(rs1.Fields("病房类型"))
rs.Fields("病房号") = Trim(rs1.Fields("病房号"))
rs.Fields("主治医师") = Trim(rs1.Fields("主治医师"))
rs.Fields("住院时间") = Trim(rs1.Fields("住院时间"))
rs.Fields("出院时间") = Trim(Text5.Text)
rs.Fields("登记员") = Trim(rs1.Fields("登记员"))
rs.Fields("备注") = Trim(rs1.Fields("备注"))
rs.Fields("住院费用") = Val(Text6.Text)
rs.Update
rs.Close
rs1.Delete
rs1.Update
rs1.Close
11. 出院病人查询
rs.Open "select * from 出院病人 where 患者姓名 like'%" + Trim(Text1.Text) + "%'",
cn, adOpenStatic, adLockReadOnly
根据出院病人的编号查询
测试阶段
1. 用户管理部分
新增加用户, 删除用户, 更换用户, 更改密码! 在删除用户的时候超级管理员用户不能删除, 而且普通操作员登录后不能删除用户, 在删除管理员的时候要用户提了确认信息才能删除, 以免用户的误操作! 在调试用户管理部分时候以上问题都要注意。
2. 病人登记/查找部分
在病人登记的时候要能够自动显示当前的操作员,并写入到数据库当中。登记日期也是由系统自动生成。查询病人的同时有精确查询和模糊查询,这样更加增加了系统的灵活性,在调试时候也要用大量的数据来试。如数据库中定义了姓名不能超过10个字符,调试时候超过10个就报
错
所以必须定义text 的maxlength 为一个固定的长度,以防止用户输入错误的信息而引起的错误。后来的地方对这方面也加以注意.
3. 登记出院/查询出院病人部分
这部分调试的难点在与能够自动生成病人在住院期间的费用,要用到DateDiff 来实现时间的相减。同时登记出院成功后要正确的把病人的信息加载到出院病人表里面。以便下面的查询!而查询出院病人则通过病人惟一的编号查询。增强了准备性!
4. 备份/恢复部分
这部分是调试阶段花的时间最多的,也是从书上看到可以通过执行SQL 命令来备份和恢复数据库,调试的同时先备份然后改变数据再恢复看能不能成功。花了好多精力才调试成功。这样有力的增强了系统的数据可靠性。可以及时备份数据。
总结与致谢
在本次的课程设计中主要是VB 和相关知识和数据库的知识相结合,而VB 和数据库又是通过ADO(工程→部件→Microsoft ADO date control 6.0(sp6))来进行连接,我的课程设计中用的是连接串(connection="Provider=SQLOLEDB.1;IntegratedSecurity=SSPI;Persist Security Info=False;Initial Catalog=zy;Data Source=(local)")与数据库相连,用rs.Fields()来更新、修改、增加、记录集。用rs.delect 来删除记录集。尤其重要记录集打开了一定要在下次用到的时候前关闭记录集,不然
开始做的时候也有好多困难,比如:在比较的同时数据库中存在空格必须加上trim 语句,数据库的增加必须要有rs.addnew 和rs.update 。模糊查询要用like 来比较。在定义数据库的类型的时候也要很好的虑,以便后面的操作更加容易,增加到数据库中的数据的类型必须和数据库中预先定义的类型相同。日期型的用来一个DTPICKER 控件(工程→部件→Microsoft Windows common controls-2 6.0(sp4)),在出院的同时计算病人的住院天数开始也考虑了好处后来在老师的帮助下才知道时间型的变量可以直接进行相减。
但是有的时候有些错误是SQL SERVER 2000本身的问题,重新建立数据库后问题就解决了。
做完课程设计后对数据库的知识有了更进一步的理解,在此也感谢老师的教导和同学的帮助,才能使我顺利完成课程设计
参考文献
1. 《Visual basic 6.0 数据库开发学习教程》 北京大学出版社
2. 《Visual basic 程序设计与系统应用》 电子工业出版社
3. 《Visual basic 数据库系统与开发》 清华大学出版社
4. 《Visual Basic数据库高级实例导航》 科技出版社
5. 《Visual Basic 高级编程及其项目应用开发》中国水利水电出版社