第十八章 定义 HL7 搜索表
HL7 搜索表类 EnsLib.HL7.SearchTable,自动索引填充的 HL7 属性。
如果需要搜索更多的项,可以创建一个子类。子类继承Identifier属性,以及使搜索表工作的基础结构。具体操作请参见在产品中使用虚拟文档中的“定义搜索表类”。
对于HL7, 支持PropType的附加值。除了在产品中使用虚拟文档中列出的类型之外,还可以使用DateTime:HL7。
创建搜索表时,不要使用保留的包名;参见开发产品中的“保留包名”。
默认索引的属性
当选择EnsLib.HL7。searchtable作为搜索表类,使能够在HL7消息中搜索以下虚拟属性。
MSHTypeName
消息结构名称。为了创建这个字符串,将HL7消息中的以下值连接起来:
- MSH消息头段
字段`9`(消息类型)
子字段`1`(消息类型`:ADT`, `ORM`等)
- 文字字符_
- `MSH`消息头段
字段`9`(消息类型)
子字段`2`(触发事件:`A01、A12、O01_2`等)
结果是一个格式为ADT_A01, ADT_A12, ORM_O01_2等的消息结构名称。
MSHControlID
此消息的唯一标识号。production程序从:
- `MSH`消息头段
- 字段10(消息控制ID)
将此值解释为区分大小写的字符串。
PatientID
此消息的患者标识符。随着HL7标准的发展,这个领域的位置也发生了变化。出于这个原因,在以下所有位置查找此值。这样,无论消息符合哪个HL7模式类别,都可以找到患者标识符:
- PID患者标识符段
字段`2`(患者外部标识符)
子字段`1`(患者标识符)
- `PID`患者标识符段
字段`3`(患者标识符列表),列表中的所有条目
子字段`1`(患者标识符)
- `PID`患者标识符段
字段`4`(患者标识符列表),列表中的所有条目
子字段`1`(患者标识符)
PatientName
PID患者标识符段
字段5(患者姓名)
PatientAcct
PID患者标识符段
字段18(患者账号)
子字段1 (ID)
示例
下面的示例包含一个使用{}语法的虚拟属性路径。这个<Item>元素指的是HL7消息中第1段第10字段的值:
<Item DocType=""
PropName="MSHControlID"
PropType="String:CaseSensitive"
StoreNulls="true" >
{1:10}
</Item>
下面这个更复杂的<Item>元素使用objectscript_操作符连接三个字符串。从左到右依次是:
- 段
1,字段4内的值 - 文字-字符
- 段
1,字段3内的值
<Item DocType=""
PropName="SendingFacilApp" >
{1:4}_"-"_{1:3}
</Item>
下面的<Item>示例使用了大多数可能的语法选项:连接、虚拟属性、字符-和ObjectScript字符串函数$PIECE。
XData SearchSpec [ XMLNamespace="http://www.intersystems.com/EnsSearchTable" ]
{
<Items>
<Item DocType="Mater:ORM_O01 "
PropName="RelationKey" >
$P(
{ORCgrp(1).OBRuniongrp.OBRunion.OBR:UniversalServiceID.text},"-",1,2
)_"-"_{MSH:12}
</Item>
</Items>}
下面的示例搜索表类提供了几个有效<Item>条目的示例。这个类继承自EnsLib.HL7。searchtable,这是HL7搜索表所需要的。每组<Item>条目上面的注释描述了这组条目的目的。关于{}或[]语法的详细信息,请参见在生产中使用虚拟文档的“语法指南”一节。
Class Demo.HL7.MsgRouter.SearchTable Extends EnsLib.HL7.SearchTable
{
XData SearchSpec [ XMLNamespace="http://www.intersystems.com/EnsSearchTable" ]
{
<Items>
<!-- Items that do not depend on DocType, indexing any HL7 message -->
<Item DocType="" PropName="SendingFacilApp" >{1:4}_"|"_{1:3}</Item>
<Item DocType="" PropName="RecvingFacilApp" >{1:6}_"|"_{1:5}</Item>
<Item DocType="" PropName="MSHDateTime" PropType="DateTime:HL7" >{1:7}</Item>
<!-- Get fields from named segments found in any HL7 message -->
<Item DocType="" PropName="PatientName" >[PID:5]</Item>
<Item DocType="" PropName="InsuranceCo" >[IN1:4]</Item>
<!-- Get patient name from any HL7 message declared type ADT_A05 -->
<Item DocType=":ADT_A05" PropName="PatientName" >{3:5}</Item>
<!-- Get specific field from specific segment when the -->
<!-- HL7 message is assigned a specific DocType. Only in this -->
<!-- case can you use names for segments, instead of numbers. -->
<Item DocType="Demo.HL7.MsgRouter.Schema:ORM_O01 " PropName="ServiceId" >
{ORCgrp().OBRuniongrp.OBRunion.OBR:UniversalServiceID.text}
</Item>
<Item DocType="2.3.1:ORU_R01 " PropName="ServiceId" >
{PIDgrpgrp().ORCgrp(1).OBR:UniversalServiceID.text}
</Item>
</Items>
}
}