3.4 批式EDI语法和服务报告报文(CONTRL报文)
3.4.1 概述
批式EDI语法和服务报告报文的英文缩写为CONTRL,与第2章中的业务报文不同的是,它是一个功能性的报文,一个具有错误指示功能的报文,它是从语法上对所收到的交换、组、报文或包进行确认或拒绝的报文,仅适用于批式EDI。EDI的语法规则中有几个部分都是通过一个功能性的报文来实现技术目的的,这也是为什么把它列入技术层面的原因。
CONTRL 报文的主要功能是:确认或拒绝所收到的交换、组、报文或包并列出其中包含的语法错误或不支持的功能,或仅指出收到交换。
CONTRL报文应被用于EDIFACT语法规则(GB/T 14805),并用于应答按该标准的第1、2、5、6、7、8、9和/或10部分生成的交换。
3.4.2 原则
3.4.2.1 概述
参与方之间应当像商定所支持的报文功能那样商定对所提交和接收的 CONTRL 报文类型的支持,并通过主交换UNB段或交换协议中的确认请求指出对CONTRL报文接收的支持。
EDIFACT交换的发送方(A)可在UNB段中请求接收方(B)做出应答,应答的内容是已收到交换,并且该交换在语法上是正确的,服务段的语义是正确的,接收方支持服务段中请求的功能。另外,该请求也可在交换伙伴间商定的交换协议中规定。
从A到B的交换称为主交换。应答应以一个或两个CONTRL报文的形式从主交换的接收方(B)发往主交换的发送方(A)。
CONTRL报文的功能有:
● 指出接收方根据对主交换语法检查的结果所采取行动;
● 仅指出收到交换。
在第一种情况下,行动(确认或拒绝)指出对接收的整个交换进行语法检查的结果。行动可以针对整个交换,也可以针对交换的某一部分,因此某些报文、包或组可被确认而其他一些报文、包或组可被拒绝。CONTRL报文应指出对主交换的每个部分所采取的行动。
在第二种情况下,只提供交换接收指示。
在对交换或交换的某一部分进行语法检查时,应遵循下列规则:
● EDIFACT语法规则(GB/T 14805)(包括服务段使用规则);
● 所收到的报文类型的语法规则。
CONTRL 报文不适用于报告应用层的错误或针对其所采取的行动,即报告不涉及用户段中的语义信息。因此,通过CONTRL报文指出的确认并不是指已接收/认可报文或包的业务内容。
即使交换或其某一部分包含语法错误,接收方也可选择对它进行确认,并报告这些错误。这些错误是否为非致命错误应由接收方决定。例如,接收方可视情况确认超出了规定最大长度的数据元。
由主交换的接收方生成的含有CONTRL报文的交换应在其UNB段中包含与主交换相同的发送方和接收方标识,只是主交换的发送方变为该交换的接收方,主交换的接收方变为该交换的发送方。
参与方可商定,即使在主交换的UNB段中没有请求确认,也可发送CONTRL报文来拒绝有错的主交换或其某一部分。
另外,不能以组的形式发送CONTRL报文。
3.4.2.2 CONTRL报文和主交换的关系
最多可发送两个CONTRL报文来应答所收到的交换。第一个报文为可选型的,它给出交换接收指示;第二个报文报告对主交换进行语法检查后所采取的行动。UCI 段中的行动代码应指出该报文是第一种类型还是第二种类型。
如果在主交换的UNB段中提出了确认请求,则应发送第二类CONTRL报文来报告对主交换进行语法检查的结果(除非主交换只包含CONTRL报文)。第一类报文是可选型的,如果最终要发送 CONTRL 报文通常应发送第二类 CONTRL 报文(除非主交换只包含CONTRL报文)。第一类CONTRL报文的UCI段不用于报告错误,即当需要通过UCI段报告错误时,只能发送第二类CONTRL报文。
CONTRL报文只报告对一个主交换所采取的行动,即它不涉及多个主交换或其某些部分。
在提供交换接收指示的CONTRL报文中不应使用段组1和段组3。如果主交换包含(由报文和/或包构成的)组,则只用CONTRL报文的段组3。如果主交换中不包含组,则只用CONTRL报文的段组1。
当需要发送UCM段组(段组1或段组4)时,对于每个收到的报文或包最多只能发送一个UCM段组。
所有报告层的顺序应与其对应的主交换中的引用层的顺序相同。
3.4.2.3 行动代码的用法
主交换中与UCI、UCF和UCM段对应的引用层可被确认或拒绝。
CONTRL 报文还提供了确认或拒绝整个交换或组而无须引用其中的报文、包或组的方法。
行动(确认或拒绝)应由 UCI、UCF 和 UCM 段中的行动代码来指出,该代码可表示对对应引用层所采取的行动,在某些情况下,也可表示对更低的引用层所采取的行动。
如果CONTRL报文中包含与主交换中某一引用层对应的段,则称该引用层被显式报告了。如果要显式报告较低的引用层则需确认该引用层以上的所有引用层。
如果对某一引用层所采取的行动是由主交换中更高的引用层所对应的UCI或UCF段来报告的,则称该引用层被隐式报告了。例如,如果由UCI段中的行动代码来表示对整个主交换的拒绝,则其中的组和所有报文或包就被隐式拒绝了。另外,当UCI或UCF段中的行动代码指出对下一层的报文或包的确认并且没有出现拒绝这些报文或包的UCM段时,这些报文或包就被隐式确认了。
在CONTRL报文中,行动代码4或7只用于报告对主交换进行了完全检查之后所采取的行动,行动代码8只用于表示收到交换,这些代码在数据元0083(行动,代码型)中规定。
3.4.2.4 语法错误报告
CONTRL 报文的报告层是通过其中的数据元来报告错误的。这些数据元标识错误在主交换中的位置并指出错误的性质。
每个报告层(即UCI、UCF、UCM、UCS和UCD段)只能报告一个错误。如果由这些段中的某个段在引用层上检查出多个错误,则主交换的接收方应自由选择报告哪个错误。不能发送多个CONTRL报文来报告多个错误,并且对于每个引用层的实例不应出现多个报告层。
即使确认了包含错误的引用层也可报告错误。用户还应该意识到有些语法错误可改变数据的语义,当确认有语义错误的数据时,主交换的接收方应对其后果负责。
建议尽可能精确地标识错误。如果定义了精确的错误代码,就不应再使用通用的和不精确的错误代码。同样,错误的位置也应尽可能使用最低的报告层来尽量精确地标识。
不能把较低的报告层上的错误代码“复制”到较高的报告层。否则可能出现这种情况:在UCD段中用错误代码报告了数据元错误,而在UCM段中又重复出现了相同的错误代码。在这种情况下,标识该错误的错误代码只能出现在UCD段中。该规则适用于所有报告层。
CONTRL 报文的接收方在标识错误的精确位置和性质时通常需要按主交换的传输格式访问主交换。
3.4.2.5 从主交换复制到CONTRL报文的数据元中的错误
CONTRL 报文包含若干个需从主交换复制的必备型数据元。如果主交换中的某个数据元遗失或在语法上是无效的,则无法生成一个在语法上有效的CONTRL报文,因此这样的错误就不应该用 CONTRL 报文而应通过其他方法来报告,除非处理 CONTRL 报文的所有参与方已在交换协议中商定允许将出错的数据元复制到CONTRL报文中。
3.4.2.6 行动的冗余报告
如果在UCI段中使用了行动代码7、同时又发送了UCM或UCF段来确认报文、包或组也是允许的。同样,当UCF段中使用行动代码7时,还可以用冗余的UCM段来确认组中的报文或包。
3.4.2.7 重新传输
决定是否需要重新发送交换、组、报文或包的条件应由交换双方事先商定,不在CONTRL报文规定的范围之内。
3.4.2.8 CONTRL报文的确认或拒绝
不应发送第二类CONTRL报文(确认或拒绝)来应答只包含CONTRL报文的交换, CONTRL报文中的错误应通过其他方式来报告。
如果所应答的交换中包含一个或多个 CONTRL 报文,则应像所收到的交换中没有CONTRL报文那样来生成用做应答的CONTRL报文。
如果交换中既有CONTRL报文又有其他类型的报文,则对该交换中某些部分的隐式确认或拒绝不适用于CONTRL报文。
3.4.3 报文定义
3.4.3.1 数据段说明
阅读本条时,应参考标有必备型、条件型和重复次数的段表。
下列各段中的数据元的有关信息在GB/T 14805.10中给出。
0010 UNH 报文头
开始并唯一标识报文的服务段。批式 EDI 的语法和服务报告报文的报文类型代码是CONTRL。
符合本部分的语法和服务报告报文必须在UNH段的S009中包含下列数据。
数据元 0065 CONTRL 0052 4 0054 1 0051 UN 0020 UCI 交换应答
标识所应答的交换指出收到交换以及对UNA、UNB和UNZ段的确认或拒绝,并标识与这些段有关的错误。当USA、USC、USD、USH、USR、UST或USU段出现在交换层时,该段可标识与这些段有关的错误。另外,该段还可通过行动代码指出对组、报文或包所采取的行动。
主交换的标识应通过将其交换发送方、交换接收方和交换控制参考复制到本段中的相同数据元中的方式来完成。该段还可标识出错或丢失的UNA、UNB、UNZ、USA、USC、USD、USH、USR、UST或USU段。如果没有标识段,则说明错误与整个交换有关。
0030 段组1:UCM-SG2
对UCI段所标识的主交换中的报文或包做出应答,该段组只有在主交换不包含组时方可使用。
0040 UCM,报文/包应答
标识主交换中的报文或包,指出对报文或包的确认或拒绝,并标识与UNH、UNT、UNO和 UNP段有关的错误。当安全段USA、USC、USD、USH、USR、UST或USU段出现在报文或包这一层时,本段还可标识与这些段有关的错误。
报文的标识应通过将其报文标识符和报文参考号复制到本段中相同数据元中的方式来完成。该段还可标识出错或丢失的UNH、UNT、USA、USC、USD、USH、USR、UST或USU段。如果没有标识段,则说明错误与整个报文有关。
包的标识应通过将其参考标识和包参考号复制到本段中相同数据元中的方式来完成。该段还可标识出错或丢失的 UNO、UNP、USA、USC、USD、USH、USR、UST 或 USU段。如果没有标识段,则说明错误与整个包有关。
0050 段组2:UCS_UCD
对段组1中的UCM段所标识的报文中的出错段做出应答。
0060 UCS,段错误指示
标识报文中的段,指出该段有错,并标识与整个段有关的错误。
0070 UCD,数据元错误指示
对段组2中UCS段所标识的段中出错的独立数据元、复合数据元或成分数据元进行标识,并指出错误的性质。
0080 段组3,UCF-SG4
对UCI段所标识的主交换中的组做出应答,本段组只有在主交换包含组时方可使用。
0090 UCF,组应答
标识主交换中的组,指出对UNG和UNE段的确认或拒绝,并标识与这些段有关的错误。当安全段USA、USC、USD、USH、USR、UST或USU出现在组这一层时,本段还可标识与这些段有关的错误。另外,本段还可通过行动代码指出对组中的报文或包所采取的行动。
组的标识应通过将其应用发送方标识、应用接收方标识和组参考号复制到本段中相同数据元的方式来完成。本段还可标识出错或丢失的UNG、UNE、USA、USC、USD、USH、USR、UST或USU段。如果未标识段,则说明错误与整个组有关。
0100 段组4:UCM-SG5
对段组3所标识的组中的报文或包做出应答。
0110 UCM,报文/包应答
标识主交换中的报文或包,指出对报文或包的确认或拒绝,并标识与UNH、UNT、UNO和UNP段有关的错误。当安全段USA、USC、USD、USH、USR、UST或USU出现在报文或包这一层时,本段还可标识与这些段有关的错误。
报文的标识应通过将其报文标识符和报文参考号复制到本段中相同数据元的方式来完成。本段可标识出错或丢失的UNH、UNT、USA、USC、USD、USH、USR、UST或USU段。如果未标识段,则说明错误与整个报文有关。
包的标识应通过将其参考标识和包参考号复制到本段中相同数据元的方式来完成。本段还可标识出错或丢失的UNO、UNP、USA、USC、USD、USH、USR、UST或USU段。如果未标识段,则说明错误与整个包有关。
0120 段组5:UCS-UCD
对段组4中的UCM段所标识的报文中出错的段做出应答。
0130 UCS 段错误指示
标识报文中的段,指出该段有错,并标识与整个段有关的错误。
0140 UCD 数据元错误指示
标识段组5中的UCS段所标识的段中出错的独立数据元、复合数据元或成分数据元,并指出错误的性质。
0150 UNT 报文尾
结束报文、给出报文中段的总数和报文的控制参考号。
3.4.3.2 数据段索引(按段标记的字母顺序排列)
UCD 数据元错误指示 UCF 组应答 UCI 交换应答 UCM 报文/包应答 UCS 段错误指示 UNH 报文头 UNT 报文尾
3.4.3.3 报文结构
表3-2给出了报文结构。
表3-2 段表