EDI 组装器的工作原理

BizTalk Server执行在 EDI 发送管道 () Microsoft.BizTalk.DefaultPipelines.EDISendPipeline 发送的 EDI 编码交换的大多数处理。 此管道包括用于执行下列处理的 EDI 组装器管道组件:

  • 序列化 EDI 交换,将 XML 编码的消息转换成交换中的 EDI 事务集。

  • 执行 EDI 架构验证、X12 编码消息的跨字段验证(如果已配置)、EDI 结构验证和扩展架构验证(如果此架构是使用具有非 EDI 数据类型的节点自定义的)。

  • 将信封应用于 EDI 消息。

  • 处理为响应 EDI 消息而收到的技术和功能确认,如果配置了解除批处理,则会对这些确认执行解除批处理操作。

将信封应用于传出 EDI 消息

当 EDI 发送管道使用中间 XML 文件生成传出 EDI 消息时,它会根据为接收方协议建立的 EDI 属性将包含交换和组标头的信封应用于该消息。 如果发送管道无法根据发送端口确定接收协议,它将使用回退协议来应用信封。

EdiOverride.OverrideEdiHeader如果上下文属性设置为 true,则 EDI 发送管道将使用 EdiOverride 属性集合中指定的值来构造信封。 如果值尚未出现在集中,则将使用协议属性中的相关 EDI 值。 如果值不存在于 EdiOverride 集或协议属性中,则将使用回退 EDI 协议中的属性。

如果中间 XML 文件具有保留标记或 ReuseEnvelope 上下文属性,则该消息是保留批,将不会对其应用信封应用程序逻辑。

X12 信封值的来源

下表显示了 EDI 发送管道在何处为 X12 信封的每一部分获取其所需的信息:

