3.1 公用的语法规则
3.1.1 服务字符
前面我们介绍了EDI报文根据业务需求可分为批式EDI报文和交互式报文。公用的语法规则意思就是该规则既适用于批式 EDI 报文,又适用于交互式报文。该规则规定了在计算机应用系统之间交换的批式和交互式报文格式的语法规则。
在 EDI 报文中会见到很多服务字符,其中的一部分称为默认服务字符,这些默认服务字符包括成分数据元分隔符、数据元分隔符、释放字符、重复分隔符和段终止符。成分数据元分隔符、数据元分隔符、重复分隔符和段终止符用于描述各种语法结构。释放字符的目的是允许使用另一个被解释为服务字符的字符。在一个交换中,紧随释放字符的字符应不被解释为服务字符。当使用释放字符时,它不被作为数据元值的长度计算。表3-1给出了标准中使用的默认服务字符。
表3-1 默认服务字符
服务串通知(UNA)是另一种服务字符。条件型的服务串通知用于规定在交换中使用的服务字符。当服务字符与默认服务字符不同时,应使用UNA。如果使用默认字符,其用法是可选的。使用UNA时,它应紧挨在交换头段之前出现。
3.1.2 字符总表
在EDI报文中要使用各种字符,下面是对EDI报文所使用的字符表进行的规定。
从交换服务串通知(如果使用)一直到交换头中用于语法标识符的复合数据元S001(语法标识符)应使用GB 1988—1998的基本代码表中规定的字符编码。
交换中所用字符的字符总表应使用交换头中S001“语法标识符”的数据元0001的代码值来标识。所标识的字符总表不适用于对象和(或)加密的数据。
特殊字符总表的默认编码技术应是其相关的字符集规范定义的编码技术。
如果不使用默认选项,应使用交换头中的数据元0133“字符编码,代码型”的代码值。
代码扩充技术(GB 2311—2000)只能在交换头中的复合数据元 S001“语法标识符”之后使用。
代码扩充技术和它的目标图形字符应仅用于字母或字母数字表示的自然语言型(文本型)数据元。该技术不可用于诸如下列所述的任一部分:
● 段标记;
● 服务字符;
● 用数字表示的数据元。
用于指明代码扩充的字符不应作为数据元长度计算,也不应用做服务字符。
在计算数据元长度时,一个图形字符应作为一个字符,不用考虑对其编码所需的字节或8位位组的数目。
3.1.3 语法结构
前面规定了EDI所使用的服务字符和字符总表。本节主要规定EDI的语法结构,它们由大到小包括交换结构、组结构、报文结构、包结构、段组结构、段结构、复合数据元结构以及简单数据元结构。
3.1.3.1 交换结构
一个交换应由一个服务串通知或者一个交换头开始,并且应由一个交换头标识,由一个交换尾终止。交换应至少含有一个组、一个报文或一个包。在一个交换中,可以有多个组或报文和(或)包,其中的每一个都由其头标识,由其尾终止。在一个交换或一个组中的报文可以由一种或多种报文类型组成。
一个交换应仅包含下列内容之一:
● 报文;
● 包;
● 报文和包;
● 含有报文的组;
● 含有包的组;
● 含有报文和包的组。
3.1.3.2 组结构
组是位于交换头和交换尾之间的由一个或多个报文和(或)包组成的条件型结构。组由组头开始并标识,由组尾终止,且至少应含有一个报文或包。
3.1.3.3 报文结构
报文由若干个段的有序集合组成。若干个段可组成段组,每个段的位置、状态和最大出现次数应在报文规范中说明。
报文规范中给出的段应具有必备型或条件型状态中的一种状态。
报文规范应保证在接收时对每一个报文段的无歧义的标识。这种标识可以用段标记(或段标记及UGH和UGT段中的防冲突段组标识)和段在报文中的位置为基准来实现,不应与段的状态或最大出现次数有关。
报文由报文头开始和标识,由报文尾终止,且至少应包含另外一个段。
3.1.3.4 包结构
包应由对象头开始和标识,由对象尾终止,并应含有一个对象。
3.1.3.5 段组结构
段组由段的有序集合组成:一个触发段和至少一个以上的段或段组。触发段应是段组中的第一个段,其状态是必备型的,最大出现次数为1次。报文结构中的每个段组的位置、状态和最大重复次数应在报文规范中说明。
一个段组可含有一个或多个从属段组。当一个段组被包含在另一段组内并直接从属于那个段组时,该从属段组称为子段组,另一段组称为父段组。
报文规范中给出的段组应具有必备型或条件型状态中的一种状态。
3.1.3.6 段结构
段由若干个独立数据元和(或)复合数据元的有序集合组成,如果在段规范中做了规定,其中的每一个成分都允许重复,则段中每个独立数据元或复合数据元的位置、状态和最大出现次数都应在段规范中说明。段由段规范中的段标记开始和标识,除了段标记之外,段内应至少包含一个数据元。
段规范中给出的数据元应具有必备型或条件型状态中的一种状态。
3.1.3.7 段标记结构
段标记是一个简单数据元。
用字母U(如UNB、UIH)开头的段标记应保留给服务段使用。
3.1.3.8 复合数据元结构
复合数据元由两个或多个成分数据元的有序集合组成。复合数据元结构中的每个成分数据元的位置和状态应在复合数据元规范中说明。
复合数据元规范中给出的成分数据元应具有必备型或条件型状态中的一种状态。
3.1.3.9 简单数据元结构
简单数据元含有单个数据元值,可作为独立数据元使用,也可作为成分数据元使用。独立数据元出现在段中的复合数据元之外,成分数据元出现在复合数据元之中。
每个简单数据元的数据元值的表示应在数据元规范中说明。
3.1.4 保留和删除
在制作传送用的报文时,在有些情况下一些段组、段、数据元和数据元值中的字符应该出现,而在另外一些情况下,则应予以删除。在哪些情况下应当保留,而在哪些情况下应当删除呢?为此,UN/CEFACT制定了下面的规则,用户在制作EDI报文时应使用这些规则。
3.1.4.1 应当出现的情况
如果一个简单数据元的值至少含有一个字符,则该简单数据元应出现。
如果一个复合数据元中至少有一个成分数据元出现,则该复合数据元应出现。
如果一个段的段标记出现,则该段应出现。
如果一个段组的触发段出现,则该段组应出现。
3.1.4.2 段组的保留
一个不包含在另一个段组中的必备型的段组应出现。
如果一个必备型的子段组的父段组出现,则该子段组应出现。
必备型的段组出现一次就足以满足必备型的要求。
3.1.4.3 段组的删除
如果删除一个段组,则其所有的段及其所包含的从属段组,无论状态如何,都应被删除。
3.1.4.4 段的保留
段应按报文规范中规定的顺序出现。
段应由段终止符终止。
不在段组中的必备型段应当出现。
如果一个段组出现的话,包含在该段组中的必备型段也应当出现。
必备型的段出现一次就足以满足必备型的要求。
以一个假定的段标记ABC为例,如果它被定义为必备型段,而且只包含条件型数据元,并在传送时这些条件型数据元无数据出现,则它应以“ABC”的形式传送。
3.1.4.5 段的删除
只出现段标记的条件型段应作为整体予以删除。
3.1.4.6 数据元的保留
数据元应按段规范中规定的顺序出现。
在同一段中,相邻的非重复数据元应该用数据元分隔符分开。
在一个段中,同一重复数据元连续出现时应该用重复分隔符分开。
在同一复合数据元中,相邻的成分数据元应该用成分数据元分隔符分开。
如果一个段出现,则该段中的必备型独立数据元应当出现。
如果一个段出现,则该段中的必备型复合数据元应当出现。
如果一个复合数据元出现,则该复合数据元中的必备型成分数据元应当出现。
必备型重复数据元出现一次就足以满足必备型的要求。
3.1.4.7 数据元的删除
在图3-1至图3-6中,“Tag”表示段标记,“DE”表示复合数据元或独立数据元,“CE”表示成分数据元,使用默认的服务字符。
图3-1 段中的非重复复合数据元的删除
1)复合数据元和独立数据元的删除
在同一段中,如果删除了一个非重复复合数据元或独立数据元,并且其后紧随着另一个复合数据元或独立数据元,则其位置应由通常紧随其后的数据元分隔符来指明。如果所有的重复数据元被删除,这一规则也适用(见图3-1)。
如果删除了在段的末端的一个或多个非重复复合数据元或独立数据元,则也应删除通常紧随其后的数据元分隔符(见图3-2)。
图3-2 段末端的非重复复合数据元的删除
2)成分数据元的删除
在同一复合数据元中,如果删除了一个成分数据元,且其后紧随着另一个成分数据元,则其位置应由通常紧随其后的成分数据元分隔符的保留来指明(见图3-3)。
图3-3 复合数据元中的成分数据元的删除
如果删除了在复合数据元的末端的一个或多个成分数据元,则也应删除通常紧随其后的成分数据元分隔符(见图3-4)。
图3-4 复合数据元末端的成分数据元的删除
3)重复数据元的出现的删除
重复数据元的出现的位置可能是很有意义的。例如,为了传送有序数据,在这种情况下,如果重复数据元的一次出现被删除且其后紧随着同一重复数据元的另一次出现,则其位置应由通常紧随其后的重复分隔符的保留来指明(见图3-5)。
图3-5 重复数据元中的出现的删除
如果在重复数据元的末端删除重复数据元的一次或多次出现,则也应删除通常紧随其后的重复分隔符(见图3-6)。
图3-6 重复数据元末端的出现的删除
3.1.5 数据元中的字符的压缩
在设计 EDI 报文时,为了节省报文空间,删除冗余的数据或字符,需要对数据元中的字符进行压缩。在可变长的数据元中,应压缩(即从传送中删除)无意义的字符,保留有意义的字符。
3.1.5.1 无意义的字符
在可变长数字数据元中,应压缩前导零。但是,小数点前的单个的零是允许的。在可变长字母数据元和字母数字数据元中,应压缩尾随的空格。
3.1.5.2 有意义的零
不应压缩有意义的零。单个的零可能是有意义的,例如,指示温度或税率。小数点后尾随的零对于指示精度可能是有意义的。
3.1.5.3 有意义的空格
不应压缩有意义的空格,前导的和嵌入的空格可能是有意义的,不允许仅包含空格的数据元值。
3.1.5.4 数字型数据元值的表示
就本部分而言,数字型数据元值的表示应是ISO 6093(不应使用三元组分隔符)规定的任何一种,但下列情况例外:
● 不使用GB 1988中指定的编码;
● 对可变长数字字段,采用压缩规则;
● 不允许空格字符和加号;
● 允许用点号“.”和逗号“,”表示小数点,在我国,优先使用点号“.”表示小数点;
● 数字数据元值的长度不包括负号(-)、小数点符号(“.”或“,”)、指数符号(E或e)及其指数;
● 传输小数点符号时,其后至少应有一位数字。
允许用点号或逗号来表示单个数值的小数点,小数点的使用示例如下。
允许用(点号): 2 和 2.00 和 0.5 和 .5
不允许用(点号): 1. 和 0. 和 . 允许用(逗号): 2 和 2,00 和 0,5 和 ,5 不允许用(逗号): 1, 和 0, 和 ,
3.1.6 从属性注释
在制作传送用的报文时,有些情况下需要说明报文、段以及复合数据元之间的关系。如何说明这些关系呢?为此,引入了从属性注释的概念,通过它来表述这些关系。
在从属性注释中定义了两个或多个项(项可以是一个段组、 一个段、一个复合数据元、一个独立数据元或一个成分数据元)组成的列表。
任何一个项均可以隶属于一个以上的从属性注释。
3.1.6.1 报文规范中的从属性注释
报文规范中的从属性注释用于描述段之间、段组之间或段与段组之间的关系,这些项应位于同一层级并在同一父结构中。
3.1.6.2 段规范中的从属性注释
段规范中的从属性注释用于描述独立数据元之间、独立数据元与复合数据元之间或复合数据元之间的关系,这些项应在同一段中。
从属性注释不应用于描述独立数据元和成分数据元之间或复合数据元和成分数据元之间的关系。
3.1.6.3 复合数据元规范中的从属性注释
复合数据元规范中的从属性注释用于描述成分数据元之间的关系,这些项应出现在同一复合数据元中。
3.1.6.4 从属性注释表记法
从属性注释由一个从属性标识符和置于括号中并用逗号分开的位置标识符清单组成,如D3(030、060、090)。位置标识符用项在其父项中的位置号来标识该项,从属性标识符标识清单中各项之间的从属性类型。
清单至少应含有两个位置标识符,清单中位置标识符的顺序可以不同于它们的值所隐含表示的顺序。
从属性标识符说明如下所述。
D1 有一项且仅有一项
清单中的各项有一项且仅有一项出现。
D2 全有或全无
如果清单中的某一项出现,则其他各项都应出现。
D3 有一项或多项
清单中的各项至少有一项出现。
D4 有一项或无
清单中的各项最多只有一项出现。
D5 如第一项有,则所有项全有
如果清单中的第一项出现,则其他各项都应该出现,但其他一项或多项的出现并不要求第一项必须出现。
D6 如第一项有,则至少有一项有
如果清单中的第一项出现,则至少再有一项出现,但其他一项或多项的出现并不要求第一项必须出现。
D7 如第一项有,则其他项全无
如果清单中的第一项出现,则其他项都不出现。
3.1.7 段冲突的防止
在传送的报文中,当基于段标记和段位置的方法无法保证报文中的每一个段都能被无歧义地接收时,应在报文规范中使用UGH/UGT段组。
在这种情况下,应使用UGH/UGT段组封装不能被无歧义标识的段组。
在UGH/UGT段组中,UGH段是第一个段,其状态为必备型且最大重复次数为1;UGT段是最后一个段,其状态为必备型且最大重复次数为1。
数据元0087“防冲突段组标识”的值应是报文规范中规定的UGH/UGT段组的段组号。
UGH/UGT段组的最大重复次数为1,其状态应与所封装的段组的状态相同。
在条件型 UGH/UGT 服务段组围绕着报文结构中可能引起冲突的条件组的情况中,当围绕条件组的数据出现时,仅传送UGH/UGT服务段组。
3.1.8 语法发布标识
为了标识语法版本中将来发布的语法,应使用UNB交换头或UIB交互式交换头中的语法标识符(复合数据元S001)。