文章 姚 鑫 · 八月 29, 2023 4m read

第十三章 ObjectScript - 特殊变量

特殊变量

一些特殊变量提供有关代码运行环境的信息。其中包括以下内容:

  • $HOROLOG,包含操作系统给出的当前进程的日期和时间。请参阅日期和时间值。
  • $USERNAME$ROLES,包含有关当前使用的用户名以及该用户所属角色的信息。
 write "You are logged in as: ", $USERNAME, !, "And you belong to these roles: ",$ROLES
  • $ZVERSION,其中包含标识当前运行的 版本的字符串。

其他包括 $JOB$ZTIMEZONE$IO 和 。

其他变量提供有关代码处理状态的信息。其中包括 、、 和 。

特殊变量

特殊变量 提供对大量实用方法的轻松访问。

特殊变量 是 包的别名,其中包含提供可满足各种需求的类方法的类。引用 中方法的惯用方法是构建使用 变量的引用。例如,以下命令在类中执行 中的 方法:

由于特殊变量的名称不区分大小写(与类及其成员的名称不同),因此以下命令都是等效的:

 DO ##class(%SYSTEM.OBJ).SetFlags("ck")
 DO $System.OBJ.SetFlags("ck")
 DO $SYSTEM.OBJ.SetFlags("ck")
 DO $system.OBJ.SetFlags("ck")
0
0 115
文章 姚 鑫 · 八月 28, 2023 3m read

第十二章 ObjectScript - 命令

命令

本节概述了在 ObjectScript 常用命令。其中包括与其他语言中的命令相似的命令,以及其他语言中没有等效项的其他命令。

命令名称不区分大小写,尽管按照惯例它们在运行文本中显示为全大写。

熟悉的命令

ObjectScript 提供命令来执行熟悉的任务,如下所示:

  • 要定义变量,请使用 SET(如前所示)。

  • 要删除变量,请使用 KILL,如前所示。

  • 要控制逻辑流程,请使用以下命令:

    • IFELSEIFELSE 一起工作
    • ,可以单独使用
    • DO 和 可以一起使用
    • QUIT,也可以返回一个值

    还有其他用于流量控制的命令,但使用频率较低。

  • 要捕获错误,请使用 和 ,它们一起工作。

  • 要写入值,请使用 WRITE。这会将值写入当前设备(例如,终端或文件)。

    在不带参数的情况下使用该命令会写入所有局部变量的值。

    此命令可以使用一小组格式控制代码字符来定位输出。在现有代码中,可能会看到感叹号,它开始一个新行。例如:

  • 要从当前设备(例如终端)读取值,请使用 。

  • 要使用主设备以外的设备,请使用以下命令:

    • 使设备可供使用。
    • 指定一个打开的设备作为当前设备,供 WRITEREAD 使用。
    • 使设备不再可用。
  • 要控制并发,请使用 。请注意,

0
0 121
文章 姚 鑫 · 八月 27, 2023 1m read

第十一章 ObjectScript - 操作符

操作符

ObjectScript 中的运算符优先级严格是从左到右;在表达式中,运算按照它们出现的顺序执行。可以在表达式中使用显式括号来强制某些操作先于其他操作执行。

通常,即使并不严格需要括号,也会使用括号。很有用,因为它使代码的意图更加清晰。

Familiar Operators

ObjectScript 为常见活动提供以下运算符:

  • 数学运算符:加法 (+)、减法 (-)、除法 (/)、乘法 ()、整数除法 ()、模数 () 和求幂 ()
  • 一元运算符:正 () 和负 ()
  • 字符串连接运算符 ()
  • 逻辑比较运算符:等于()、大于(>)、大于等于()、小于()、小于等于()
  • 逻辑补码运算符 ()

可以在任何逻辑值之前以及逻辑比较运算符之前使用它。

  • 组合逻辑值的运算符: ()、 ()

请注意, 还支持其中每种形式的较旧的、效率较低的形式: 是 运算符的一种形式,而 是 的一种形式操作员。可能会在现有代码中看到这些旧的形式。

Unfamiliar Operators

ObjectScript 还包括某些语言中没有等效项的运算符。最重要的如下:

  • 模式匹配运算符 () 测试其左操作数中的字符是否使用其右操作数中的模式。可以指定模式出现的次数、指定替代模式、指定模式嵌套等等。

