找回密码
 欢迎注册
搜索
热搜: 活动 交友 discuz
查看: 6162|回复: 15

[讨论]JB的Specification示例讲解

[复制链接]
发表于 2003-5-16 18:09:33 | 显示全部楼层 |阅读模式
今天就简单说说整个的概念。前面的Introduction、Definitions、Workflow Overview自己看看就行了。
我们先说Application Trigger Points,为什么要特别提这个呢?因为HL7基本理念是事件触发,在这个小节中,说了8个事件触发点以及需要完成的动作,这些动作就对应了HL7的消息。当然你也可以不遵循事件触发,可以批量直接进行发送消息就是,但也应该知道为什么要传递信息,传递什么信息。这个东西等看完了后面的东西在返过来看,就容易理解了。
后面的东西就是我们的讲解重点了,Delimiters大家都知道,就是分隔符的意思,用于分割数据,没啥说的。
我们看Sample Order Message:
MSH|^~\\&amp;|My RIS|||Your PACS |200305081043||ORM^O01|000561810007466|P|2.3|||||<CR>
PID|||123423541|123423541|MATTHEWS^JOAN^L||19421017|F|||1150 WARDING ST^^KOUDON^TN^37774||8764089878|8764588600||||123423541|123423541|<CR>
ORC|NW||000561810007466||||200305280800|||||48^PONER^ALBERT^MD||8765881847^5887390|||||<CR>
OBR||000561810007466|000561810007466|76700^ULTRASOUND ABDOMEN|||||||||UNITED HEALTHCARE^PREV AT FSRMC PER OFC TT JILL @ OFC,NOT ALLERGIC,NOT ASTH^MATIC,NOT DIABETIC PER OFC,NO RENAL DZ,NO MM PER OFC^   VFD ORDER &amp; EXAMS WITH JUANITA|||48^PONER^ALBERT^^MD|||XRAY RADIOLOGY^US RM1|||||US01|||||||UNKNOWN|||||200305280800^|<CR>
需要详细讲解一下这个消息的意思,大家就好理解了。嘿嘿,不过今天下班了,等明天。
发表于 2003-5-19 10:45:09 | 显示全部楼层

[讨论]JB的Specification示例讲解

继续呀,zhuzhu,多谢!
 楼主| 发表于 2003-5-19 17:22:53 | 显示全部楼层

[讨论]JB的Specification示例讲解

MSH|^~\\&amp;|My RIS|||Your PACS |200305081043||ORM^O01|000561810007466|P|2.3|||||<CR>
PID|||123423541|123423541|MATTHEWS^JOAN^L||19421017|F|||1150 WARDING ST^^KOUDON^TN^37774||8764089878|8764588600||||123423541|123423541|<CR>
ORC|NW||000561810007466||||200305280800|||||48^PONER^ALBERT^MD||8765881847^5887390|||||<CR>
OBR||000561810007466|000561810007466|76700^ULTRASOUND ABDOMEN|||||||||UNITED HEALTHCARE^PREV AT FSRMC PER OFC TT JILL @ OFC,NOT ALLERGIC,NOT ASTH^MATIC,NOT DIABETIC PER OFC,NO RENAL DZ,NO MM PER OFC^   VFD ORDER &amp; EXAMS WITH JUANITA|||48^PONER^ALBERT^^MD|||XRAY RADIOLOGY^US RM1|||||US01|||||||UNKNOWN|||||200305280800^|<CR>
在理解这个消息之前,需要了解HL7的基本概念:消息(message)、段(segment)、字段(field).简单的说消息是HL7传递的最小单位,每个消息可以包含有若干个有序的段,段是一个逻辑组成单位,有若干个字段组成,字段是消息的最小组成单位,为一串字符串。每个消息和段都有一个三位字母或数字组成的标识。如:msh表示message header segment 消息头段。pid表示为patient identification segment
ADT^A01表示ADT事件中的A01消息,ORM^O01表示ORM事件中的O01消息,O01不是两个零第一个是欧,第二个才是零。<cr>表示回车符表示一个段的结束,其他分隔符可以看Delimiters中的说明。
上面的消息,我们可以知道是O01消息,属于ORM事件中的一个,由四个段组成,四个段分别是msh、pid、orc、obr。
今天先到这里,明天继续深入讲解如何知道每个段的意思。希望大家能够喜欢:)
发表于 2003-5-19 18:09:52 | 显示全部楼层

