文章
· 八月 8, 2023 阅读大约需 3 分钟

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

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

转换长段字段

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

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

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

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

一旦自定义代码在流中具有字段值,必须使用 EnsLib.HL7.Segment 的以下方法之一将值存储在目标中:StoreFieldStreamRaw()StoreFieldStreamUnescaped()StoreFieldStreamBase64()

这些 Store 方法接受三个参数:要存储在字段中的流、要在其中存储流的字段的 VDoc 路径以及 pRemainder 参数。如果未指定 pRemainder 参数,则删除正在存储的字段之后的所有目标字段。例如:

/// Before: OBX|1|2|3|4|5|6|7
do StoreFieldStreamRaw(stream, "OBX:5")
/// After: OBX|1|2|3|4|<stream> 
/// |6|7 are gone because a remainder was not specified.

如果指定了 pRemainder,则存储的字段之后的所有字段都将替换为 pRemainder 中的内容。

/// Before: OBX|1|2|3|4|5|6|7
do StoreFieldStreamRaw(stream, "OBX:5", "|six|seven")
/// After: OBX|1|2|3|4|<stream>|six|seven

重要提示:一旦调用 Store 方法,目标段就变得不可变,因此它必须是对段进行的最后更改。

以下示例演示如何从源中提取字段并将其存储在目标中。它假设自定义代码在调用 Store 方法之前对 3.6MB+ 字段之后的目标字段进行了编辑;需要这种方法是因为调用 Store 方法后段变得不可变。示例代码不会从源中获取剩余部分并将其存储在目标中,因为这会恢复已对目标长字段之后的字段进行的编辑。因此,您可以从源中获取流字段,但从目标中获取其余部分,并将这两个字段都存储在目标中:

/// previous code makes edits to fields that come after OBX:5 in the target
do source.GetFieldStreamRaw(.stream, "OBX:5")
do target.GetFieldStreamRaw(.dummy, "OBX:5", .rem)
do target.StoreFieldStreamRaw(stream, "OBX:5", rem)
///Segment is now immutable

这样做可以防止对 OBX:5 之后的目标字段所做的编辑被恢复或删除。

讨论 (0)1
登录或注册以继续