例如,如果字符串 (

0
0 112
文章 姚 鑫 · 八月 26, 2023 3m read

第十章 ObjectScript - 按值或按引用传递变量

按值或按引用传递变量

调用方法时,可以通过值或引用将变量值传递给该方法。在大多数情况下,这些变量是没有下标的局部变量,因此本节首先讨论这些变量。

与其他编程语言一样, IRIS 具有一个存储位置,其中包含每个局部变量的值。变量的名称充当内存位置的地址。

当将没有下标的局部变量传递给方法时,可以按值传递该变量。这意味着系统会复制该值,从而使原始值不受影响。要传递内存地址,请在参数列表中紧邻变量名称之前放置一个句点。

为了演示这一点,请考虑名为 Test.Parameters 的类中的以下方法:

ClassMethod Square(input As %Integer) As %Integer
{
    set answer=input*input
    set input=input + 10
    return answer
}

假设定义一个变量并将其按值传递给此方法:

TESTNAMESPACE>set myVariable = 5
 
TESTNAMESPACE>write ##class(Test.Parameters).Square(myVariable)
25
TESTNAMESPACE>write myVariable
5
0
0 114
文章 姚 鑫 · 八月 25, 2023 2m read

第九章 ObjectScript - 多维数组

多维数组

ObjectScript 中,任何变量都可以是多维数组(也称为数组)。多维数组通常用于保存一组以某种方式相关的值。 ObjectScript 提供的命令和函数可以方便、快速地访问值。

可能会也可能不会直接使用多维数组,具体取决于使用的系统类和自己的偏好。当需要一个用于存储相关值集的容器时,IRIS 提供了一种基于类的替代方案。请参阅集合类。

Basics

多维数组由任意数量的节点组成,由下标定义。以下示例设置数组的几个节点,然后打印数组的内容:

 set myarray(1)="value A"
 set myarray(2)="value B"
 set myarray(3)="value C"
 zwrite myarray

此示例显示了一个典型的数组。

  • 该数组有一个下标。在这种情况下,下标是整数 123
  • 不需要提前声明数组的结构。
  • 是数组本身的名称。
  • 提供可作用于整个数组或特定节点的命令和函数。例如:

还可以特定节点及其子节点。

  • 以下变体设置名为 ^myglobalGlobal
0
0 115
文章 姚 鑫 · 八月 24, 2023 2m read

第八章 ObjectScript - 变量的可用性和范围

变量的可用性和范围

ObjectScript 支持以下程序流程,(在大多数方面)与其他编程语言支持的程序流程类似:

  1. 用户可能从用户界面调用方法。
  2. 该方法执行一些语句,然后调用另一个方法。
  3. 该方法定义了局部变量 ABC

变量 ABC 在此方法的范围内。它们对于该方法是私有的。

该方法还定义了 。

  1. 第二个方法结束,控制返回到第一个方法。
  2. 第一个方法恢复执行。此方法不能使用不再定义的变量 AB 和 C。它可以使用^D,因为该变量立即保存到数据库中。

变量作用域总结

有几个因素控制变量在定义它的方法之外是否可用。在讨论这些之前,有必要指出以下环境细节:

  • 实例包含多个命名空间,其中包括多个系统命名空间,可能还包括定义的多个命名空间。

命名空间是任何代码运行的环境。

  • 可以在命名空间中同时运行多个进程。在典型的应用程序中,许多进程同时运行。

下表总结了可用变量的位置:

变量可用性,按变量类型细分...
0
0 134
文章 姚 鑫 · 八月 23, 2023 3m read

第七章 ObjectScript - Variables

Variables

ObjectScript 中,有两种变量,按它们保存数据的方式分类:

局部变量可以具有公共或私有范围。

  • 局部变量,在内存中保存数据。

局部变量可以具有公共或私有范围。

  • Global,在数据库中保存数据。这些也称为全局变量。与Global的所有交互都会立即影响数据库。例如,当设置Global值时,该更改会立即影响存储的内容;没有单独的步骤来存储值。同样,当删除时,数据会立即从数据库中删除。

变量名称

变量的命名遵循以下规则:

  • 对于大多数局部变量,第一个字符是字母,其余字符是字母或数字。有效名称包括 和
  • 对于大多数Global,第一个字符始终是脱字号 ()。其余字符是字母、数字或句点。有效名称包括 和

IRIS 还支持一种特殊的变量,称为百分比变量;这些不太常见。百分比变量的名称以百分比字符 (%) 开头。百分比变量的特殊之处在于它们始终是公共的;也就是说,它们对进程中的所有代码都是可见的。这包括调用堆栈中的所有方法和所有过程。

定义百分比变量时,请使用以下规则:

  • 对于局部百分比变量,名称以 或 开头。其他名称保留供系统使用。
  • 对于百分比变量,名称以 或 开头。其他名称保留供系统使用。

变量类型

中的变量是弱动态类型的。

0
0 115
文章 姚 鑫 · 八月 22, 2023 3m read

第六章 ObjectScript - Routine示例

Routine示例

下面显示了一个名为 demoroutine 的示例例程,它是用 ObjectScript 编写的。它包含的过程与上一节示例类中所示的方法执行完全相同的操作。

 ; this is demoroutine 
 write "Use one of the following entry points:"
 write !,"random"
 write !,"input"
 write !,"interesting"
 quit 
 
 //this procedure can be called from outside the routine
random() public {
    set rand=$RANDOM(10)+1        ; rand is an integer in the range 1-10
    write "Your random number: "_rand
    set name=$$getnumbername(rand)
    write !, "Name of this number: "_name
 }

 //this procedure can be called from outside the routine
input() public {
    read "Enter a number from 1 to 10: ", input
    set name=$$getnumbername(input)
    write !, "Name of this number: "_name
 }
 
 //this procedure can be called only from within this routine
getnumbername(number) {
    set name=$CASE(number,1:"one",2:"two",3:"three",
        4:"four",5:"five",6:"six",7:"seven",8:"eight",
        9:"nine",10:"ten",:"other")
    quit name
}

 /* write some interesting values
 this procedure can be called from outside the routine
 */
interesting() public {
    write "Today's date: "_$ZDATE($HOROLOG,3)
    write !,"Your installed version: "_$ZVERSION
    write !,"Your username: "_$USERNAME
    write !,"Your security roles: "_$ROLES  
    }
0
0 105
文章 姚 鑫 · 八月 21, 2023 3m read

第五章 ObjectScript

方法和例程都可以用 ObjectScript 编写,但大多数现代代码都是使用方法编写的。方法包含在类中,这允许将类似的方法分组在一起,在类参考中自动生成文档,以及使用 IRIS 的面向对象功能。

这并不意味着routines 不重要。许多有用的系统实用程序都是作为例程编写的,并且在编译类时会生成例程。

示例类

下面显示了一个名为 的示例类,其中包含用 ObjectScript 编写的方法。此示例使我们有机会了解一些常见的 ObjectScript 命令、运算符和函数,并了解代码在方法内的组织方式。

Class User.DemoClass
{

/// Generate a random number.
/// This method can be called from outside the class.
ClassMethod Random() [ Language = objectscript ]
{
    set rand=$RANDOM(10)+1        ; rand is an integer in the range 1-10
    write "Your random number: "_rand
    set name=..GetNumberName(rand)
    write !, "Name of this number: "_name
}

/// Input a number.
/// This method can be called from outside the class.
ClassMethod Input() [ Language = objectscript ]
{
    read "Enter a number from 1 to 10: ", input
    set name=..GetNumberName(input)
    write !, "Name of this number: "_name
}

/// Given an number, return the name.
/// This method can be called only from within this class.
ClassMethod GetNumberName(number As %Integer) As %Integer [ Language = objectscript, Private ]
{
    set name=$CASE(number,1:"one",2:"two",3:"three",
        4:"four",5:"five",6:"six",7:"seven",8:"eight",
        9:"nine",10:"ten",:"other")
    quit name
}

/// Write some interesting values.
/// This method can be called from outside the class.
ClassMethod Interesting() [ Language = objectscript ]
{
    write "Today's date: "_$ZDATE($HOROLOG,3)
    write !,"Your installed version: "_$ZVERSION
    write !,"Your username: "_$USERNAME
    write !,"Your security roles: "_$ROLES
}

}
0
0 132
文章 姚 鑫 · 八月 20, 2023 2m read

第四章 IRIS 编程简介 - Macros

Macros

ObjectScript 还支持定义替换的宏。定义可以是一个值、整行代码或(使用 ##continue 指令)多行。使用宏来确保一致性。例如:

#define StringMacro "Hello, World!"

write $$$StringMacro

可以在例程中定义宏,并稍后在同一例程中使用它们。更常见的是,在中心位置定义它们。为此,需要创建并使用包含文件。包含文件定义宏并且可以包含其他包含文件。

这些代码元素如何协同工作

可以混合使用 ObjectScriptPythonSQL、类定义、宏、例程等的原因是 不直接使用编写的代码。相反,当编译代码时,系统会生成它使用的较低级别的代码。这是由 引擎使用的 的 代码,以及由 引擎使用的 的 代码。

有多个步骤。无需详细了解这些步骤,但最好记住以下几点:

  • 对于除 方法之外的所有元素,类编译器将类定义和 代码处理为 代码。 代码被处理成PY代码。

在某些情况下,编译器会生成并保存您不应编辑的其他类。例如,当编译定义 服务和 Web 客户端的类时,就会发生这种情况。

类编译器还为每个类生成类描述符。系统代码在运行时使用它。

  • 对于 代码,预处理器(有时称为宏预处理器或 )使用包含文件并替换宏。它还处理例程中的嵌入式 。
0
0 173
文章 姚 鑫 · 八月 19, 2023 1m read

第三章 IRIS 编程简介 - SQL

SQL

IRIS 提供了 SQL 的实现,称为 SQL。可以在方法和例程中使用 。

从 使用

可以使用以下一种或两种方式从 ObjectScript 执行 :

  • 动态 SQL%SQL.Statement%SQL.StatementResult 类),如下例所示:
 SET myquery = "SELECT TOP 5 Name, Title FROM Sample.Employee ORDER BY Salary"
 SET tStatement = ##class(%SQL.Statement).%New()
 SET tStatus = tStatement.%Prepare(myquery)
 SET rset = tStatement.%Execute()
 DO rset.%Display()
 WRITE !,"End of data"

可以在 ObjectScript 方法和例程中使用动态 。

  • 嵌入式,如下例所示:
 &sql(SELECT COUNT(*) INTO :myvar FROM Sample.Employee)
    IF SQLCODE<0 {WRITE "SQLCODE error ",SQLCODE," ",%msg  QUIT}
    ELSEIF SQLCODE=100 {WRITE "Query returns no results"  QUIT}
 WRITE myvar
0
0 168
文章 姚 鑫 · 八月 18, 2023 2m read

第二章 IRIS 编程简介 - 同时使用类和例程

同时使用类和例程

IRIS 中,可以使用例程中的类。例如,下面显示了例程的一部分,其中我们引用了 Sample.Employee 类:

 //get details of random employee and print them
showemployee() public {
    set rand=$RANDOM(10)+1        ; rand is an integer in the range 1-10
    write "Your random number: "_rand
    set employee=##class(Sample.Employee).%OpenId(rand)  
    do employee.PrintEmployee()
    write !,"This employee's salary: "_employee.Salary
      
    }

类似地,方法可以调用例程中的标签。例如,以下代码调用例程中的标签ComputeRaise

Method RaiseSalary() As %Numeric
{
    set newsalary=$$ComputeRaise^employeeutils(..Salary)
    return newsalary
}
0
0 122
文章 姚 鑫 · 八月 17, 2023 2m read

第一章 IRIS 编程简介

简介

IRIS 是一个高性能多模型数据平台,具有内置的通用编程语言 ObjectScript,以及对 Python 的内置支持。

支持多进程并提供并发控制。每个进程都可以直接、高效地访问数据。

在 中,可以根据喜好编写类、例程或它们的组合。在所有情况下,存储的数据最终都包含在称为全局变量的结构中。 IRIS 编程具有以下特点:

  • 类和例程可以互换使用。
  • 类和例程可以互相调用。
  • 类提供面向对象的功能。
  • 数据库存储已集成到 ObjectScriptPython 中。
  • 类可以以简化编程的方式保存数据。如果使用持久类,数据可以同时作为对象、SQL 表和全局变量使用。
  • 可以直接从类或例程访问全局变量,这意味着可以灵活地按照想要的方式存储和访问数据。

可以选择适合需求的方法。

Classes

支持类。可以使用系统类,也可以定义自己的类。

在 中,类可以包含熟悉的类元素,例如属性、方法和参数(在其他类语言中称为常量)。它还可以包含通常不在类中定义的项目,包括触发器、查询和索引。

IRIS 类定义使用类定义语言 (CDL) 来指定类及其成员,例如属性、方法和参数。可以使用 或 在方法内部编写可执行代码。对于每个方法,使用 关键字指定将使用哪种语言编写该方法,如下例所示。

下面显示了一个类定义:

Class Sample.Employee Extends %Persistent
{

/// The employee's name.
Property Name As %String(MAXLEN = 50);

/// The employee's job title.
Property Title As %String(MAXLEN = 50);

/// The employee's current salary.
Property Salary As %Integer(MAXVAL = 100000, MINVAL = 0);

/// This method prints employee information using ObjectScript.
Method PrintEmployee() [ Language = objectscript] 
{
    Write !,"Name: ", ..Name, " Title: ", ..Title
}

}
0
0 411
文章 姚 鑫 · 八月 16, 2023 4m read

第二十四章 参考 - HL7业务服务的设置- 忽略入站 ACK

忽略入站 ACK

如果为 True,业务服务将忽略任何入站 ACK 消息,以避免创建 ACK 反馈循环。

Local Facility Application

以冒号分隔的 代码,表示通过此业务服务接收 消息的设施和应用程序。如果此业务服务创建自己的 ACK,则本地设施应用程序会为 消息提供 代码;否则,该设置将被忽略。

Message Schema Category

应用于传入消息类型以生成完整的 规范的类别。与文档类型名称 () 结合生成 规范,然后使用该规范在给定 模式类别的 部分中查找 。

此设置还可以包含多个以逗号分隔的类型名称,后跟 ,然后是 或完整的 DocType 值,以应用于包含该类型名称的 消息。给定部分类型名称末尾的尾随星号 () 与以该条目开头的任何类型匹配。

HL7 消息对象的 DocType 属性

例如:

请注意,验证或搜索表类索引可能需要 分配。

如果您尚未为 HL7 业务服务准备自定义架构定义,则可以暂时将此字段留空。但是,请勿将其永久留空,除非您还禁用路由过程的验证,否则将自动发生验证错误。请参阅“验证”。

NACK Error Code

控制当处理传入消息时出现错误时此服务生成的 消息的 中的错误代码。默认值为 ,对于消息内容错误返回代码

0
0 171
文章 姚 鑫 · 八月 15, 2023 3m read

第二十三章 参考 - HL7业务服务的设置- DocTypeResolution

DocTypeResolution

指定如何根据 MSH:9 中的消息类型解析 DocType。选择以下选项之一:

  • Standard标准 — 将有效消息架构类别值与在相应架构类别中查找 MSH:9 消息类型值的消息结构名称相结合。这是默认设置。
  • Ignore 9.3 — 与“标准”类似,但如果 有三个或更多部分,则忽略其他部分。标准行为是使用第 3 部分作为类型名称的一部分(如果它没有子部分),因为某些模式包含三部分类型名称。
  • — 与“标准”类似,但如果 具有三个或更多部分,则使用附加部分作为适用模式类别中文档结构的文字名称。请谨慎使用,因为消息到达时可能带有 值,而所选架构类别中不存在其结构。
  • 文字 — 将有效消息架构类别值与解释为消息结构名称的文字 消息类型值相结合。仅与每个消息类型都有相应的结构定义的自定义架构一起使用。

Override Segment Terminator

(仅限 )用作段终止符的以逗号分隔的 控制字符列表。这些值可以是十进制格式或十六进制格式,前面带有 x。例如,要将换行符指定为段终止符,请输入 或 。默认值为回车符,十进制值为 ,十六进制值为 。

Framing

控制 业务服务如何解释传入的 消息数据包。如果不确定使用什么值,请接受

0
0 182
文章 姚 鑫 · 八月 14, 2023 4m read

第二十二章 参考 - HL7业务服务的设置

提供HL7业务服务设置的参考信息。

HL7最重要的设置如下:

  • 池大小-默认值为1,可以支持FIFO(先进先出)处理。在许多情况下,必须按顺序接收多个患者的人口统计更新。例如,许多应用程序在处理订单消息之前需要接收ADT注册消息,在收到结果消息之前必须接收订单消息,等等。
  • 类别—此文本标签允许在配置图中对配置项进行排序。
  • 追加时间戳-(仅限文件)在存档路径中的文件名追加时间戳。
  • 归档路径-(仅限文件和FTP)指定HL7消息归档的位置。
  • 呼叫间隔-在寻找更多输入之前等待的秒数。缺省值是秒。最小值是秒。

Ack Mode

帮助建立发布 HL7 确认消息以响应收到的 消息的格式和约定。对于业务服务,此设置可以具有下表中显示的值之一。

Ack Mode Meaning
Never 不要发回任何 。
`Immediate Commit ACK` 回复消息。如果未指定任何内容,则这是默认值。
Application 如果消息通过验证,则等待来自目标应用程序的 回复消息,并在到达时返回此 ACK。在调用者请求响应并且production 路由引擎未配置为转发来自任何目标的响应的情况下, 将创建并返回 或 对象以返回给调用者。如果验证失败且确认模式为应用程序, 不会联系目标应用程序。
0
0 138
文章 姚 鑫 · 八月 10, 2023 3m read

第十八章 定义 HL7 搜索表

HL7 搜索表类 EnsLib.HL7.SearchTable,自动索引填充的 HL7 属性。

如果需要搜索更多的项,可以创建一个子类。子类继承属性,以及使搜索表工作的基础结构。具体操作请参见在产品中使用虚拟文档中的“定义搜索表类”。

对于, 支持PropType的附加值。除了在产品中使用虚拟文档中列出的类型之外,还可以使用DateTime:HL7

创建搜索表时,不要使用保留的包名;参见开发产品中的“保留包名”。

默认索引的属性

当选择作为搜索表类,使能够在HL7消息中搜索以下虚拟属性。

  • MSHTypeName

消息结构名称。为了创建这个字符串,将HL7消息中的以下值连接起来: - 消息头段

结果是一个格式为ADT_A01, ADT_A12, ORM_O01_2等的消息结构名称。

  • MSHControlID

此消息的唯一标识号。程序从:

将此值解释为区分大小写的字符串。

  • PatientID

此消息的患者标识符。随着HL7标准的发展,这个领域的位置也发生了变化。出于这个原因,在以下所有位置查找此值。这样,无论消息符合哪个HL7模式类别,都可以找到患者标识符: - 患者标识符段

字段`2`(患者外部标识符)

子字段`1`(患者标识符)

- `PID`患者标识符段

字段`3`(患者标识符列表),列表中的所有条目

子字段`1`(患者标识符)

- `PID`患者标识符段

字段`4`(患者标识符列表),列表中的所有条目

子字段`1`(患者标识符)
0
0 129
文章 姚 鑫 · 八月 8, 2023 3m read

第十六章 定义 HL7 的 DTL 数据转换 - 转换长段字段

转换长段字段

DTL 转换使用的 ObjectScript 方法 GetValueAt 将 段字段截断为 。因此,当转换长度超过 的字段时,无法在 编辑器中使用从左到右的拖动操作。例如,如果 字段超过 ,则无法使用 编辑器将源字段拖动到目标,因为它将被截断。同样,如果要转换的字段长度超过 ,则自定义代码不应调用 。

要转换长度超过 的字段,需要使用代码操作将自定义代码添加到转换中。此自定义代码必须在的 中包含以下方法之一,以将字段的值从源读取到流中:GetFieldStreamRaw()、 或

这些 方法采用 个参数:流输出参数、字段的 VDoc 路径和 输出参数。 ``pRemainder` 参数将填充被提取的字段之后的所有字段。例如:

/// Segment:  OBX|1|2|3|4|5|6|7
do GetFieldStreamRaw(.stream, "OBX:5", .rem)
/// rem contains: |6|7

一旦自定义代码在流中具有字段值,必须使用 的以下方法之一将值存储在目标中:、 或 。

这些 方法接受三个参数:要存储在字段中的流、要在其中存储流的字段的 路径以及 pRemainder 参数。

0
0 155
文章 姚 鑫 · 八月 6, 2023 3m read

第十四章 配置Production - 定义 HL7 的路由规则集

HL7 接口创建路由规则集时,目标是根据源消息中找到的段告诉production如何处理源消息。有时找到哪些片段很重要;有时,在这些细分中找到哪些值很重要。

在普通规则集中,每个规则都会向调用该规则集的业务流程返回一个值。在路由规则集中,规则通常将 HL7 消息定向到目的地,并可能在发送之前转换 HL7 消息。

创建规则集时,不要使用保留的包名称

  1. 当使用业务规则向导创建新的 HL7 路由流程时, 会创建一个新的空路由规则集来伴随新的路由流程。其信息表包含以下值:
  • Package Name 包名称 - 包含类的包。例如,如果使用向导将路由进程添加到名为 TestRule.MyTest 的产品中,则关联的路由规则的包名称为:
  • 规则名称 - 在向导中选择的简单路由规则名称,例如:

包名称和规则名称的组合在命名空间内唯一标识规则。任何规则定义的全名是由点 () 连接的包名称和规则名称,如下所示:TestRule.MyRule

配置 路由流程时,该全名(而不是规则名称)是 字段中使用的正确值。业务流程向导会自动进行设置。

  • 路由引擎类 — 向导中的默认路由器类;不要改变它:
  1. 还可以输入其他字段以用于自己的规则报告目的:
0
0 161
文章 姚 鑫 · 八月 5, 2023 3m read

第十三章 配置Production - 添加HL7业务操作

添加HL7业务操作

要从production中发送HL7消息,必须添加HL7业务操作。要将业务操作添加到品中,必须创建它,将其集成到中,并根据需要对其进行配置。以下小节提供详细信息。

创建HL7业务操作

将业务操作添加到中:

  1. Management Portal的“production Configuration”页面(在“Home”页面选择“Interoperability > Configure > production”)中显示production结果。
  2. 在Operations列中,单击Add按钮(加号)。
  3. 单击“。
  4. 从输出类型列表中单击以下其中一个:
  • File
  • FTP

此选择确定此业务操作的主机类。

  1. 对于“操作名称”,键入此业务操作的名称。名称在业务操作中应该是唯一的。不要使用句号或空格。

默认值是此操作所基于的类的名称。 6. 单击。

除了此处使用的 业务操作之外, 还提供两个简单的业务操作: 和 。如果只需要通过传递文件,并且不想将文件解析或格式化为 ,则可以选择其中任何一个。

集成和配置 业务操作

要将新的 业务操作集成到production中,只需将其标识为接收消息的目标即可。为此,必须配置向

1
0 177
文章 姚 鑫 · 八月 4, 2023 3m read

第十二章 配置Production - 添加HL7序列管理器

添加HL7序列管理器

HL7消息可能由于各种原因而乱序,特别是在多个处理器处理它们时。在某些情况下,需要确保按照正确的顺序处理HL7消息。在这种情况下,可以将HL7序列管理器添加到的适当部分。

序列管理器是一个业务流程,它接受传入的HL7消息(可能来自多个源),然后按照消息中的 SequenceNumbers字段指定的顺序将消息转发到目标配置项。

序列管理器可以检测重复的消息和消息之间的时间间隔。它还确定顺序消息之间的时间间隔何时大到足以表明问题。它的灵敏度级别可以使用它的配置设置来调整。

要构建用于消息路由生产的HL7序列管理器,必须创建并配置它,然后将其集成到生产中。本主题将解释每个步骤。

重要:序列管理器是HL7兼容的存储转发应用程序,不支持HL7标准第2章2.节中定义的HL7序列号协议。

创建HL7序列管理器

将序列管理器添加到中:

  1. Management Portal“production Configuration”页面(在“Home”页面选择“Interoperability > Configure > production”)中显示p结果。
  2. 在列中,单击按钮(加号)。
  3. 从 列表中选择 。
  4. 对于名称,键入此业务流程的名称。该名称在业务流程中应该是唯一的。请勿使用句点或空格。
0
0 137
文章 姚 鑫 · 八月 3, 2023 3m read

第十一章 配置Production - 集成和配置 HL7 业务服务

集成和配置 HL7 业务服务

要将新的 HL7 业务服务集成到production中,必须将其与其中继消息的路由流程或业务操作相关联。此外,如果希望业务服务接收非标准消息结构,将需要创建自定义 HL7 架构定义来解析和验证这些消息。去做这个:

  1. 完成创建 HL7 业务服务所需的任何目标配置名称或消息架构类别项的说明。这些项目可能是:
  • HL7 路由进程(针对路由接口)。请参阅下一节。
  • 业务操作(如果设计绕过此接口的路由过程,只是将消息从传入业务服务中继到传出业务操作)。请参阅本章后面的“添加 HL7 业务操作”。
  • 自定义 架构定义,用于解析传入的 消息。
  1. 返回生产配置页面上的图表。选择新的 HL7 业务服务。如果“目标配置名称”和“消息架构类别”字段之前为空,请立即配置它们,然后单击“应用”。
  2. 根据需要配置业务服务的其他设置。详细信息请参见“参考”中的“HL7业务服务设置”。

添加 路由进程

要将 路由流程添加到中,必须创建它,将其集成到产品中,并根据需要对其进行配置。以下小节提供了详细信息。

创建 路由流程

要将 路由流程添加到:

  1. 在管理门户的生产配置页面中显示生产(从主页选择互操作性 > 配置 > Production)。
  2. 在“进程”列中,单击“添加”按钮(加号)。
  3. 单击业务流程选项的HL7 Message Router
0
0 150
文章 姚 鑫 · 八月 2, 2023 3m read

第十章 配置Production

本章介绍如何配置产品以包含 HL7 路由接口。它还描述了如何创建新的 HL7 路由制作。

创建新的 HL7 路由

可以创建一个新的HL7路由产品,如下所示:

  1. Management Portal中,切换到适当的名称空间。

为此,请在标题栏中选择Switch,单击名称空间,然后单击OK

  1. 选择互操作性>列表>产品。
  2. 选择New以调用Production Wizard
  3. 输入“Package Name”、和。
  4. 选择类型并选择。

有一个接口,其元素为:

  • HL7FileService — 一个禁用的HL7文件服务,具有默认设置
  • — 路由进程,带有空路由规则集
  • - 一个禁用的HL7文件操作,具有默认设置

在构建路由产品时,需要创建和配置许多这样的接口。可以从启用这些起始元素、复制它们、重命名它们并修改它们以满足需要开始。在构建接口时,经常会出现这样的情况:在配置一个项目时,必须输入尚未创建的另一个项目的名称。明确的命名约定对于避免混淆至关重要。

除了接口元素之外,产品还提供了几个元素,它们不路由HL7消息,但为产品提供支持功能:

  • 坏消息处理程序——用于验证失败的消息的内置目的地。
  • Ens.Alert
0
0 216
文章 姚 鑫 · 七月 31, 2023 2m read

第八章 HL7 架构和可用工具 - 测试转换

显示段地址

要显示段地址,请将光标悬停在阴影列中的段名称上。工具提示显示以下内容:

  • 在虚拟属性路径中使用的段地址
  • 该段的描述性名称

显示字段地址

要显示字段地址,请将光标悬停在消息结构中的字段上。工具提示显示以下内容:

  • 在虚拟属性路径中使用的字段地址(作为数字)
  • 在虚拟属性路径中使用的字段地址(作为名称)
  • 指示该字段的语法规则的字符。字符可以这样开头:
Symbol Meaning
! (仅限 1) 该字段为必填项;它必须只发生一次。
? 0或)该字段是可选的,但如果出现,则可能只出现一次。
+ ( 次或多次)该字段可以重复一次或多次。
0 次或多次)该字段可以重复零次或多次。
该字段可能存在,并且可能重复,但仅在某些条件下。
n* ( 到 ) 该字段最多重复 次。
是字段中的最大字符数。该字段的每次重复都可以包含此数量的字符。

批量消息

如果字段用尖括号 (<,>) 括起来,则它是指向子文档的链接。单击它可查看该文档的摘要报告和消息数据。

测试转换

要测试转换:

  1. 单击转换文档?。
  2. 对于选择数据转换,选择数据转换。
  3. 对于选择显示选项,请选择以下选项之一:
    • 仅转换结果 — 仅显示转换后的文档。
    • 原始消息和结果一起显示 - 同时显示原始文档和转换后的文档。
0
0 141
文章 姚 鑫 · 七月 30, 2023 3m read

第七章 HL7 架构和可用工具 - 使用 HL7 消息查看器页面

使用 HL7 消息查看器页面

HL7 提供了消息查看器页面。可以使用此页面显示、转换和导出 HL7 消息(外部文件或来自生产消息存档的消息)。

要访问此页面,请选择互操作性 > 互操作 > HL7 v2.x > HL7 v2.x 消息查看器。

选择选项

要指定要显示的文档:

  1. 对于文档源,选择文件、消息标头 ID 或消息正文 ID
  2. 指定要显示的文档:
    • 如果选择“文件”,请使用“浏览”选择文件。对于文件中的文档编号,输入要显示的文档编号。
    • 如果选择了“消息标头 ID”或“消息正文 ID”,请键入要显示的消息标头或消息正文的 ID
  3. 指定如何解析文档。为此,请为文档结构或架构选择以下选项之一:
    • 由业务服务接收 — 使用由业务服务分配的架构。如果选择此选项,请从下拉列表中选择业务服务。 此选项使能够确定特定业务服务将此文档分配到的 。
    • 使用特定架构类别/版本 - 从下拉列表中选择文档类别。
    • 使用特定的 — 以类别:结构格式输入文档结构 (<MessageStructure>) 的名称。解析器使用此文档结构。
    • 使用内容声明的版本:名称 — 使用与文档中声明的文档类型关联的文档结构。
    • 使用对象存储的 DocType — 使用文档正文对象中声明的 。 (此选项不适用于从文件加载的存储文档。)
0
0 285
文章 姚 鑫 · 七月 27, 2023 3m read

第四章 HL7 架构和可用工具 - 查看数据结构

查看数据结构

当单击“数据结构”列中的名称时,InterSystems 会显示该数据结构中的所有字段。这是 HL7 数据结构页面。显示的以下列是最有用的:

  • 组件列列出了可用于访问段内字段的数字。
  • 属性名称列列出了可用于访问段内字段的名称。
  • 单击“数据结构”列中的条目可深入了解详细信息。
  • 单击“代码表”列(如果有)中的条目可查看可在此字段中输入的有效代码。

当单击上面段结构页面中名为 的数据结构项时,将出现以下示例页面。该页面指出类别 2.3 数据结构 XCN 描述“扩展复合 号和名称”并由 个字段组成。其中,有些是简单值,有些是数据结构,有些是代码。

有了这些信息,就可以为消息结构 中的复杂 字段创建虚拟属性路径,如下所示:

PR1grp().PR1:Surgeon.familyname
PR1grp().PR1:Surgeon.degree

查看代码表

当单击“代码表”列中的名称时,它会列出并解释该字段的有效代码。这是 代码表页面。当单击上一节中显示的数据结构页面中名为 2.3:200 的代码表项时,将出现以下示例页面。

上面的示例示出类别代码表描述可以具有值、、、、或的“名称类型”。

这意味着,如果有一条 为 的 消息,则它具有一个可选虚拟属性,路径为 ,可以包含以下值之一:、、、 、 或

0
0 177
文章 姚 鑫 · 七月 26, 2023 3m read

第三章 HL7 架构和可用工具 - 使用 HL7 架构结构页面

使用 HL7 架构结构页面

通过 HL7 架构页面,可以导入和查看 HL7 版本 2 架构规范。要显示此页面,请从主页中选择互操作性 > 互操作 > HL7 v2.x > HL7 v2.x 架构结构。有关使用此页面的一般信息,请参阅在产品中使用虚拟文档中的“使用架构结构页面”。

模式页面提供了一个附加选项卡:消息类型。此选项卡将两个消息结构标识为请求/响应对。

查看文档类型列表

要列出某个类别中的所有文档类型结构,请首先选择该类别,然后单击“ 结构”选项卡。

查看消息结构

要查看消息结构的内部组织,请从 HL7 架构页面上的 DocType 结构选项卡单击其名称(选择互操作性 > 互操作 > HL7 v2.x > HL7 v2.x 架构结构)。 产品使用以下视觉提示和命名约定在“结构”部分中显示消息的段结构。

  • 组成消息结构的段按从上到下的顺序列出。
  • 段名称必须全部大写。
  • 显示每个消息段的三个字母名称:MSHNTEPID 等。该名称指示 消息结构中该位置存在的段类型。包含选项、重复或包含一组其他段的段的名称会在名称中附加特殊字符。
  • 绿色虚线包围可选的段、组或字段。
  • 可以重复的段在段名称后附加了括号。例如,如果段可以重复,则出现。
  • 包含其他段选择的段被视为段的联合。这些联合段的段名称后附加有“
0
0 173
文章 姚 鑫 · 七月 25, 2023 3m read

第二章 HL7 架构和可用工具 - HL7 模式和消息概述

HL7 模式和消息概述

InterSystems 产品可以处理和传递 HL7 消息,而无需使用架构来解析它,但将架构与消息关联允许执行以下操作:

  • 解析消息并访问以下字段值:
    • 数据转换
    • 路由规则
    • 自定义 ObjectScript 代码
  • 验证消息是否符合架构。

每个 HL7 消息均由消息类型标识,该消息类型在 段 MessageType 字段 () 中指定。一些消息类型共享相同的消息结构。例如,在版本中,用于预先接纳患者的消息具有与接纳消息相同的结构。该架构指定 消息具有结构类型 。

为了解析 消息,需要两条信息:

  • 架构类别 — 这是 HL7 版本号,例如 2.3.1 或 ,或者它可能是 产品中定义的自定义架构的类别。 从业务服务消息模式类别设置或从数据转换设置获取模式类别。尽管 消息在 段 字段中包含模式版本号 (),但 不使用此值,因为许多应用程序并未一致地设置此字段。
  • 结构类型 - 从 字段获取消息类型,然后检查架构定义以获取该消息的结构类型。

在某些情况下,使用 子字段来限定消息类型。 3 子字段在 消息中以两种方式使用:1) 作为消息类型的修饰符,或 2) 指定结构类型。

1
0 224
文章 姚 鑫 · 七月 23, 2023 3m read

第六十七章 开发Productions - ObjectScript Productions - Production品及其零部件的生命周期 - BO和适配器的生命周期

BO和适配器的生命周期

IRIS 自动管理每个业务操作的生命周期。

Production Startup

Production生产(或更改特定业务操作的配置)时, IRIS 自动为每个配置的业务操作类(即,为Production定义中列出的每个业务操作)执行以下任务:

  1. 它调用类的 OnProductionStart() 回调方法(如果已定义)。

方法是一种类方法,它为Production配置中列出的每个业务操作类调用一次。业务操作类可以使用此回调来执行它可能需要的任何类范围的初始化。

  1. 它创建一个或多个后台进程来执行业务操作。

后台进程的数量由配置中业务操作的 属性决定。每个后台进程都称为业务操作的实例,并包含业务操作对象的实例。

如果满足以下条件, 只会为业务操作创建后台进程:

  • 业务操作类必须将其INVOCATION类参数设置为。
  • 配置中业务操作的 属性必须设置为 1(否则业务操作被视为已禁用)。已禁用的业务操作仍具有传入消息队列。在启用业务操作之前,不会处理发布到此队列的任何请求。
  • Production配置中业务操作的 属性必须设置为大于 0 的值。

如果配置中业务操作的 属性设置为 1,则

0
0 155
文章 姚 鑫 · 七月 22, 2023 3m read

第六十六章 开发Productions - ObjectScript Productions - Production品及其零部件的生命周期 - 业务流程的生命周期

业务流程的生命周期

每次Production启动时, IRIS都会为Production创建公共参与者池。设置的值确定池中的作业数。

在执行元池中的每个作业中,都有一个.在一个对象中,该对象负责管理业务流程对其作业的使用。在一个时称为执行元。

Production中的业务流程可以共享名为 的公共消息队列。此公共队列是发送到生产中没有自己的专用队列的任何业务流程的所有消息的目标。只要 Actor 有空托管业务流程,它们就会监听 队列。当请求到达 队列时,任何空闲的参与者都可以分配其作业来托管请求中指定的业务流程。 队列上的请求按照接收顺序进行处理。每个连续的请求都由下一个可用的参与者持续声明。

与业务服务和业务操作的生命周期不同,业务流程的 和 方法不会在业务流程启动或停止时被调用。相反,每次业务流程(InProc 或 )处理请求时都会执行这些方法。可以实现业务流程类的 方法,以在开始或业务流程重新启动时执行自定义代码。当停止时,将调用该类的 方法。

公共队列中的生命周期

一个使用公共队列的业务流程的生命周期如下:

0
0 127