[讨论]JB的Specification示例讲解

zhuzhu,我很想学HL7,自己一点点看很难,我跟你学吧?
发表于 2003-5-20 09:03:50 | 显示全部楼层

[讨论]JB的Specification示例讲解

zhuzhu 解说得不错。每个信息里有几段,每段里面该有什么东西是 HL7 标准里制定的。"Specification" 里面有列表上说明。
我目前还在多伦多。多伦多好的好, 街上没人带口罩。这两天在 Toronto Western Hospital 工作,还是 SARS 草木皆兵,进出要消毒。 明天就解除了。
 楼主| 发表于 2003-5-20 14:39:16 | 显示全部楼层

[讨论]JB的Specification示例讲解

下面引用由国产流氓2003/05/19 06:09pm 发表的内容:
zhuzhu,我很想学HL7,自己一点点看很难,我跟你学吧?
赫赫,这个论坛的高人都的很,而且我并不进行开发,如果说HL7方面有什么问题的话,倒是可以和你交流一下。大家共同提高吧,我接触HL7也不过一年半左右而已。
 楼主| 发表于 2003-5-21 09:00:36 | 显示全部楼层

[讨论]JB的Specification示例讲解

下面引用由JB2003/05/20 09:03am 发表的内容:
zhuzhu 解说得不错。每个信息里有几段,每段里面该有什么东西是 HL7 标准里制定的。"Specification" 里面有列表上说明。
我目前还在多伦多。多伦多好的好, 街上没人带口罩。这两天在 Toronto Western ...
谢谢,希望没有解说错。JB可要小心点,特别是在医院的时候。现在国内SARS情况也好多了。
发表于 2003-5-21 09:29:05 | 显示全部楼层

[讨论]JB的Specification示例讲解

下面引用由zhuzhu2003/05/20 02:39pm 发表的内容:
赫赫,这个论坛的高人都的很,而且我并不进行开发,如果说HL7方面有什么问题的话,倒是可以和你交流一下。大家共同提高吧,我接触HL7也不过一年半左右而已。

我只接触过DICOM,对HL7一窍不通,看又不是很明白,很多东西想找个人问问
 楼主| 发表于 2003-5-21 18:52:49 | 显示全部楼层

[讨论]JB的Specification示例讲解

下面引用由国产流氓2003/05/21 09:29am 发表的内容:
我只接触过DICOM,对HL7一窍不通,看又不是很明白,很多东西想找个人问问
如果我能够解答的话一定尽力,现在论坛在放HL7中英文对照版本,我想是个学习的好机会。
上一节我们说到每个消息由段构成,那么每个段怎么解释呢?在HL7标准中,对于每个段的定义分散在各个章节中,因此不太好找。
我们先来看看上面的这个消息的定义,在本文档的Order Message Type一段中,
ORM Message SegmentsDescription
MSHMessage Header
  PID Patient Identification
    ORC  Common Order
      OBR   Order Detail
