EDI目前已广泛应用于电子、物流、汽车、零售等行业。
越来越多的交易伙伴要求建立EDI连接,通过EDI来对接上下游交易伙伴,收发业务单据。
当我们与新的交易伙伴建立EDI连接时,有多种实施方案可供选择,如果企业的单据量较少,预算也不多的话,Excel方案相对来说就比较适合了。
本文章主要给大家讲解当企业自主实施时,如何写将Excel转换为对应报文的代码。
以856发货通知为例:
一.搭建工作流
856属于X12报文,知行之桥系统的X12端口可以将X12报文转成对应的报文格式的XML文件,也可以将报文格式的XML文件转为对应的X12报文,即可以进行报文到XML文件的双向转换。 由X12端口生成的XML文件是固定格式的,所以我们只需要将Excel转换为目标XML文件,然后通过X12端口将该XML文件转换为对应报文即可。
根据上述需求,可搭建如下工作流:
二.使用规范中的示例856报文通过X12端口生成目标XML文件
示例报文可参考如下解析进行阅读:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
ISA*00**00**01*123456789*01*987654321*940613*1025*U*04010*000000333*0*P* GS*PS*005346481*005346481*940613*1025*000000433*X*004010' ST*856*0001' BSN*00*123456*20240111*0810' -123456 发货通知编号 -202401110810 发货通知创建日期 DTM*011*20240115*1115' -202401151115 发货日期 HL*1**S' -S 代表shipment层 MEA*PD*G*1000*KG' -1000 毛重 -KG 重量单位 TD1*PLT71*2' -PLT71 包装类型 -2 包装数量 TD5*B*92*1234*A' -1234 SCAC代码 -A 运输方式 空运 TD3*AF**1234' -AF 设备类型 空运 -1234 空运编号 REF*BM*123456' -123456 提单号 HL*2*1*I' -2 当前层级编号 -1 父层级编号 -I 代表item层 LIN**BP*ABC-12345-123' -ABC-12345-123 买方物料号 SN1**100*EA*1055' -100 出货数量 -EA 数量单位 -1055 迄今为止发货数量 PRF*PO123***20231121' -PO123 订单号 -20231121 订单日期 CLD*2*50***EA' -2 荷载数量 -50 装运的单位数量 REF*SE*2401111' -2401111 序列号 REF*SE*2401112' CTT*2*100' SE*49*000001048' GE*1*000000433' IEA*1*000000333' |
三.根据实际业务需求设计Excel模版
根据客户提供的规范整理对应的Mapping,然后参考Mapping和目标XML文件设计856的Excel模版如下图:
四.写转换代码
拿到目标XML文件,设计好Excel模版,就可以写代码了
1.进入Excel端口的文件目录,可以看到如下几个模版文件
2.选择Sample_XLSX_To_XML_Template.xml文件打开,可以看到如下示例代码
代码前半部分从Excel中取值,后半部分将取到的业务值写入目标XML中。
3.从Excel中进行取值
根据实际需求参考上方示例代码从Excel表中进行取值,如下图所示:
1 2 3 4 5 |
map:shipment_type = "C3" 代表shipment_type取C列3行的值 map:pack_qty = "F6" 代表pack_qty取F列6行的值 map:buyer_item_no = "B11:B*" buyer_item_no可能会有多行,需要当成数组处理,所以从B列11行开始取值 map:number_of_loads = "H11:H*" number_of_loads从H列11行开始取值 |
其余业务字段亦按照如上规律进行取值。
4.将取到的值写入目标XML
首先需要将目标XML放入代码的后半部分,注意只需要用TransactionSet部分代替示例代码中的TransactionSet部分。
然后就可以根据规范或者整理好的Mapping将从Excel模版中取到的值写入目标XML的对应位置。
a.非数组字段取值方式: [data.字段名 | def | trim | xmlencode]
如下图所示:
def、trim等格式化器可在如下网址中查询使用方法,然后根据实际需求使用
注意:在Excel生成报文的代码中,每个字段取值时都必须使用xmlencode格式化器
b.数组字段取值方式[data.字段名#[_index] | def | trim | xmlencode]
如下图所示
对于数组数据,需要对数组字段值进行遍历读取,本代码使用enum关键字对buyer_item_no数组字段进行遍历,通过[_index]拿到下标,然后根据下标取出其它数组字段
1 2 3 4 |
<rsb:enum attr="data.buyer_item_no#"> [data.字段名#[_index] | def | trim | xmlencode] ...... </rsb:enum> |
扩展阅读:enum关键字的使用方法
本项目遍历的条件是该行的buyer_item_no值不为空。
HL01是层级编号,Item的层级编号从2开始递增,所以需要设置一个临时字段,每读取一行item,则自增一下:
1 2 |
<rsb:set attr="item.loop" value="1"/> <rsb:set attr="item.loop" value="[item.loop | add(1)]"/> |
c.以;隔开的序列号字段的取值
先设置一个临时字段取出该行的序列号值,然后通过enum的separator参数取出
扩展阅读:enum关键字的使用方法
d.对于必填字段的检查
1 2 3 4 5 6 7 |
对于必填字段可使用如下代码进行检查: <rsb:check value=""> … <rsb:else> <rsb:throw code="Miss value" desc="Miss "/> </rsb:else> </rsb:check> |
扩展阅读:
e.对于非必填字段,如果没有值则需要跳过整个segment
使用check关键字跳过即可
1 2 3 |
<arc:check attr=""> ... </arc:check> |
f.对于生成的XML文件进行改名
可以将发货通知编号以及当前日期放在文件名上方便有问题时进行检查
g.完整代码见如下附件
5.测试代码
打开Excel端口,选择转换模式为Template,然后上传写好的代码文件
在输入处上传要转换的856Excel文件并发送
从X12端口的输出处即可拿到生成的报文文件