EDI 组装器的工作原理

BizTalk Server 执行大多数将发送到 EDI 发送管道的 EDI 编码交换处理(Microsoft.BizTalk.DefaultPipelines.EDISendPipeline)。此管道包括用于执行下列处理的 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)

  • EdiOverride       上下文属性(如果EdiOverride.OverrideEdiHeader为 True)。

  • 如果已经定义了协议,ISA 会分段“协议属性”对话框的单向协议属性中“交换设置”部分下不同页的定义。

  • 如果尚未定义协议,则 ISA 会分段“EDIFACT       回退设置”对话框“交换设置”部分下不同页的定义。

功能组标头 (GS)

  • EdiOverride       上下文属性(如果EdiOverride.OverrideEdiHeader为 True)。

  • 如果已经定义了协议,GS 会分段“协议属性” 对话框单向协议属性中(“事务集设置”部分下)“信封” 页的定义。

  • 如果尚未定义协议,GS 会分段“X12       回退设置”对话框中(“事务集设置”部分下)“信封”页的定义。

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

  • 如果存在匹配的行,则匹配行中包含的值将用于       GS 标头。

  • 如果不存在匹配,但是定义了默认行,则将从默认行中填充所有       GS 数据元素(GS01       除外)。基于       ST1 值动态确定       GS01。

  • 如果没有匹配行,并且不存在默认行,则将挂起该消息。

                                                                                                    便笺

若要使某一组对其他组而言是唯一的,则这些值不能都与其他组的对应值相同。

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

EDIFACT 信封值的来源

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

 

标头

服务字符串建议 (UNA)

  • EdiOverride       上下文属性(如果EdiOverride.OverrideEdiHeader为 True)。

  • 如果已经定义了协议,UNA 会分段“协议属性”对话框单向协议属性中“字符集和分隔符”页的定义。

  • 如果未定义协议,则 UNA 会分段“EDIFACT       回退设置”对话框中“字符集和分隔符”页中的定义。

交换控制标头 (UNB)

  • EdiOverride       上下文属性(如果EdiOverride.OverrideEdiHeader为 True)。

  • 如果已经定义了协议,UNB 会分段“协议属性”对话框单向协议属性中“交换设置”部分下不同页的定义。

  • 如果尚未定义协议,则 UNB 会分段“EDIFACT       回退设置”对话框“交换设置” 部分下不同页的定义。

功能组标头 (UNG)

  • EdiOverride       上下文属性(如果EdiOverride.OverrideEdiHeader为 True)。

  • 如果已经定义了协议,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(事务集控制编号)

EdiOverride.ST02的值(如果EdiOveride.OverrideEdiHeader为 True,)或映射到 “协议属性”对话框单向协议选项卡“本地主机设置”页(“交换设置”下)中“事务集控制编号(ST02)”的值。

不论“应用新 ID”属性的设置如何,都会应用新的或递增的控制编号。

ST03(版本标识符)

映射到来自传入 XML 事务集的 ST03 值。例如,适用于 5010 HIPAA 820 文档的“005010 X 218”(工资扣缴)。ST03 对用于验证事务集的架构进行验证。

便笺

ST03 是所有 HIPAA 版本 5010 事务必需的(835 除外)。

SE01(包含的段数)

设置为事务集中的总段数,其中包括 ST 和 SE 段。

SE02(事务集控制编号)

映射到事务集中 ST02 的值。

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

EDIFACT 事务集标头和尾部段

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

 

标头/尾部段

UNH01(消息引用控制编号)

