本文主要介绍基于知行之桥EDI系统,如何将DELFOR的EDIFACT文件逐步映射为自定义的DELFOR XML。
登录到知行之桥 EDI 系统后,进入之前配置好的工作区,我们先简单回顾一下已经搭建好的完整工作流:
第一个是 OFTP 端口,用来和交易伙伴进行通信;第二个是 EDIFACT 端口,配置类型为 EDIFACT 转 XML,负责把收到的 DELFOR 报文转换为标准 XML;第三个是 XML Map 端口,用于将标准 XML 映射为我们自定义的 XML,这也是本节课的重点;最后一个是 File 端口,它会把生成的 DELFOR 自定义 XML 文件上传到指定的共享目录,供业务系统处理。
OFTP端口和EDIFACT端口的配置我们已经在前面的视频中学习过。
交易伙伴将DELFOR报文经OFTP通信连接发给我们,报文随蓝色箭头流EDIFACT端口。
我们在EDIFACT端口的输入界面就可以看到EDI报文。
EDIFACT端口转换出的标准XML在输出界面可见。
可以看到,这个标准 XML 基本上是把 DELFOR 报文的段和元素结构原样展示出来的,对后端业务系统来说不便直接使用。所以我们会通过 XML Map 端口,把标准 XML 映射成自定义 XML,将更清晰、更容易处理的结构传递给后端业务系统。
接下来进入XML Map端口的配置。这里我新创建一个XML Map端口为大家演示。
在 XML Map 端口中,首先需要上传标准 XML 作为来源模板。系统自带了完整的 EDI 国际标准全集对应的标准 XML 文件,我们可以直接使用。点击【模板文件】,搜索 DELFOR,然后选择版本号为 D04A。主机厂的项目规范里一般都会标明具体使用的版本号,按项目要求选择就可以了。
接下来上传我们自己的自定义 XML 作为目标模板,点击【模板文件】→【上传文件】。
模板文件配置后,就可以通过拖拽的方式来配置标准XML与自定义XML之间的映射关系。
在来源模板中,TX-D04A-DELFOR 节点下面就是整个交易集 Transaction Set 的内容,也就是我们实际需要做映射的部分。
我们可以对照上一期视频里讲到的 H 公司 DELFOR 规范层级来看,可以看到 BGM、DTM 等 Header 层的段;再往下,从 GEILoop1 节点开始是 Ship-to 层。

从 LINLoop1 节点开始是 Item 层,而 SCCLoop1 节点开始就是 Schedule 层。

因为我们使用的是包含 EDIFACT 标准全集的来源模板,而实际项目中主机厂的规范只会选用其中的一部分段,所以在映射时只需要按照主机厂提供的规范去做对应的映射即可,有些段是不需要使用的。
接下来我们开始进行数据映射。首先先处理主要的层级节点。我们把来源模板里的 TransactionSet 节点拖拽到目标模板的 DELFOR 根节点上,因为 TransactionSet 对应的是报文中的 UNH 段,后面的内容才是具体的业务数据。
TX-D04A-DELFOR 节点其实是在节点名称中体现了 UNH 段的报文类型和版本号,所以我们把它拖拽到目标模板的 Header 上。每一个 TransactionSet 里只会有一组 Header 层的数据。

再往下,GEILoop1 是 Ship-to 层的起始节点,我们把 GEILoop1 拖拽到目标模板中的 ShipTo 上;同样地,将 LINLoop1 拖拽到 Item 上。
对于Schedule层,在规范中可以看到,QTYLoop中包含主要的要货数量、要货日期信息,且QTYLoop在SCCLoop中是可以出现多次的。所以我们直接将这个QTYLoop2 拖拽到 Schedule 上,从而保障对所有要货信息的映射。

