村田EDI项目技术细节分享

此前的文章中完整介绍了对接村田EDI项目的实施过程,详细过程可参考文章:Murata村田EDI项目实施。接下来将针对EDI项目的两个技术细节进行分享,主要介绍在EDI系统中实现状态回传以及将XML文件转换为CSV文件。

状态回传

项目实施过程中,需要明确数据是否已成功发送给交易伙伴。以防止数据漏发、错发给业务带来不必要的损失。

本次EDI项目采用了中间数据库解决方案。status列可以用来标志每行数据的处理状态,如下图所示:status值为0表示新建状态,status值为1表示抓取成功状态,status值为2表示发送成功状态。接下来为大家详细介绍如何根据当前数据处理情况完成状态回传。
新建状态
数据库端口抓取成功状态
AS2端口发送成功状态

  1. 从新建状态到数据库端口抓取成功状态,首先在数据库端口的Output 映射编辑器页面进行设置,如下图所示:
    在这里插入图片描述
    经上述配置后,若数据库端口成功抓取数据,则status值由0更新至1。

  2. 将数据库端口抓取成功状态转换为AS2发送成功状态,需要在数据库端口和AS2端口增加状态回传脚本。

首先,从数据库获取数据后,查看.eml文件(文件路径为EDI系统的安装路径\workspace\Send),其头部有一部分信息为固定值,随着xml文件一起传输。实现状态回传,需要将读取的status和id值写入.eml文件中。其次,在数据库端口的事件-接收后(After Recieve)页面下补充脚本。如下图:
在这里插入图片描述
上图所示,在左下角的红色方框位置写入如下脚本:

<!-- Code goes here -->

<rsb:set attr="edi.handle" value="" />

<rsb:check attr="TemplateName">

<rsb:select attr="TemplateName">

<rsb:case value="po_header">

<rsb:set attr="tmp.table" value="po_header" />

</rsb:case>

<rsb:case value="pos_header">

<rsb:set attr="tmp.table" value="pos_header" />

</rsb:case>

<rsb:case value="pbi_header">

<rsb:set attr="tmp.table" value="pbi_header" />

</rsb:case>

</rsb:select>

</rsb:check>

<rsb:set attr="folder" value="[Direction]"/>

<rsb:set attr="returncontent" value="true"/>

<rsb:call op="portGetFiles" out="out">

<rsb:set attr="input.text" value="[out.content | base64decode]"/>

</rsb:call>

<rsb:try>

<rsb:call op="xmlOpen" input="input">

<rsb:set attr="edi.handle" value="[handle]" />

</rsb:call>

<rsb:set attr="edi.map:id" value="/Items/[tmp.table]/id"/>

<rsb:set attr="edi.map:status" value="/Items/[tmp.table]/status" />

<rsb:call op="xmlDOMGet" in="edi" out="out1">

<rsb:set attr="tmp.id" value="[out1.id]"/>

<rsb:set attr="tmp.status" value="[out1.status]" />

</rsb:call>

<rsb:finally>

<rsb:call op="xmlClose" input="edi"/>

</rsb:finally>

</rsb:try>

<rsb:try>

<rsb:finally>

<rsb:set attr="message.portid" value="[portid]"/>

<rsb:set attr="message.direction" value="[direction]"/>

<rsb:set attr="message.messageid" value="[messageid]"/>

<rsb:set attr="message.header:tableid" value="[tmp.id]"/>

<rsb:set attr="message.header:tablename" value="[tmp.table]"/>

<rsb:set attr="message.header:tablestatus" value="[tmp.status]"/>

<rsb:set attr="message.duplicate" value="Overwrite"/>

<rsb:call op="portSetMessageHeader" in="message"/>

</rsb:finally>

</rsb:try>

最后在AS2端口的事件-发送后(After Send)页面下补充脚本。如下图所示:
在这里插入图片描述
在左下角红色方框位置补充如下代码:

<!-- Code goes here -->

<rsb:set attr="tmp.name" />

<rsb:set attr="tmp.id" />

<rsb:set attr="tmp.status" />

<rsb:call op="portGetMessageInfo" in="_input" out="out">

<rsb:equals attr="out.name" value="tableid">

<rsb:set attr="tmp.id" value="[out.value]"/>

</rsb:equals>

<rsb:equals attr="out.name" value="tablename">

<rsb:set attr="tmp.name" value="[out.value]"/>

</rsb:equals>

<rsb:equals attr="out.name" value="tablestatus">

<rsb:set attr="tmp.status" value="[out.value]"/>

</rsb:equals>

</rsb:call>

<rsb:check attr="tmp.name">

<rsb:check attr="tmp.id">

<rsb:equals attr="tmp.status" value="0">

<rsb:set attr="portIn.portId" value="Murata_Database" />

<rsb:equals attr="ErrorMessage" value="">

<rsb:set attr="update.status" value="2" />

<!-- <rsb:else>

<rsb:set attr="update.status" value="100" />

</rsb:else> -->

</rsb:equals>

<rsb:set attr="file.data">

<Items>

<[tmp.name]>

<id>[tmp.id]</id>

<status>[update.status]</status>

</[tmp.name]>

</Items>

</rsb:set>

<rsb:call op="portGetPorts" in="portIn" out="portOut">

<rsb:set attr="file.file" value="[portOut.sendfolder | pathcombine('update_status_[tmp.name]_[tmp.id]_[update.status].xml')]" />

</rsb:call>

<rsb:call op="fileWrite" in="file">

<rsb:else>

<rsb:throw code="Error fileWrite" desc="file has been moved"/>

</rsb:else>

</rsb:call>

<rsb:else>

<rsb:throw code="tmp.error" desc="template Status is notequals 0"/>

</rsb:else>

</rsb:equals>

<rsb:else>

<rsb:throw code="tmp.error" desc="no template Id"/>

</rsb:else>

</rsb:check>

<rsb:else>

<rsb:throw code="tmp.error" desc="no template Name"/>

</rsb:else>

</rsb:check>

上述脚本添加完毕后,实现功能:当AS2成功发出文件后,status被更新为2,至此完成状态回传。

XML文件转为CSV文件

村田EDI项目需要将POS和PBI两种XML文件转换为CSV文件。接下来介绍XML文件转为CSV文件的流程。

CSV模板如下图所示:
在这里插入图片描述
则需要设计如下图所示的目标文件模板。同一个Items内允许出现多个Item表示多组数据。
在这里插入图片描述

转换分析:生成CSV文件时需要注意,要将XML文件转换为CSV文件,输入的XML必须具有“平面”结构。这意味着,不管根元素如何,XML结构的深度都是2。

如果输入的XML文件层级大于2,则无法转换为CSV格式。此时可以将头部信息放在明细信息下,简化层级结构。

传输过程中,头部信息只需出现一次,而明细信息可重复出现多次。在保证信息完整输出的前提下,将头部信息放在明细信息中既满足了XML转CSV的“平面”结构需求,又不影响业务数据输出的完整性。

村田EDI项目中,由于POS和PBI均需要转换为CSV文件,因此客户希望对这两种CSV文件进行标记。可以通过在第一行第一列增加标题栏进行区分。CSV模板如下图所示:
在这里插入图片描述
修改上述模板,需要在EDI系统中修改XML Map端口中的目标文件。新增一行字段放于表头,不用增加任何的映射关系,即可生成上述CSV文件。

关于EDI更多问题探讨,欢迎私信或评论。

注:文案部分图片及内容来源于网络,版权归原创作者所有,如有侵犯到您的权益,请您联系我们进行删除,给您带来困扰,我们深感抱歉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知行EDI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值