病历管理系统是医院管理系统的重要组成,该系统的开发主要包括后台数据库的建立以及前台应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的数据库,而对于后者则要求具有齐全完善的应用程序功能,友好人性化的操作界面。该系统采用现代的办公自动化理念,面向中小型医院,实现无纸化办公,确保医疗单位在病历保管实现高效办公,规范管理。
本文主要介绍了病理管理系统的设计开发与实现的全部过程。并运用功能结构图、数据库关系图和E-R图等对核心模块的设计过程进行了详细的说明。病历管理系统整体基于B/S(浏览器/服务器)模式,后台数据库选用SQL Server 2000,使用ASP嵌入HTML语言来设计实现。实现了病历在保管中的周期过程,完成了从患者的注册到患者的出院等一系列病历流程。简化了繁琐的手工操作,规范化整个病历处理流程,使得病历的流转更方便快捷。
近几年,随着医院的规模不断扩大,用原来的只靠人管理病历的方法已不合时宜。目前我国医院的信息处理基本上还停留在手工方式,劳动强度大且工作效率低,医务人员和管理人员的大量时间都消耗在事务性工作上;病案、临床检验、病理检查等许多宝贵的数据资料的检索十分费事甚至难以实现;对这些资料深入的统计分析手工方式无法进行,不能充分为医学科研利用。
随着计算机应用日益广泛;各行各业对生产管理的自动化、信息化、系统化的要求也不断提高;因而,降低劳动强度、提高劳动效率也就必然促使了医院中电子病历的使用。
电子病历是一个很复杂的项目,国际上有很多国家都要建健康档案,就是想把病历电子化。美国在新奥尔良由于飓风影响导致了大致有50、60万人的医学档案,这些病历都是由纸质的,在社区的诊所或者区域的医院保存,这些人的医学档案丢失,包括当地的州政府认为这是一个巨大的事故。从这件事反过来认识到建立病历电子化的紧迫性和重要性,因为电子病历的存放、利用会更加安全。联邦政府也成立了建立电子病历的委员会,提出了三个基本的原则。第一,要分级保密,可能有些是及其保密的,有些可以为公众共享,这是关于安全私密性的原则。第二,更新的保真性,建立电子病历的静态环境以后会有些变化,包括临床诊断和治疗在这个电子病历应该有记录,至少应该知道是谁诊断的,是什么医生在什么场合下做的修改。 第三,必须具有相当方便容易让人访问,不能有一些政策的堡垒,只要是经过授权的,无论是职业的医师、有关方面需要访问的话应该能够得到这个病历。
电子病历将提高医院各项工作的效率和质量,促进医学科研、教学;减轻各类事务性工作的劳动强度,使他们腾出更多的精力和时间来服务于病人。电子病历与纸病历相比,最显著的优点就是对信息数据的共享和反复利用。病人看病不需要携带病历,只需提供自己的姓名、病历号或其他信息,医生通过计算机即可得到该病人所有信息。本系统以B/S(Browser/Server)模式作为基本结构,所有程序和数据库存放在服务器上,浏览器端只需安装操作系统和浏览器即可,系统由用户浏览器、Web 服务器二个层次组成,体现了其开发维护简单性的特点。
2系统开发环境与技术的分析
2.1系统需要解决的主要问题
该管理系统面向的主要对象是医院,所以系统管理方面,应该有添加不同等级的管理人员和医务人员并针对不同的用户设置不同的权限,密码管理员能添加医务人员并修改添加人员的密码,同时管理人员只能修改自己的密码。在病历管理页面中病历管理员可以查看所有医务人员的病历录入信息,但是不能修改其中的录入信息。普通医务人员可以通过管理员分配的用户名和密码登录系统,由于权限的设置他们可以看见管理设置栏目但是无法进行操作。医生录入的病历信息只能由自己所看见,并且可以修改,在列表中是无法看见其他医生所录入的病历信息,很好的保证了病人的隐私权利。
2.2系统运行环境
为了保证系统运行的效率和可靠性,系统服务器端应具有较高的软硬件配置,客户端的要求不是很高。此应用程序可广泛运行于国际互联网即英特网,也可适用于内部的局域网。其运行要求如下:
硬件环境:
CPU:Inter奔腾2.0GHZ以上
内存:256MB以上
硬盘:20G以上
软件环境:Windows 2000 Server SP4(含IIS 5.1),Microsoft SQL Server
客户端配置
硬件环境:
CPU:Inter赛扬2.0GHZ以上
内存:128MB以上
硬盘:1G以上
软件环境:Windows 2000/NT/XP/2003 ,IE6.0
2.3相关技术介绍
ASP:全称是Active server pages,是微软推出的应用与Web应用程序开发的技术 ,被描述为“一个服务器的脚本环境,在这里可以生成和运行动态的、交互的、高性能的Web服务应用程序”,他不是一种编程语言,也不是一种开发工具,而是一种强大的技术框架。
JavaScript:是一种嵌入在HTML文件中的脚本语言,它是基于对象和事件驱动的,能对诸如鼠标单击、表单输入、页面浏览等用户事件做出反应并进行处理。
SQL(Structured Query Language): 结构化查询语言,是关系数据库的标准语言,通过几个命令,就可以实现定义、查询、更新和控制功能。在ASP 中对后台数据库进行查询、添加、删除和更新等操作所采用的就是SQL 语言。数据查询基本命令是SELECT,SELECT 语句用于对数据库进行查询并返回符合查询条件的数据。在查询语句中使用SQL库函数,可以实现在查询的过程中同时对某属性上的值进行统计分析。
在ASP中常用的就是表单数据的传输和接收,表单数据的传输有POST与GET两种方法,比较常用的是POST,例如常用表单头部为:
<FORM NAME="regform"METHOD="post" ACTION="addmanagerok.asp">
这里的method说明了传输数据的方法,当表单提交时可以用<%Request.form(“表单元素名”)%>或<%Request(“表单元素名”)%>来获取数据;若把传输ASP的方法改成GET,那只需要将method改成GET即可,这时除了用上面的两种方法接受数据时,<%Request.QueryString(“表单元素名”)%>也可以接受GET方法传输的数据。POST和GET两者最大的差异在于,POST方法的数据传输较为隐蔽,不会将传输传递的信息显示在浏览的网址后,而GET方法则会将传递的信息显示在浏览的网址后。
还较常用的有Session对象,该对象是建立WEB服务器同客户端的联系,并维持这一联系,其实是一个管理会话的对象,不仅可以保持管理会话,而且在此会话中可以为此次会话存储特定用户会话所需的属于自己的个性化信息,当用户在应用程序的Web页面跳转时,Session对象中的所有这些变量不会丢失直到会话过期或被放弃后,但是如果浏览器的Cookie被禁用,将不会发生作用。
3病历管理系统设计分析
3.1病历管理系统概述
病历管理系统主要完成患者的信息输入和病历的查看等相关操作,并实现医生对患者信息的快速查看。本设计主要完成了四个方面的内容,其作用如下:
1)系统管理。在本部分,根据管理员的权限的不同,不同的管理员可以执行不同的任务,病历管理员可以修改病例,而密码管理员只能修改用户的密码,并可以对其个人资料进行修改和操作,进行权限的设置,主要目的是为了是权利分散化。
2)患者个人信息管理。医生首先看到的是已存在的且是该医生诊断过的患者信息,并可以查看,也可以进行修改当天的患者信息但是不能删除。医生通过这样的方式确定在以前的诊断中有无该患者,当录入完成后该病人的信息则进入病人信息库以供医生对其进一步的诊断。
3) 患者病历管理。当患者的个人信息进库后,即可以进行此步的操作,由医生详细填入该病人的病情,并根据病人以前的病史作出自己的判断并保存在服务器数据库,在完成录入后,会自动跳往病历管理首页,并显现出已被自己诊断过的病人。同样,医生在此步骤中不具有删除权限。
3.1.1病历管理流程图
病历管理流程图如图3-1所示。
3.2数据库设计
E-R(Eneity-Relationship Approach)图是最常用的概念模型表示方法,也是数据库的核心和基础,它是按用户的观点来对数据和信息建模,依据概念模型设计应具的特点,真实性、易理解性、易修改性、易转换性。如图3-3所示。
3.2.2病历管理系统数据库各表详细设计
对于病历管理系统,要应用到的数据库表有:
Disease 患者病历表
Manage_user 在职人员信息表
User 患者个人信息表
Zhiwei 医院职位信息
各表详细信息如下:
表3-1 患者病历表
字段名 | 数据类型 | 长度 | 是否允许为空 | 字段描述 |
Id | int | 4 | 否 | 自动编号ID(主键) |
Username | nvarchar | 10 | 否 | 姓名 |
Riqi | nvarchar | 50 | 是 | 住院日期 |
Jibing | nvarchar | 50 | 是 | 诊断疾病 |
Chuyuan | nvarchar | 10 | 是 | 出院结果 |
zid | int | 4 | 是 | 住院号 |
bid | int | 4 | 是 | 病床号 |
zhiliao | ntext | 16 | 是 | 治疗经过 |
zhusu | nvarchar | 50 | 是 | 主诉 |
xbs | ntext | 16 | 是 | 现病史 |
jws | ntext | 16 | 是 | 既往史 |
xthg | ntext | 16 | 是 | 系统回顾 |
hunyins | nvarchar | 50 | 是 | 婚姻史 |
tgjc | ntext | 16 | 是 | 体格检查 |
fzjc | ntext | 16 | 是 | 辅助检查 |
note | ntext | 16 | 是 | 其他 |
author | nvarchar | 20 | 否 | 医生ID |
Shanchu | Int | 4 | 是 | 删除确认列(1为删除) |
在患者病历表中保存的是在所有在医院中看病的患者患病信息,其中用户编号是用户在病历中的唯一标识,是不重复的,同时用户名在该系统中也是不能重复的,这样在病历比较多的情况下仍然能通过编号迅速的查找到病历信息,并且将编号指定为主健。同时设置了用户名和医生ID不能为空,这是因为这些是病历当中最关键的部分,是病历存在的关键。 Shanchu字段名是不会在该系统中显示出来的。
表3-2 在职人员信息表
字段名 | 数据类型 | 长度 | 是否允许为空 | 字段描述 |
ID | int | 4 | 否 | 自动编号(主键) |
M_username | varchar | 50 | 是 | 登陆名 |
M_password | varchar | 50 | 是 | 密码 |
M_realname | varchar | 50 | 是 | 真实姓名 |
M_sex | varchar | 50 | 是 | 性别(1为男性) |
M_tel | varchar | 50 | 是 | 联系电话 |
M_email | varchar | 50 | 是 | 电子邮件 |
M_address | varchar | 50 | 是 | 住址 |
M_zip | varchar | 50 | 是 | 邮编 |
M_purview | int | 4 | 是 | 权限 |
在职人员信息表中保存有本医院所有在职员工的基本信息,用户编号设置为主健。在该表中保存的有在职人员的个人基本信息和所拥有的权限。
表3-3 患者个人信息表
字段名 | 数据类型 | 长度 | 是否允许为空 | 字段描述 |
id | int | 4 | 否 | 自动编号(主键) |
Username | nvarchar | 20 | 是 | 用户名 |
Password | int | 4 | 是 | 密码 |
cname | nvarchar | 10 | 是 | 姓名 |
Age | Int | 4 | 是 | 年龄 |
Sex | Int | 4 | 是 | 性别 |
zhiye | Nvarchar | 50 | 是 | 职业 |
Hunyin | Int | 4 | 是 | 婚姻 |
Minzu | Nvarchar | 5 | 是 | 民族 |
Jiguan | Nvarchar | 10 | 是 | 籍贯 |
Address | Nvarchar | 50 | 是 | 现住址 |
Phone | Nvarchar | 20 | 是 | 联系电话 |
guomin | Nvarchar | 80 | 是 | 过敏史 |
shenfenzheng | varchar | 50 | 否 | 身份证 |
Dis | Nvarchar | 50 | 是 | 重要疾病 |
updatetime | Datetime | 8 | 是 | 日期 |
Note | Ntext | 16 | 是 | 其他 |
author | nvarchar | 20 | 是 | 输入病历的医生编号 |
患者个人信息表是这个系统中的一个很关键的信息数据库表,因为病历的所有信息均是围绕着这张表展开,除了用户编号外,还有很关键的用户的身份证信息是不能为空的,因为用户真实姓名如果相同,只有用身份证确认病历的归属。Author字段名是不会在该系统中显示出来。
表3-4 医院职位信息
字段名 | 数据类型 | 长度 | 是否允许为空 | 字段描述 |
id | Int | 4 | 否 | 自动编号(主键) |
Daima | Int | 4 | 是 | 职位代码 |
shuoming | varchar | 50 | 是 | 职位说明 |
该表主要说明系统中各登陆人员的级别以及所处的职位。同样设置Id为主健。
3.3数据库的连接
根据系统功能的设计要求及功能模块的划分,本系统用SQL Server 2000 建立数据库,其中包括管理员数据表,病人信息数据表和病人患病情况信息表等数据表。在整个系统开发的过程中,数据库连接是必不可少的,是公用的,可以把这部分单独拿出来,做成一个函数,需要的时候调用这个函数就可以了。在ASP中同数据联系的主要是ADO,对数据库进行操作处理,要让ADO对象能够存取数据库,最重要的东西就是OLEDB驱动程序或ODBC驱动程序,ADO才能够进行存取。本设计采用了ODBC数据库连接方式,首先要建立同数据源的连接,利用了ADO的Connection建立同数据库的联系。建立ADODB.Connection,使用此对象的Open方法打开数据库。其主要代码如下所示:
<%
dim Conn
sub DB_Connect(sDBConnect)
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open sDBConnect
end sub%>
<%const strconn="DSN=biling_asp;uid=sa;pwd=;database=biling"%>
我们将这段代码单独封装在一个名为config. Asp和_lib.asp的文件中,当某动态网页中需要向数据库读取或者存取数据时,将以下代码
<!--#include file="lib.asp" -->
<!--#include file="conn.asp" -->
包含在该页面的前面,既可以实现与数据库建立连接。
4病历管理系统的实现
4.1管理员管理模块
在整个系统中。首先要写的是管理员模块,因为负责整个登陆权限的控制,管理员模块包含3个模块,其中有些功能是相辅相成的。
4.1.1用户登陆
前面在数据库表创建时已经创建好了用户信息表,数据库中的m_username和m_password字段用来验证用户身份的,有了这两项就可以较容易的写出验证用户登陆的程序了,首先看用户登陆的界面,如图4-1所示。
我们将这个页面命名为default.asp,页面中“用户名”和“密码”内容均为必填项目。验证用户身份的程序如下所示。
Call DB_Connect(strconn)
sql = "select * from [Manage_User] where m_UserName='" & sname & "' And m_PassWord='"&spwd&"'" ‘在表Manage_user中查询用户身份是否存在。
Set rs = conn.Execute(sql) ’执行这个SQL语句,同时返回一个包含了查询信息的记录集
I f Not rs.EOF = True Then
Session("Name") = rs("m_realName")
Session("vip") = rs("m_purview")’读取权限判断值,并保存在session中
rs.Close
Set rs = Nothing
Call DB_Disconnect
Response.Redirect"/bingli/manage.asp"
Response.end
Else
msg="您输入了错误的用户名或口令!"
rs.Close
Set rs = Nothing
Call DB_Disconnect
End If
I f Not rs.EOF = True Then这一句判断用户信息是否存在,EOF和BOF是数据查询记录集的属性,他们分别表示最后一条记录和第一条记录的前面,在最后个纪录前是真的则该用户存在。在验证成功后则可以进入管理页面了,否则会弹出“您输入了错误的用户名或口令!”的对话框,这时请重新输入正确的用户名或密码。
4.1.2管理员添加用户
涉及到用户的添加,会想到用户信息的验证。当用户以管理员身份登录后,点击“管理员管理”后,管理员即可以查看所有在职人员的信息,并可以进行一系列符合权限的活动,如删除和修改密码。如图4-2
在本设计中所用的Respone、Request、Session以及Server都是ASP内建对象,不必经过任何的设置就可以直接使用,但除了这些对象以外,例如使用Server.CreateObject("adodb.recordset")对象,则必须通过Server对象的CreateObject对象来建立和使用。其语法格式为:Server.CreateObject("Component Name")来建立。但是通过这样的创建的对象具有页作用域,也就是说,在当前ASP页处理完成后,服务器将破坏这些对象。如果要创建有会话或应用程序作用域的对象,可以使用<Object>标志并设置Session的属性,较常用的方法如下:
<%set session(“ad”)%=Server.CreateObject(“mswc.adrotator”) >
需要注意的是不能创建与内建对象同名的对象实例,否则将返回错误。添加用户程序中,最主要的是向据库中写入信息的,在这里将用到与数据库有关的对象-------Recordset 。在ADO中的Connection、Recordest及Command对象中,以Recordest对象最重要,是存取数据库中必不可少的部分,把表单中的数据插入到数据库中有3种方法:
1)直接使用SQL语句。其优点是速度快,不消耗资源;缺点是字段较多时不易排错。
2)使用Recordest对象。其优点是代码容易阅读,容易排错;缺点是消耗系统资源。
3)先准备好“字段名称数组”及“字段值数组”,然后利用AddNew 字段名数组 字段值数组将数据记录写入数据库。
前两种方法在本设计中均被使用,其中第二种方法最直接的反映出数据库插入的数值,比较容易排错。在第一种方法中的Values后面的值要一一对应,如果该值为空,可以不填写,但表示分隔的“’”号不能省略。
本设计中添加用户的核心程序如下所示:
If msg=”” then
If Instr(username,"=")>0 or Instr(username,"%")>0 or Instr(username,chr(32))>0 or Instr(username,"?")>0 or Instr(username,"&")>0 or Instr(username,";")>0 or Instr(username,",")>0 or Instr(username,"'")>0 or Instr(username,",")>0 or Instr(username,chr(34))>0 or Instr(username,chr(9))>0 or Instr(username,"")>0 or Instr(username,"$")>0 Then
msg="用户名包含非法字符!"
end if
end If
sql="select count(*) from [manage_user] where (m_username='" & username & "' or m_email='" & email & "') "’连接数据库
set rs=Conn.execute(sql)
if rs(0)>0 then ‘返回用户名或邮箱相同的记录个数以进行判断
msg="用户名或邮箱已存在!"
end if
rs.close’最快的关闭Recordset对象
set rs=nothing’将不用的对象进行释放
if msg="" then
sql="insert into [manage_user] (m_username, m_password, m_realname, m_Sex, m_tel, m_email, m_address, m_zip, m_purview) "
sql= sql & " values('"&username&"','"&userPwd&"','" &realname&"','" &rdoSex& "','"&tel& "','" &email& "','"&address&"','"&zip& "','"&purview&"')"
Conn.execute(sql)
end if
在添加用户的时候对用户名进行了一长窜的判断,用了Vbscript中的Instr()函数,它的作用是返回某字符串在另一字符串中第一次出现的位子。如Instr(username,"%"),在该表达式中username代表了接受搜索的字符串表达式,“%”代表要搜索的字符串表达式。如果在username中找到了“%”,则将会返回“%”的具体位于第几个字符上,没有找到则返回0,所以这里进行了判断是否大于0来确认用户名中是否包含有字符。
其主要目的是判断的哪些字符不能在用户名中存在,因为这些符号如果不能被数据库很好的处理,数据库则会将有关的东西反馈到用户端,危害系统的安全性。所以要避免一些特殊字符的输入。
4.1.3 管理员删除用户
管理员在进行日常维护时,首要的工作是确保本系统所使用的人是唯一的,医院进行的人员调动会影响系统的安全性,所以管理员的日常工作是根据上级人事主管的文件进行用户的删除,以保证只有本院的医务人员才能进入本系统查看和修改病历。主要代码如下所示:
<%call DB_Connect(strconn)
id=request("id")
sql="delete from [manage_user] where id=" & id
Conn.execute(sql)
call DB_DisConnect
response.redirect "manage_admin.asp">%
在表名Manage_user上面加上方括号是因为Manage_user表可能是一个系统表,打上方括号才不会和系统有冲突,保证系统的兼容性。
4.2患者管理模块
患者管理模块基本功能时录入患者个人基本信息及有无患病史,为医生的进一步判断达4下基础。该模块主要有3个部分组成。
4.2.1 患者基本信息的录入
患者在就医过程中,第一步应该是登记自己的个人信息,在这里称为注册。信息的录入对时间的准确性要求很搞,因为如果出现医疗纠纷,那么患者的就诊时间会直接影响到医院是否为该患者在指定的时间中诊断过。因为医院中的电脑属于统一配置,统一管理,不能用自己的电脑登录医院病历系统并且不能自行修改时间,所以所有的时间均是以本机时间作为为患者诊断时间进行登录的直接保存在user表中updatetime中。
在医生和病人数量教多时,为了便于快速的区分患者是在哪位医生看病的,以及能只显示该医生的诊断记录,在添加患者个人基本信息时候把用户登录时的seisson<”name”>的值写入患者个人信息user表中的author字段,在管理患者界面中则可以显示该医生已诊断的人数和详细的资料。代码如下所示。
<input type="hidden" name="author" value="<%=session("name")%>">’在医生输入病历时纪录病人所属医生
添加患者信息时候,为了保证能迅速和准确的联系到患者本人,其个人基本信息是必须完全填写的,包括身份证信息,住址和电话等等,在这个页面医生可以填写病人的基本资料,如图4-3。
为了保证数据的准确性,在添加患者信息时候先用javascript 进行初步判断信息是否填写完和填写是否标准,比如电话、姓名、住址等。在后台用SQL语句保证用户名和身份证没有重复。后台程序如下所示:
<%call DB_Connect(strconn)
if founderr=false then
dim sqlReg,rsReg,rs
sqlReg="select * from [User] where shenfenzheng='" & shenfenzheng & "'or username='"& username &"'"
set rsReg=server.createobject("adodb.recordset")
rsReg.open sqlReg,conn,1,3
if not(rsReg.bof and rsReg.eof) then’判断数据集中有无记录
founderr=true
errmsg=errmsg & "<br><li>你注册的身份证已经存在!</li>"
else
sql="insert into [user] (username, password, cname, age, sex, zhiye,hunyin,minzu,jiguan,address,phone,guomin,dis,updatetime,note,author) "
sql= sql & " values('"&username&"','"&password&"','" &cname&"','" &age&"','"&sex&"','"&zhiye&"','"&hunyin&"','"&minzu&"','"&jiguan&"','"&address&"','"&phone&"','"&guomin&"','"&shenfenzheng&"','"&dis&"','"&updatetime&"','"¬e&"','"&author&"')"
Conn.execute(sql)
founderr=false
end if
rsReg.close
set rsReg=nothing
end if %>
4.2.2 患者管理的删除和修改
医生在患者管理页面可以看到经过自己诊断过的患者个人信息或是已经在医生那里登记过的患者信息,医生可以查看患者的详细信息。如果该患者有病历的则可以直接转入病历页面,本部分所实现的主要功能是帮助医生统计当日患病信息,以便于医院在药物采购时有依据。在该页面中如果是管理员查看,则可以查看所有医生的病人信息,若不是则只能查看当前医生添加的用户信息。
在患者管理的页面,可以看到病人的基本信息,比如重要疾病和联系电话,其主要目的是方便医生浏览以往的病人资料,做到病人的回访,如图4-4。
代码如下:
<%
dim rs,sql
Call DB_Connect(strconn)
if session("vip")="3" then
sql="select * from [User] order by ID desc"
else
sql="select * from [User] where author='"&session("name")&"' order by ID desc"
end if
Set rs=Server.CreateObject("Adodb.RecordSet")
rs.open sql,conn,1,1
…………………(省略代码)
if not rs.eof then
do while not rs.eof
rs.movenext
loop
end if
rs.Close
set rs=Nothing
Call DB_Disconnect
%>
当患者没有病历的时候可以删除患者的个人信息,但是要经过判断,有病历的情况下是不允许删除的。患者信息删除代码如下所示:
msg=""
ID=trim(Request("ID"))
Call DB_Connect(strconn)
set rs=server.createobject("adodb.recordset")
sql="select * from [User] where ID=" & Clng(ID)
rs.open sql,conn,3,3
if count(conn.execute("select cname from disease where cname= "& rs("cname")))>1 then
msg="该用户有病历,不能被删除!"
end if
if ID<>"" then
rs("author")=session("name") or session("vip")="3" then
rs.delete
rs.update
set rs=nothing
conn.close
response.redirect "usermanage.asp"
else
response.redirect "Manage.asp"
end if
end if
rs.Close
Set rs = Nothing
Call DB_Disconnect
response.redirect "UserManage.asp"
%>
在以上程序中使用了Cing()函数,该函数的主要作用是将一个表达式转换为整数以方便计算。
4.3病历管理
病历的管理是整个系统的核心组成部分,病历管理部分是系统中权限限制较多的部分。
4.3.1病历的添加
病历的添加是在患者将个人基本信息输入在User表中为基础的,不会出现有病人的病历但没有病人基本信息的情况,所以这里用到了下拉列表菜单选项,病历的添加涉及到病人的以前患病信息,比如诊断的疾病,既往史和患病史等等,有了这些信息医生才能在治疗过程中准确的运用正确的治疗手段。
病历的添加关系着病人的患病信息是否如实的加入数据库中,病历作为医院最重要的信息应该填写完整和准确,所以添入的信息是最复杂的,包括现在所患信息,治疗的经过和自己称述的不舒服的现象。如图4-5所示。
图4-5中下拉菜单列表代码如下:
<% set rsuser=Server.CreateObject("Adodb.recordset")
sqluser="select cname from [user] where author= '" & session( "name") & "' order by id desc"
rsuser.open sqluser,conn,1,3%>
<select name="cname">
<% do while not rsuser.eof %>
<option><%=rsUser("cname")%></option>
<% rsuser.movenext
loop
rsuser.close
set rsuser=nothing %>
</select>
病历添加的代码如下所示:
<%Call DB_Connect(strconn)
Set rs = Server.CreateObject("ADODB.Recordset")
sql="select * from disease "
rs.open sql,conn,1,3
rs.addnew’这一行为加入一个记录,如果漏掉,就会改以前的记录了。
rs("username")=username
rs("riqi")=riqi
rs("jibing")=jibing
rs("chuyuan")=chuyuan
…………(省略代码)
rs.update’将更新写入数据库中
rs.close’关闭Recordest对象
set re=nothing’将不用的对象从内存中释放
response.redirect "Manage_dis.asp"
end if
%>
4.3.2病历的管理
病历的管理是本系统的重点,主要实现了病历的查看和病理的删除。医生个人的病人病历信息将出现在这个页面中,医生可以在该页面查看病例,但是一定病历被保存则不能修改,修改和删除病例需要授权。如图4-6。
分页的代码如下:
<%const MaxPerPage=20
dim strFileName,rs,sqltext,i,sql
dim totalPut,CurrentPage,TotalPages
strFileName="manage_dis.asp"
if request("page")<>"" then
currentPage=cint(request("page"))
else
currentPage=1
end if%>
<%if rs.eof and rs.bof then
response.write "目前共有 0 个注册用户"
else
totalPut=rs.recordcount
if currentpage<1 then
currentpage=1
end if
if (currentpage-1)*MaxPerPage>totalput then
if (totalPut mod MaxPerPage)=0 then
currentpage= totalPut \ MaxPerPage
else
currentpage= totalPut \ MaxPerPage + 1
end if
end if
if currentPage=1 then
showpage strFileName,totalput,MaxPerPage,true,true,"个用户"
showContent
showpage strFileName,totalput,MaxPerPage,true,true,"个用户"
else
if (currentPage-1)*MaxPerPage<totalPut then
rs.move (currentPage-1)*MaxPerPage
dim bookmark
bookmark=rs.bookmark
showpage strFileName,totalput,MaxPerPage,true,true,"个用户"
showContent
showpage strFileName,totalput,MaxPerPage,true,true,"个用户"
else
currentPage=1
showpage strFileName,totalput,MaxPerPage,true,true,"个用户"
showContent
showpage strFileName,totalput,MaxPerPage,true,true,"个用户"
end if
end if
end if%>
为了提高页面读取速度,不能将所有的病历罗列在一页上显示,而是将其分成多页显示,每页显示一定数目的病历树,分页主要有两种方法:
1)将数据库中所有符合查询条件的记录一次性读入Recordest中,并存放在内存中,然后同过ADO Recordest对象所提供的专门分页处理的属性——PageSize(页大小)、PageCount(页数目)、AbsolutePage(绝对页)来管理分页处理。
2)根据客户指示,每次分别从符合查询条件的记录中将规定的记录数目显示出来。
这里采用的是第一种方法。AbsolutePage属性指示当前记录所在的页,用PageSize属性将Recordest对象逻辑划分为一系列的页,每一页的记录数都等于PageSize;BookMark属性指示唯一标识Recordest对象中的当前记录的书签,或者将Recordest对象的当前记录设置为有效书签标识的记录,若要保存当前记录的书签,将Bookmark属性的值分配给一个变量;MaxRecords属性指示由查询由查询返回给Recordet的最大记录数目,该属性在Recordet关闭时为读写,在Recordet打开是为只读。PageSize属性指示Recordet中一页包含的记录数目,默认值为10,可以一次查看一定数量的记录。
4.3.3病历的删除
由于病历的特殊性,所以病历的删除有着严格的权限管理,在整个系统中病历的删除和恢复都是由专人负责,没有权限则会出现图4-7的提示,删除后将会提示图4-8的提示且操作行为将会被系统记录。
其代码如下所示。
<%
dim sql,id,msg,rs,sqltext,username
msg=""
id=request("id")
if session("vip")<>3 then
msg="你没有删除的权限,请与系统管理员联系"
else
Call DB_Connect(strconn)
sql="update [disease] set shanchu=1 where id=" & id
Conn.execute(sql)
msg="记录已被删除,该行为已被系统记录。"
call DB_DisConnect
end if
%>
病历的删除必然有病历的恢复,病例的恢复和删除是不同的人所执行的,如果删除和恢复在一起,将在人事管理方面引起严重的后果。在病历查看页面管理员可以选择恢复病历或者是彻底的删除病历。如图4-9。
恢复病历的主要代码如下所示。
<%
dim sql,id,msg,rs,sqltext,username
msg=""
id=request("id")
if session("vip")<>3 then
msg="没有权限恢复,请与管理员恢复!"
else
Call DB_Connect(strconn)
sql="update [disease] set shanchu=0 where id=" & id
Conn.execute(sql)
msg="记录已被成功恢复!"
call DB_DisConnect
end if
%>
经过试用,基本满足在经常业务的需要,实现了在线患者信息管理,患者信息录入等功能,系统性能良好,工作正常,具有较强的可移植性,可维护性和安全性。本系统也有一些不尽人意的地方,如录入的病历的安全性问题未能得到很好的解决,部分的界面也比较粗糙,这些都有待今后的完善。