可以看到,这些拖拽操作在右侧都会自动生成 FOREACH 循环。以 GEILoop1 映射到 ShipTo 为例,DELFOR 报文中的每一个 GEILoop1,也就是每一组 我们讲到的Ship-to 层的数据,都会在自定义 XML 中生成一个对应的 ShipTo 节点。
大家记得在映射过程中,随时点击右上角的 保存 按钮。
接下来我们开始映射具体的数据节点,先从第一个段 BGM 段开始。

对照规范可以看到,BGM 的 C002/1001 是一个固定值 241,表示 Delivery Schedule,本身不包含实际的业务数据,所以在我们的自定义 XML 里并没有为它设计对应节点,这个数据元也就不需要映射。
C002/1000 是预测单据类型,我们直接把 1000 节点拖拽到 Header 下的 DocumentType 节点上,这样就建立了 C002/1000 到 DocumentType 的映射关系。
当鼠标悬停在 DocumentType 右侧,点击【编辑节点】,可以看到对应的映射表达式是[xpath("BGM/C002/_1000")],也就是 DocumentType 会从标准 XML 中,读取 BGM 段下 C002/1000 这个数据元的值,其中 xpath 表示 XML 路径,方括号表示取值。
同样地,C106/1004 是预测单据编号,我们将它拖拽到 Header 下的 DocumentNumber 节点上,就建立了 C106/1004 到 DocumentNumber 的映射。