标头
交换控制标头 (ISA) - 如果 为 true) ,则 EdiOverride.OverrideEdiHeader EdiOverride 上下文属性 (。
- 如果定义了协议,则 ISA 在“协议属性”对话框的单向协议属性中,在 “交换设置” 部分下对不同页面 的定义进行 分段。
- 如果未定义任何协议,则 ISA 在“EDIFACT 回退设置”对话框的“交换设置”部分下对不同页面的定义进行分段。
功能组标头 (GS) - 如果 EdiOverride.OverrideEdiHeader 为 true,则 EdiOverride 上下文属性 ()
- 如果定义了协议,则“ 信封 ”页中的 GS 段定义 (“ 事务集设置” 部分下) “ 协议属性 ”对话框中的单向协议属性
- 如果未定义协议,则“ 信封 ”页中的 GS 段定义 (“ 事务集设置” 部分下的“ X12 回退设置 ”对话框中)

如果定义了协议,则 GS 数据元素的值是根据事务集标识符 (ST1)、版本和目标命名空间的组合确定的。 这些值与“事务集设置”部分下 (“信封”页中的网格进行比较,) 协议属性 (如果) 定义协议,则 (未定义协议) :

- 如果有匹配行,则匹配行中包含的值将用于 GS 标头。
- 如果没有匹配项,但定义了默认行,则从默认行填充除 GS01 之外的所有 GS 数据元素。 基于 ST1 值动态确定 GS01。
- 如果没有匹配的行且没有默认行,则消息将挂起。 注意: 对于与其他组唯一的组,并非所有这些值都可以与其他组的值相同。

如果未定义协议,则从回退协议属性中填充 GS 数据元素。

EDIFACT 信封值的来源

下表显示了 EDI 发送管道在何处为 EDIFACT 信封的每一部分获取其所需的信息:

标头
服务字符串建议 (UNA) - 如果 为 true) ,则 EdiOverride.OverrideEdiHeader EdiOverride 上下文属性 (。
- 如果定义了协议,则字符 集和分隔符 中的 UNA 段定义位于“ 协议属性 ”对话框中的单向协议属性中。
- 如果未定义协议,则 UNA 段定义来自 EDIFACT 回退设置对话框中的字符集和分隔符页。
交换控制标头 (UNB) - 如果 为 true) ,则 EdiOverride.OverrideEdiHeader EdiOverride 上下文属性 (。
- 如果定义了协议,则“协议属性”对话框中交换设置”部分下不同页面的 UNB 分段定义。
- 如果未定义协议,则“EDIFACT 回退设置”对话框中“交换设置”部分下不同页面的 UNB 段定义。
功能组标头 (UNG) - 如果 为 true) ,则 EdiOverride.OverrideEdiHeader EdiOverride 上下文属性 (。
- 如果定义了协议,则“ 信封 ”页 (“ 事务集设置” 部分下) “ 协议属性 ”对话框中的单向协议属性中的 UNG 和 UNH 段定义
- 如果未定义任何协议,则 UNG 和 UNH 段定义从“信封”页 (“事务集设置”部分下) “EDIFACT 回退设置”对话框中的“协议属性”对话框中的单向协议属性

如果定义了协议,则 UNG 数据元素的值是根据消息类型 (UNH2.1)、消息发行版号 (UNH2.3)、分配的代码 (UNH2.5)、版本和目标命名空间的组合确定的。 注意: 对于与其他组唯一的组,并非所有这些值都可以与其他组的值相同。

应用事务集标头和尾部段

要序列化到传出 EDI 交换中的 XML 事务集应当具有事务集标头和尾部。 但是,如果没有事务集标头或尾部,EDI 组装器将处理相应消息。 X12 和 EDIFACT 架构中的事务集标头和尾部段对 XML 事务集而言是可选的。 如果事务没有标头或尾部,则 EDISend 或 AS2EDISend 发送管道中的 EDI 组装器将会向其添加事务集标头和尾部值。 这些值将基于映射或计算。 EDI 组装器将会为交换 XML(保留批)、批处理的事务集 XML 和事务集 XML 执行此操作。

如果映射造成验证错误,则 XML 事务集或交换 XML 将会被挂起,并且在事件查看器中会显示相应的错误,例如长度或数据类型无效,或者控制机构代码无效。

X12 事务集标头和尾部段

对于没有标头和尾部段的 X12 编码的事务集,EDI 组装器会将 ST 和 SE 段设置为以下值:

标头/尾部段
ST01(事务集标识代码) 映射到传入 XML 事务集中的 RootNode 名称的最后三个字符。 例如,映射到“X12_00401_855”中的“855”。 对于具有 TS 标识代码 837P、837D 或 837I 的 HIPAA 声明,使用“837”。
ST02(事务集控制编号) 如果 EdiOveride.OverrideEdiHeader (值为 EdiOverride.ST02 true,则 ) 或映射到“本地主机设置” (ST02) 事务集控制编号的值, (“协议属性”对话框中“单向协议”选项卡的“交换设置”) 下。

无论 应用新 ID 属性的设置如何,都会应用新的或递增的控制编号。
ST03(版本标识符) 映射到来自传入 XML 事务集的 ST03 值。 例如,适用于 5010 HIPAA 820 文档的“005010 X 218”(工资扣缴)。 ST03 对用于验证事务集的架构进行验证。 注意: ST03 对于除 835 以外的所有 HIPAA 版本 5010 事务都是必需的。
SE01(包含的段数) 设置为事务集中的总段数,其中包括 ST 和 SE 段。
SE02(事务集控制编号) 映射到事务集中 ST02 的值。

事务集标头中的其他数据元素(如 ST03)是可选的,因而在生成的段中未赋值。

EDIFACT 事务集标头和尾部段

对于没有标头和尾部段的 EDIFACT 编码的事务集,EDI 组装器会将 UNH 和 UNT 段设置为以下值:

标头/尾部段
UNH01(消息引用控制编号) 如果 EdiOverride.OverrideEdiHeader (的值EdiOverride.UNH1为 true,则 ) 或映射到“本地主机设置”页 (“协议属性”单向协议选项卡的“交换设置”下) 的“引用编号) (UNH1”的值。 无论 应用新 ID 属性的设置如何,都会应用新的或递增的控制编号。
UNH2.1(消息类型) 映射到传入 XML 事务集中的 RootNode 名称的最后六个字符。 例如,映射到“EFACT_D96A_INVOIC”中的“INVOIC”。
UNH2.2(消息版本号) 映射到传入 XML 事务集中的 RootNode 名称的第七个字符。 例如,映射到“EFACT_D96A_INVOIC”中的“D”。
UNH2.3(消息发行版号) 映射到传入 XML 事务集中的 RootNode 名称的第八、第九和第十个字符。 例如,映射到“EFACT_D96A_INVOIC”中的“96A”。
UNH2.4(控制机构代码) 始终映射到字符串“UN”。
UNT01(包含的段数) 设置为事务集中的总段数,其中包括 UNH 和 UNT 段。
UNT02(消息引用控制编号) 映射到“本地主机设置”页 (“协议属性”对话框中“单向协议”选项卡) “交换设置”下的“引用编号 (UNH1 ) 的值

UNH 事务集标头中的其他数据元素(如 UNH3 到 UNH6)是可选的,因而在生成的段中未赋值。 如果这些字段中有任何字段是必需的,则必须将它们设置为传入 XML 事务集中的值。

对传出消息信封的其他处理

EDI 发送管道对传出消息的信封执行以下处理。

控制编号

EDI 发送管道会将交换控制编号、组控制编号和事务集控制(或参考)编号输入到每个传出交换的信封段中。 下表显示了这些编号:

控制编号 X12 字段 EDIFACT 字段
交换控制编号 ISA13 UNB5
组控制编号 GS6 UNG5
事务集控制编号 (X12)

事务集参考编号 (EDIFACT)
ST2 UNH1

BizTalk Server将根据你在交换控制编号 (ISA13) 属性中输入的值范围,为发送的下一个交换设置编号 (“协议属性对话框中的单向协议选项卡的交换设置) 。 它将会为每个后续交换递增此编号,直到达到最大值。

如果使用 EdiOverride 上下文属性指定交换控制编号,则指定的值将用于此交换,并且不会影响在协议中指定的交换控制编号。

注意

仅当选择了 EDIFACT 协议属性的“信封”页中的“应用 UNG 段”属性时,EDIFACT 中的组控制编号才会递增。 第二个字段(参考编号)会递增;前缀和后缀字段不会递增。 仅当选择了 “应用新 ID ”属性时,事务集控制编号才会递增。

注意

在保留批交换中,您可以使用消息收集示例创建自定义交换控制编号。 有关详细信息,请参阅消息扩充示例 (BizTalk Server 示例)

如果未定义协议,则会从回退协议中的相同页获取编号。 发送管道存储了上次使用的控制编号,然后为下一个交换、组和事务集输入递增编号。

注意

如果任何控制编号达到指定范围的最大值,BizTalk Server将引发错误并挂起交换。 可以在 X12 和 EDIFACT 消息的“协议属性”对话框中的“本地主机设置”页中手动重置控制编号,或将BizTalk Server配置为自动重置为下限。

注意

控制编号保存在 BizTalk MessageBox 数据库的 dbo.EdiSequenceNumbers 表中。 您应根据情况从表中清除控制编号或存档控制编号来管理此数据库。

在 EDIFACT 中,控制编号由字母数字值构成。 支持以下格式:

  • 数字(例如“1”)

  • 前缀数字后缀(例如“WA1A”)

  • 前缀数字(例如“AA1”)

  • 数字后缀(例如“1AA”)

    在这些格式中,数字字符可以为“0”到“9”,前缀和后缀字符可以是数字以外的任何字符。 只有编号递增才可以达到最大值。

段计数

对于交换中的每个事务集,EDI 发送管道都将验证事务集中的段计数,对于 X12,事务集中的段计数在 SE01 数据元素中指示,对于 EDIFACT,则在 UNT01 数据元素中指示。 如果相应数据元素的值与实际计数不符,则发送管道将更新此计数以反映实际段数。 不会因为计数错误而拒绝事务集。 计数的更新将记录在事件查看器中的警告中。 这不适用于对保留批的处理。

序列化 EDI 交换过程中的其他步骤

在序列化过程中,EDI 发送管道还执行以下步骤。

序列化转义指示器

在 EDIFACT 消息的序列化过程中,EDI 发送管道会将任何需要的转义指示器插入到 EDI 交换中。 假定路由到发送管道的中间 XML 不包含转义的数据。 例如,如果路由到发送管道的 XML 数据中存在转义指示器,则发送管道将在现有转义指示器前添加另一转义指示器以便对它进行转义。

进行 EDI 验证时,不会验证转义指示器。 EDI 发送管道在计算长度限制时也不会将转义指示器纳入到计算范围内。

添加尾随零以便满足隐式小数要求

如果 EDI 组装器遇到在小数点后的位数不足的数字,它会在小数点后添加尾随零以便满足隐式小数要求。 例如,当数字应采用 N2 格式时,如果 EDI 组装器遇到数字“4.5”,则组装器会将此数字更改为“4.50”。

替换负载数据中的分隔符

如果出站消息中的数据还包含配置为数据、分段或复合元素分隔符的字符,则 EDI 发送管道可以替换这些字符。 例如,如果消息包含 “test*data” 值,并且数据元素分隔符配置为 ‘*’,则这将可能在接收系统上引起解析问题。

可以通过启用将 有效负载中的分隔符替换为 属性并指定替换字符,将 EDI 发送管道配置为替换此字符。 此属性位于“协议属性”对话框的单向协议选项卡中的“字符集和分隔符”页中。

基于触发器字段转换 HIPAA 记录

如果出站文档是 HIPAA 事务集,则 EDI 汇编程序会将包含触发器字段的任何唯一 XML 记录转换为匹配的泛型 EDI 段 (请参阅 HIPAA 架构触发器字段注释) 。 通过删除 “_” 字符之后 XML 记录名称的后缀,可以完成该操作。

例如,N1_PayerIdentification_TS835W1_1000A> 和 <N1_PayeeIdentification_TS835W1_1000B> 元素<都将成为 N1 段。

另请参阅

BizTalk Server 如何发送 EDI 消息