EdiOverride.UNH1的值(如果EdiOverride.OverrideEdiHeader为 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

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

如果使用 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 段。

转载于:https://blog.51cto.com/6060579/1865050

BizTalkServer 如何发送 EDI 消息(3)相关推荐

  1. 全网最全的Windows下Anaconda2 / Anaconda3里Python语言实现定时发送微信消息给好友或群里(图文详解)...

    不多说,直接上干货! 缘由: (1)最近看到情侣零点送祝福,感觉还是很浪漫的事情,相信有很多人熬夜为了给爱的人送上零点祝福,但是有时等着等着就睡着了或者时间并不是卡的那么准就有点强迫症了,这是也许程序 ...

  2. 微信小程序发送模板消息,php发送模板消息

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. formId 在安卓系统是纯数字,在IOS系统是一串加密字符,如图: 发送模板消息(服务通知)效果图: 前端 ...

  3. Android发送短消息程序的总结

    1.1      准备的基础知识 1.1.1          PendingIntent类 pendingIntent字面意义:等待的,未决定的Intent. 要得到一个pendingIntent对 ...

  4. 微信公众账号开发-发送模板消息

    内容概要 本篇文章主要叙述如何在微信公众帐号上实现"发送模板消息开发"功能.包含json的封装与解析. 何谓模板消息 为了保证用户不受到骚扰,在开发者出现需要主动提醒.通知用户时, ...

  5. 发送延迟消息_微信延迟消息的发送方式

    Part one. 如何使用微信来发送延迟消息呢? Part two. 之前一次偶然的机会,想要定时发送一个消息给朋友,于是产生了微信能否发送定时消息这个念头.去百度了一下,找到了方法.微信是可以定时 ...

  6. delphi编程模拟发送QQ2008消息!

    本文主要讲解的是delphi编程模拟发送QQ消息!即利用外部程序发送QQ消息,代码很少,其实原理就是,找到QQ消息输入框,然后利用sendmessage传送一个文本信息进去,再找到发送按钮,模拟点击按 ...

  7. 004_Queue消息模式发送文本消息

    1. 新建一个名为JMSActiveMQTextMessage的Java项目, 同时拷入相关jar包 2. 相关jar包可以在apache-activemq-5.16.1\lib目录下找到 3. 编辑 ...

  8. php图文消息带代码详细注释,微信发送图文消息代码整理

    微信发送图文消息代码整理 这个就不多说什么了, 下单成功后微信提示图文消息.核心代码如下 if(!empty($openid)){ $wxinfo=curlgetcontents("http ...

  9. CEMAPI实战攻略(四)——发送短消息

    CEMAPI实战攻略(四)--发送短消息 By 吴春雷 QQ:819543772 EMail:wuchunlei@163.com 四.发送短消息 发送短信是一个相对比较简单的过程,之所以拿出来一节来讨 ...

最新文章

  1. nginx gzip配置
  2. oracle表空间,角色,权限,表,索引,序列号,视图,同义词,约束条件,存储函数和过程,常用数据字典,基本数据字典信息,查看VGA信息,维护表空间,创建表空间等信息
  3. 西瓜书学习记录-绪论
  4. P4345 [SHOI2015]超能粒子炮·改
  5. 乒乓球(洛谷-P1042)
  6. go字符串转byte_go语言学习-基本数据类型
  7. html表单用户名,HTML表单
  8. verilog之状态机详细解释(二)
  9. 深圳中专计算机专业排名,深圳十大民办中专排行2019
  10. dede织梦CMS采集过滤规则
  11. webService CXF框架
  12. 415 http请求 hutool_HTTP请求返回415错误码定位解决方法
  13. 请教一个能在WinPE环境下获取系统相关信息的代码
  14. cosc2406数据库辅导assignment
  15. 基于MFC的U盘检测
  16. 相机光学(十一)——镜头
  17. STM32开发(11)----CubeMX配置独立看门狗(IWDG)
  18. 利用FFMPEG实现音频视频升降调
  19. 指针实现函数返回多个值
  20. Python自制音乐下载器,实现听歌自由

热门文章

  1. 数组中冒泡排序、直接选择排序、反序排序原理与区别
  2. Linux 链接详解----静态链接实例分析
  3. Intel汇编语言程序设计学习笔记1
  4. java多线程详解(8)-volatile,Atomic比较
  5. HttpServletRequest和ServletRequest的区别
  6. Wordpress SEO robots
  7. Struts2中Action的动态调用方法
  8. 使用tomcat时,Add and Remove出现异常
  9. Intellij IDEA自定义类注释模板
  10. spark的rdd的含义_Spark里边:到底是什么RDD