然后对照着到文档的第14页,看看MSH - Message Header段的结构,PID - Patient Identification的结构,ORC – Common Order段的结构,OBR - Observation Request段的结构。
我们来解释一下这几个表的表头中几个关键列的含义:
seq:这是序号
HL7 Field Name:HL7字段名
Len:字段长度
Type:数据类型,这是HL7自己定义的数据类型,以后慢慢讲
Comments:这个是注释啦。
先说两点:
一是我们看到一个消息都是这么样开头的:
MSH|^~\\&amp;|My RIS|||Your PACS |200305081043||ORM^O01|000561810007466|P|2.3|||||<CR>
其中的MSH|^~\\&amp;|总是这样子的,这是因为消息头的前两位已经被固定了,用于放HL7的字段分隔符和编码分隔符,而HL7推荐的分隔符就是|和^~\\&amp;,现在大家可以理解了。
二是HL7一个段内的字段顺序是有意义的,所以消息编码必须按照HL7规定的顺序,否则会发生解析错误,如果某个字段为空,可以则用两个连续的分隔符表示,所以会看到
My RIS|||Your PACS
的情况。当然还有一些其他的编码规则,这个慢慢讲,今天先讲这么多。以后每次大概都是下班的这个时候过来,上班的时候忙,所以请大家耐心一点点。
发表于 2003-5-22 00:32:31 | 显示全部楼层

[讨论]JB的Specification示例讲解

!!!!!!!!
Thank You!
 楼主| 发表于 2003-5-22 18:54:47 | 显示全部楼层

[讨论]JB的Specification示例讲解

本来想讲讲HL7的编码方法和原则,不过这些都是标准上的东西,我在打出来也没有什么意思,所以和坛主商量了一下,让坛主把2.4中翻译过的相关部分贴出来,我就算是逃过一课,今天你们要是没有看到,就找坛主啊:)
发表于 2003-5-22 19:26:10 | 显示全部楼层

[讨论]JB的Specification示例讲解

唉,这不是逼我嘛,这是中英文对照的相关部分
2.11MESSAGE CONSTRUCTION RULES消息构筑规则
Note: These message construction rules define the standard HL7 encoding rules, creating variable length delimited messages.  Although only one set of encoding rules is defined as a standard in HL7 Version 2.3, other encoding rules are possible (but since they are non-standard, they may only be used by a site-specific agreement).
注意:    消息构筑规则中定义了HL7编码规则标准,创建了不同长度的定界消息。尽管HL7版本2.3中只定义了一套编码规则,但其它的编码规则也具有潜在的使用可能性。(因为其它的编码规则是非标准的,所以只在指定地点的约定中使用。)
Step 1Construct the segments in the order defined for the message.  Each message is constructed as follows:
步骤1   以消息定义的顺序构筑段。每一个消息按以下步骤构筑:
a)the first three characters are the segment ID code
a) 前三个字符为段ID代码
b)each data field in sequence is inserted in the segment in the following manner:
b)  序列中每一个数据字段都按以下的方式插入到段中:
1)a field separator is placed in the segment
1)     字段分隔符被放到段中
2)if the value is not present, no further characters are required
2)  如果值未给出,则不需要任何字符
3)if the value is present, but null, the characters "" (two consecutive double quotation marks) are placed in the field
3)  如果值已给出,但为空值,应将字段置为""(两个连续的双引号)
4)otherwise, place the characters of the value in the segment.  As many characters can be included as the maximum defined for the data field.  It is not necessary, and is undesirable, to pad fields to fixed lengths.  Padding to fixed lengths is permitted.  Encode the individual data fields as shown in Section 2.9, “Data types.”
4)另外,将值放入段中。字符的个数由数据字段中定义的最大值决定。不需要将字段填充到固定长度,但填充字段到固定长度也是允许的。单独数据字段的编码方法在2.9节“Data types.数据类型”中介绍。
5)if the field definition calls for a field to be broken into components, the following rules are used:
i.if more than one component is included they are separated by the component separator
ii.components that are present but null are represented by the characters ""
iii.components that are not present are treated by including no characters in the component
iv.components that are not present at the end of a field need not be represented by component separators.  For example, the two data fields are equivalent:
|ABC^DEF^^| and |ABC^DEF|.
       5)如果字段定义需要将一个字段插入到组分中时,应当使用下面的规则:
