PB与Caché数据库在急诊分诊系统中的设计与应用

计算机时代 / 2018年09月02日 02:22

数码

...忙 单片机最小系统用层次原理设计出来

摘 要: 文章详细介绍了系统的设计、开发过程,在医院急诊分诊系统设计中,前台利用PoweBuilder工具,后台为后关系型数据库Caché。系统通过前端PB程序定时调用His生产库上的Web Service以获取患者挂号信息,采取调用Caché库中的类方法和传统SQL语句及PB自带的数据窗口工具相结合来实现信息的查询、保存、删除等操作。系统的应用加强了急诊管理,该软件为临床提供了及时的动态信息反馈和分析功能。

关键词: Caché; Web Service; 分诊; 数据窗口

中图分类号:TP311 文献标志码:A 文章编号:1006-8228(2018)06-49-04

Design and application of PB and Caché database in the emergency triage system

Yao Wei

(Equipment & Information Department, People's Hospital of YangZhong City, Zhenjiang, Jiangsu 212200, China)

Abstract: This paper introduces the process of system design and development in detail. In the design of hospital emergency triage system, the front-end uses PoweBuilder tools and the background is relational database Caché. The system periodically calls Web Service on the His production database via the front-end PB program to obtain patient registration information. By calling the class in the Caché database and combining with the traditional SQL statements and the PB's DataWindow tools, the operations of information query, save and deletion are realized. The application of the system strengthens the emergency management, and the software provides the clinic with timely and dynamic information feedback and analysis functions.

Key words: Caché; Web Service; triage; DataWindow

0 引言

由于我院急诊预检存在一些问题,如分诊人员不足、信息不全、手工登记速度慢、错误率高,分诊过程随意性强或凭经验分诊,缺乏一套有效的、科学的分诊系统;管理部门大量的、繁琐的统计报表全靠手工完成,工作效率低下。因此,2017年起,由我院信息科和急诊科人员共同开发了一套适合我院急诊流程的分诊管理的软件系统,该系统目前已正式应用于临床,提高了分诊的准确率及工作效率,减轻了工作人员压力[4]。

1 开发环境简介

系统设计采用CS架构,系统基于Caché数据库环境,同时主HIS生产库也是Caché数据库,开发平台为Windows采用PowerBuilder软件开发。Caché数据库是美国Intersystems公司产品,后关系型数据库中的领头羊。Caché数据库对大多数国内IT人员来说,还是比较陌生,然而在国外特别是国外的医疗领域中,Caché数据库所占的比例是最大的,被医疗界公认为首选数据库。官方数据显示,Caché数据库的数据查询速度约为其他数据库的7~20倍,并方便的支持关系型数据库和对象型数据库[1]。

2 开发过程介绍

2.1 急诊患者挂号信息查询

首先在生产库上建立WebService[2]:http://10.10.50.3/dthealth/web/DHCEmpatient.MyService.CLS代码如下:

Class DHCEmpatient.MyService Extends %SOAP

.WebService [ProcedureBlock]

{ Parameter SERVICENAME="MyService";

Method GetPatientList(inPut As %String) As

%FileCharacterStream [WebMethod]

{ q ##class(DHCEmpatient.EmpatientWeb).Emplist(inPut)

}

}

// DHCEmpatient.EmpatientWeb.Emplist()類方法,入参为就诊日期,部分代码如下

Class DHCEmpatient.EmpatientWeb Extends

(%Persistent, %XML.Adaptor)

{ ClassMethod Emplist(PatDate As %String) As

%GlobalCharacterStream [WebMethod]

{ //日期格式转化

if PatDate["-" set PatDate=$zdh(PatDate,3)

if PatDate["/" set stDate=$zdh(stDate,4)

S retStr=##class(%GlobalCharacterStream).%New()

d retStr.Rewind()

d retStr.Write("")

set paadmrowid=""

//就诊日期为索引遍历查询

for set paadmrowid=$o(^PAADMi("AdmDateCurr",

PatDate,paadmrowid)) quit:paadmrowid="" do

patinfo=##class(web.DHCNurIpComm).NurPatInfo

(paadmrowid)

.set PatName=$p(patinfo,"^",1) //姓名

.set Sex=$p(patinfo,"^",2) //性别

//面向对象实例赋值

.S myobj=##class(DHCEmpatient

.TOResultPatList).%New()

.s myobj.PatName=PatName

.s myobj.Sex=Sex

.S xml=##class(%GlobalCharacterStream).%New()

.S ret=myobj.XMLExportToStream(.Xml,"HIS")

.q:ret=0

.d retStr.CopyFrom(Xml)

d retStr.Write("

")

q retStr

}

其次在PB环境中引入Pbdom90.pbd及Pbsoapclient90.pbd两文件,并在PB中通过WebService Proxy Wizard向导新建web service代理对象并引用生产库上http:// 10.10.50.3/dthealth/web/DHCEmpatient.MyService.CLS,完成后进行编译,命名为empmyservicesoap。与此同时建立一自定义类名为n_cst_pbwsfunction,方法名为uf_getempinfobydate,入参为bydate日期格式,点击图1上查找按钮后,系统将根据日期调取出挂急诊号别患者的基本信息及挂号信息(如图1),执行的具体过程如下。

⑴ 日期为入参信息传入到csf_function. uf_

getempinfobydate类方法中,获取到XML信息并保存在ls_tempxml变量中。

⑵ 清空本地磁盘目录下d:\emermis\patientlist.xml文件,并将XML固定格式串写到文件中,同时因每次写入到文件中字节大小有限制最大为32765,则将ls_tempxml变量分多次循环写入到patientlist.xml文件中。

⑶ 对文件patientlist.xml进行解析,并通过循环写入到数据窗口中。

⑷ 可对此数据窗口记录按挂号时间或就诊卡号排序,以便快速定位到需分诊患者。

⑸ 主要代码如下:

//调用生产库WEBSERVICE,获取XML串

n_cst_pbwsfunction lcsf_function

lcsf_function=create n_cst_pbwsfunction

ls_regdate=string(date(em_date.text),"yyyy-mm-dd")

ls_tempxml=lcsf_function.uf_getempinfobydate

(ls_regdate)

ll_FLength=Len(ls_tempxml)

li_FileNum=FileOpen("d:\emermis\patientlist.xml",

StreamMode!, Write!, LockWrite!, Replace!)

FileWrite(li_FileNum, "")

FILECLOSE(li_FileNum)

li_FileNum=FileOpen("d:\emermis\patientlist.xml",StreamMode!,

Write!, LockWrite!)

FileWrite(li_FileNum, '<?xml version="1.0" encoding=

"gb2312" standalone="no"?>')

("%"_:docAd_"%")

}

//計算写入次数,每次向文件中写32765个字节

if ll_FLength > 32765 then

if mod(ll_FLength,32765)=0 then

loops=ll_FLength/32765

else

loops=ll_FLength/32765+1

end if

else

loops=1

end if

//进行循环写入

for i=1 to loops

ls_tmp=left(ls_tempxml,32765)

FileWrite(li_FileNum,ls_tmp)

ls_tempxml=right(ls_tempxml,len(ls_tempxml)-32765)

next

FILECLOSE(li_FileNum)

//解析XML串文件中,并读取信息到数据窗口

pbdom_builder builder

pbdom_document doc

pbdom_element root, children[],node_element,

sub_elements[]

pbdom_attribute node_attribute[]

builder=create pbdom_builder

doc=builder.BuildFromFile("d:\emermis\patientlist.xml")

if doc.HasRootElement() then

root=doc.GetRootElement()

root.GetChildElements(children)

for ll_i=1 to UpperBound(children)

node_element=children[ll_i]

ls_nodename=node_element.GetQualifiedName()

li_insert_row=dw_1.insertrow(0)

node_element.GetChildElements(sub_elements)

for ll_j=1 to UpperBound(sub_elements)

ls_name=sub_elements[ll_j].getName()

ls_text=sub_elements[ll_j].getText()

Choose case ls_name

case "Admdate"

dw_1.setitem(li_insert_row,"admdate",date(ls_text))

case "RegNo"

dw_1.setitem(li_insert_row,"RegNo",trim(ls_text))

case "PatName"

dw_1.setitem(li_insert_row,"PatName",trim(ls_text))

2.2 分诊界面-图2执行的具体代码功能

⑴ 调用Caché数据库中web.EmPatientList類,方法名为PadmExist,患者就诊ID作为入参,判断是否在分诊系统表中已登记,并根据结果进入下一步操作。

⑵ 调用Caché数据库中User.EmPatientList类,方法名为Update对分诊信息保存,其中入参为患者基本信息及分诊信息等,每个字段信息并以”^”分隔连接成一个字符串。此功能用主要采用Caché数据库环境中COM方式的实现, 同时在PB中引用CacheObject.dll,定义工厂对象及连接数据代码[5]:

factoryObject=Create OLEObject

rsobject=Create OLEObject

factoryObject.ConnectToNewObject("CacheObject.factory")

conmark=factoryObject.Connect("cn_iptcp:10.10.50.66

[1972]:DHC-APP")

//判断是否在分诊系统表中已登记

rsobject=factoryObject.static("web.EmPatientList")

rtncode=rsobject. PaAdmExist (string(li_adm))

if rtncode=1 then

messagebox("提示","已登记此患者的分诊记录,请不要

重复登记!"+" "+string(li_adm))

return

end if

//分诊信息保存

rsobject=factoryObject.static("User.EmPatientList")

ls_result= rsobject.Update(str)

if integer(ls_result)>0 then

messagebox("提示","数据保存成功!")

else

messagebox("提示","数据保存失败!"+ ls_result)

end if

其中判断是否已分诊类方法在Cache库中代码如下:

ClassMethod PaAdmExist(paadm As %String) As %Integer

{ set Ret=0

if $d(^User.EmPatientListI("IndexEmPaAdmId",

paadm)) set Ret=1

q Ret

}

其中分诊信息保存类方法在Cache库中部分代码如下:

ClassMethod Update(argInput As %String,

argSeparate As %String) As %String

{ New (argInput,argSeparate)

Set return=0

Quit:argInput="" return

If ($g(argSeparate)="") {

Set argSeparate="^"

}

//开始更新数据记录

Set ID=$p(argInput,argSeparate,1)

If (ID="") {

Set obj=##class(User.EmPatientList).%New()

} Else {

Set obj=##class(User.EmPatientList).%OpenId(ID)

}

Quit:'$IsObject(obj) return

//解析入參argInput

Set xEmPatDate=$p(argInput,argSeparate,2)

Set xEmPatTime=$p(argInput,argSeparate,3)

Set xEmPatId=$p(argInput,argSeparate,4)

Set xEmPatName=$p(argInput,argSeparate,5)

……

//给对象赋值

Set obj.EmPatDate=$zdh(xEmPatDate,3)

Set obj.EmPatTime=$zth(xEmPatTime)

Set obj.EmPatId=xEmPatId

Set obj.EmPatName=xEmPatName

Set obj.EmUpdateDate=+$h

Set obj.EmUpdateTime=$p($h,",",2)

……

//判断Save是否成功

Set sc=obj.%Save()

If $SYSTEM.Status.IsError(sc) {

Do $System.OBJ.DisplayError(sc)

Set return=-1

} Else {

Set return=obj.%Id()

}

Do obj.%Close()

Quit return

}

2.3 抢救登记界面

此功能(如图3)主要是由急诊护士对患者抢救过程中的措施、辅助检查结果、参与抢救医护人员等信息进行登记,并将模糊查询集成在同一界面[6]。此保存信息功能主要采用传统的SQL语句及数据窗口一起实现,部分主要代码如下[3]:

update dhc_yzempatient set savepeople=:ls_all,

SaveMethod=:ls_allmark,OtherSaveMethod=:ls_other,result=:ls_result,dirtime=:ls_dirtime,dirloc=:ls_dirloc,empmark="02抢救患者"where id=:ll_rowid;

if sqlca.sqlcode=0 then

commit using sqlca;

messagebox("提示","数据保存成功!")

else

rollback using sqlca;

messagebox("提示","数据保存失败!"+" "+sqlca

.sqlerrtext,stopsign!)

end if

图2 患者分诊信息

图3 抢救患者登记

3 结束语

本文着重介绍了系统的开发过程,通过调用生产库WebService获取患者就诊信息,并解析XML串信息显示到数据窗口,在分诊过程中调用Caché数据库中的类方法,判断是否已分诊并保存分诊信息记录,而在抢救记录界面利用PB自带的数据窗口及传统的SQL语句进行信息查询及保存,将PB中数据窗口的简洁、直观优点与Caché库中类方法高效的执行效率结合在一起进行初步尝试,为后续的各类统计报表的编制打下了基础。

本系统的开发具有以下优势。

⑴ 提高急诊工作效率:改变了烦琐的手工登记,全面正确记录急诊患者的各种信息,节省时间。

⑵ 提高信息准确率及患者满意度:建立了规范的评估系统,提高护理人员分诊的准确率,及时筛选出符合条件的危重症患者,确保患者能够及时进入绿色通道就诊,提高患者的满意度。

⑶ 加强科内管理:该软件提供及时的动态信息和统计分析功能,使急诊的动态变化一目了然。

同时,基于患者生命体征及症状等信息智能化分诊评级仍然有许多不完善的地方,需要信息人员与临床医护人员更多交流,进一步的研究和开发,最终能够更好的提高急诊科工作效率及成功救治率。

参考文献(References):

[1] 雷舜东,吴帮华,黄海莹,李玉明,张红.Caché数据库在医院

信息系统中的优势[J].实用医院临床杂志,2012.1:162-165

[2] 宗宁.Caché数据库中Web Service的开发与应用[J].电脑编

程技巧与维护,2010.22:43-44

[3] 李成亮,姚伟.Caché数据库CS架构数据交互的研究与分析[J].

计算机时代,2017.8:20-23

[4] 金静芬,许杰,沈国丽.急诊分诊管理程序的软件开发与应用

研究[J].护理与康复,2007.4:219-220

[5] 李成亮,姚伟.Caché数据库简单模糊查询的研究与分析[J].

计算机时代,2017.1:51-54

[6] 周璋,胡菲.急诊分诊系统的应用进展[J].实用临床护理学电

子杂志,2017.2(14):197-198

1.环球科技网遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.环球科技网的原创文章,请转载时务必注明文章作者和"来源:环球科技网",不尊重原创的行为环球科技网或将追究责任;3.作者投稿可能会经环球科技网编辑修改或补充。