规范中的下一个字段是 DTM 段,其中 C507/2380 表示单据发布时间,我们将它拖拽到 Header 下的 DocumentDate 节点上进行映射。
C507/2005 是固定值 137,用来表示时间含义,C507/2379 是固定值 102,用来表示时间格式,通常不进行映射。
下面我们进入到 SG1,也就是 NADLoop1。[规范中可以看到,NADLoop1 分为两种类型:3055 数据元为 BY 的是买方信息,为 SE 的是卖方信息。

以 BuyerID 为例,我们需要在标准 XML 中找到 3055 为 BY 的那一组NADLoop,然后把其中 NAD 段的 C082/3039 映射到 BuyerID。
第一步,新建一个循环节点,用来遍历报文里的所有 NADLoop1。右击 BuyerID,选择【添加节点】→【添加循环】,循环名称可以自定义,这里我们命名为 NAD_BY,然后将来源模板中的 NADLoop1 节点拖拽到这个循环节点上,这样就为 NADLoop1 建立了一个 FOREACH 循环,此时 BuyerID 就成为这个循环的子节点。右键创建的循环节点只表示FOREACH逻辑,不会实际输出为XML节点。
第二步,配置条件 3035 = BY。这里有两种方式,可以在循环节点 NAD_BY 上配置条件,也可以在 BuyerID 这样的子节点上配置条件。因为 BY 这一组 NADLoop 里有多个字段需要映射,所以我们直接在循环节点上统一配置条件。
鼠标悬停在 NAD_BY 这一行,点击右侧的筛选图标【添加映射条件】→【添加规则】→【输入 XML 值于 NAD/_3035 等于 BY】,然后添加映射条件。此时可以看到出现了 Where condition,表示当 FOREACH 循环遍历到满足条件的 NADLoop 时,才会进入它的子节点进行映射。
第三步,配置具体映射关系,把 NAD/C082/_3039 直接拖拽到 BuyerID 上即可。
当我们需要把满足某个特定条件的数据元映射到自定义 XML 时,就可以按刚刚这个思路来配置,关键是要先确认是否需要循环遍历,以及应该在哪一个层级上进行遍历。

买方 NADLoop 里的 CTA 段中,3413 数据元应当映射到 BuyerINFDepartmentId 上,所以这个字段同样需要放在刚刚设置好的循环和条件下面进行映射。
我们把 BuyerINFDepartmentId 向 NAD_BY 拖拽并向右移动,可以看到界面上会出现淡蓝色的短横线和深蓝色的长横线,这是用来提示节点层级的:深蓝色表示当前拖拽后最终所在的层级,淡蓝色则是周围其他节点的层级参考。
拖拽放置后,可以看到BuyerINFDepartmentId 已经被拖拽成 NAD_BY 的子节点,接下来再把 CTA 段的 3413 节点拖拽到 BuyerINFDepartmentId 上即可。
下面我们再通过一个需要建立循环条件的例子来巩固一下。

在规范中可以看到,COM 段里的 3155 数据元代表联系信息的类型,不同的值对应不同含义,比如邮箱、电话、传真等。我们的需求是:在买方的 NADLoop 中遍历所有 COM 段,根据 3155 的不同,将3148 映射到对应的自定义 XML 节点上。
我们先把 BuyerINFTel 拖拽到 NAD_BY 循环下面,然后按步骤来操作。
第一步,新建一个循环,用来遍历当前买方 NADLoop 里的所有 COM。右击 BuyerINFTel,选择【添加节点】→【添加循环】,循环命名为 NAD_BY_COM,然后将来源模板中的 COM 节点拖拽到这个循环节点上。
这时可以看到 FOREACH 显示的路径是 CTALoop1/COM,相当于是一个双层循环,表示会遍历当前买方 NADLoop1 下的所有 CTALoop1,并进一步遍历这些 CTALoop1 中的所有 COM。
第二步,配置条件。因为每个 COM 段只有一个值需要映射,所以这次我们在子节点上配置条件。在 BuyerINFTel 节点上添加映射条件 C076/_3155 = TE,鼠标悬停后点击右侧【添加映射条件】→【添加规则】→【输入 XML 值于 C076/_3155 等于 TE】,添加映射条件。
第三步,配置映射关系,把 3148 节点直接拖拽到 BuyerINFTel 上即可。
同样的方法,BuyerINFEmail、BuyerINFExtension 等其他买方联系信息节点,也都可以拖拽到 NAD_BY_COM 下,再分别配置对应的条件和映射。
我们来完整梳理一下 BuyerINFTel 这个节点当前的映射逻辑:
从 Header 节点开始进入标准 XML 的 TX-D04A-DELFOR 节点,NAD_BY 循环会在这一层级下遍历所有的 NADLoop1,当遍历到 3055 等于 BY 的NADLoop时进入NAD_BY下的节点映射;
之后,NAD_BY_COM 循环会在这个买方 NADLoop 中继续遍历所有的 CTALoop1/COM 路径。当遍历到 3155 等于 TE 的 COM 段时,就把它的 3148 映射到 BuyerINFTel;
当遍历到 3155 等于 EM 的 COM 段时,则把它的 3148 映射到 BuyerINFEmail,其他联系信息节点也以此类推。
点击展开箭头,就可以更清晰地看到整个映射的层级结构。
ShipTo层的映射与我们刚刚讲解的NADLoop部分类似,可以类比映射。
下面我们进入到 Item 层。

LIN 段的 C212/7140 数据元对应 BuyerItemNumber,直接拖拽到目标节点即可。

PIA 段比较特殊,规范中显示它有两个 C212 数据元,分别对应供应商物料编号(Supplier Article Number)和图纸参考号(Drawing Reference)。这时就需要建立循环节点来处理。
右击 SupplierArticleNumber 节点,添加一个循环节点,我们命名为 Item_PIA,这里循环的对象是 C212,把 PIA 下的 C212 拖拽到 Item_PIA 上。当循环遍历到 7143 数据元为 SA 的 C212 时,就把 7140 映射到 SupplierArticleNumber。
对于 DrawingReference,我们将它向右上方拖拽,使它成为 Item_PIA 的子节点,并设置条件:当遍历到 7143 为 DR 的 C212 时,将 7140 映射到 DrawingReference。
[下面我们再来看 RFFLoop。上个视频中我们讲过,H 公司规范里 Item 层的 RFFLoop 有三种,这里我们以包含序号 25、26 的 RFF 段和 DTM 段的那一种为例。

当时我们解读过,这个 RFF 段的 C506/1154 是交货批次编号(Delivery Schedule Number),DTM 段则是该批次的日期(DeliveryScheduleReleaseDate)。
在映射时,需要先循环遍历每个 RFFLoop,找到 RFF/C506/1153 等于 AAN 的节点,然后对 Delivery Schedule Number 和 DeliveryScheduleReleaseDate 进行映射。
首先,右击 Delivery Schedule Number → 添加节点 → 添加循环,我们命名为 Item_RFF_AAN,然后把左侧对应的 RFFLoop4 节点拖拽到这个循环节点上。
接着配置条件,在循环节点上点击【添加映射条件】→【添加规则】→输入 XML 值 RFF/C506/1153 等于 AAN → 添加映射条件。
最后,将 1154 节点拖拽到 Delivery Schedule Number 上即可。对于 DeliveryScheduleReleaseDate,我们向右上方拖拽,使它成为循环节点的子节点,然后把 DTM 段的 2380 拖拽到它上面完成映射。
其他字段可以按类同的方式自行映射,这里就不一一演示了。
最后补充一个知识点,大家可能已经注意到:在标准 XML 模板中,Header 层我们映射的 NADLoop 末尾带有序号 1,Item 层刚映射的 RFFLoop 后面有序号 4。
这个序号是属于 EDI 国际标准的。
在 EDI 国际标准全集中,每个版本的每个单据都包含几十甚至更多的段,其中一部分被设计为 Loop。为了区分同名的 Loop,国际标准会给每个 Loop 加上序号。例如,Header 层有 NADLoop,ShipTo 层也有 NADLoop,就用序号区分。
项目规范通常是从国际标准中节选的,那么在实施过程中,如何快速确认 Loop 的序号呢?可以使用我们官网的知行EDI 规范查询平台 。
访问到知行软件官网,鼠标悬停在 EDI报文标准这里,点击下拉框中第一个 知行EDI查询平台。这里我们展示了EDI国际标准报文结构。
下滑点击【所有 EDIFACT Release】可以看到各个版本的 EDIFACT,H 公司规范中 DELFOR 是 D04A 版本,点击 D04A ,在搜索 DELFOR,这个就是国际标准 D04A 版本 DELFOR 单据的全集段结构。
对照规范的段结构从上到下查找,就能找到对应的 Loop 序号。例如,Header 层 BGM、DTM 后面就是 SG1,对应 NADLoop1;再往下 SG2 是 GEILoop1,它后面的 NADLoop 就是 NADLoop2。Item 层的 RFFLoop 也可以用同样方法查找。主机厂在节选国际标准时,是不会改变段在标准中的相对位置,所以按照规范段自上而下对应即可。
回到我们的示例工作流,当完成所有字段的映射后,我们可以进行测试,查看各节点的取值是否正确。
在EDIFACT端口(CompanyH_EDIToXML)上传一笔示例DELFOR EDIFACT 文件,在输出页面可以查看到转换出的标准XML。文件随蓝线传输,输入DELFOR的XMLMAP端口(CompanyH_DELFOR_XMLMap)进行映射。我们到XMLMAP端口的输出界面,点击文件名查看映射结果。我们可以开两个窗口对比上传的DELFOR报文和映射结果,检查确认是否所有节点正确映射了。
最后DELFOR 自定义XML根据工作流的设置流转到File端口(CompanyH_File_DELFOR),通过配置的上传目录,发送到指定共享目录,待业务系统处理。
以上就是在知行之桥中实现DELFOR EDIFACT映射为自定义XML的操作过程,大家可以线下进行练习,实现DELFOR的映射。练习过程中有任何问题,欢迎随时联系我们咨询。
注:文案部分图片及内容来源于网络,版权归原创作者所有,如有侵犯到您的权益,请您联系我们进行删除,给您带来困扰,我们深感抱歉。

AS2 认证信息
OFTP 证书
SAP 证书
知行之桥®