i)如果不只包括一个组分,各组分应由组分分隔符分隔开。
ii)组分已给出,但为空值时,应由""表示出来。
iii)未给出组分时,可以看作组分中不包含任何字符。
iv)字段末尾未给出的组分不需要使用分隔符。例如,以下的两个数据字段等同:|ABC^DEF^^| 和 |ABC^DEF|
6)if the component definition calls for a component to be broken into subcomponents, the following rules are used:
i.if more than one subcomponent is included they are separated by the subcomponent separator
ii.subcomponents that are present but null are represented by the characters ""
iii.subcomponents that are not present are treated by including no characters in the subcomponent
iv.subcomponents that are not present at the end of a component need not be represented by sub-component separators.  For example, the two data components are equivalent:
^XXX&amp;YYY&amp;&amp;^ and ^XXX&amp;YYY^.
6)组分定义需要将组分插入到子组分中时,使用以下规则:
i)如果不只包含一个子组分,各个子组分应由子组分分隔符分隔开。
ii)子组分已给出,但为空值时,应由""表示出来
iii)子组件未给出时,可以看作其中不包含任何字符
iv)字段末尾未给出的子组件不需要使用分隔符。例如,以下的两个数据字段等同:
^XXX&amp;YYY&amp;&amp;^ and ^XXX&amp;YYY^.
7)if the field definition permits repetition of a field, the repetition separator is used only if more than one occurrence is transmitted.  In such a case, the repetition separator is placed between occurrences.  If three occurrences are transmitted, two repetition separators are used.)
In the example below, two occurrences of telephone number are being sent:
|234-7120~599-1288B1234|
7)如果字段定义中允许字段重复,应使用下面的规则定义,如果不只传输一个事件或放在两个事件中传输时,应使用重复分隔符。(如果传输三个事件,应使用两个重复分隔符。)在下面的例子中,发送两个电话号码事件:
|234-7120~599-1288B1234|]
c)repeat Step 1b while there are any fields present to be sent.  If all the data fields remaining in the seg-ment definition are not present there is no requirement to include any more delimiters.
c)    给出所要发送的字段时,重复步骤1b。如果保留在段定义中的所有数据字段未给出值时,不需要包含更多定界符。
d)end each segment with an ASCII carriage return character
d)    用回车符的ASCII结束每一个段。
Step 2Repeat Step 1 until all segments have been generated.
步骤2   重复步骤1,直到所有段都产生为止
The following rules apply to receiving HL7 messages and converting their contents to data values:
a)ignore segments, fields, components, subcomponents, and extra repetitions of a field that are present but were not expected
b)treat segments that were expected but are not present as consisting entirely of fields that are not present
c)treat fields and components that are expected but were not included in a segment as not present.
下面的规则适用于接收HL7消息和将内容转化为数据值的情况:
a)给出的段,字段,组分,子组分和特别的重复字段并非所需内容时,可将它们忽略。
b)所需段未给出时,该段可看成是由未给出的字段组成的。
c)所需字段和组分不包括在一个段中时,字段和组分被看作是未给出的。
 楼主| 发表于 2003-5-29 17:31:47 | 显示全部楼层

[讨论]JB的Specification示例讲解

这几天因为论坛放HL7的中英文对照版本,所以没有继续进行讲解了,其实呢讲到这里基本上对于HL7的编码基本上应该有一些概念了,如果有哪里不清楚,大家可以提问,我知道就尽量解答吧
发表于 2003-5-29 20:02:34 | 显示全部楼层

[讨论]JB的Specification示例讲解

能够介绍一下这些定义好的消息是如何传输的,怎样在系统之间,或系统的各个模块之间交换?
发表于 2003-5-30 12:23:29 | 显示全部楼层

[讨论]JB的Specification示例讲解


因为 HL7 没有定义传输方式,厂商们靠协商来定义接口。久而久之就形成和所谓的 de facto industry standard。本文用的是工业界最常用的 socket 为传输媒介,协议 (protocol) 在  "Specification" 里的 "HL7 Format and Interface information“ 节定义了。
对 UNIX BSD socket 或 Windows Winsock2 不了解或有困难者,请看附录 “Appendix B. TCP/IP Stream Socket Fundamentals”。
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

快速回复 返回顶部 返回列表