EDIFACT应用开发经验.docx
- 文档编号:151603
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:9
- 大小:25.08KB
EDIFACT应用开发经验.docx
《EDIFACT应用开发经验.docx》由会员分享,可在线阅读,更多相关《EDIFACT应用开发经验.docx(9页珍藏版)》请在冰点文库上搜索。
EDIFACT应用开发经验
∙EDIFACT应用开发经验
Tag:
本作品采用知识共享署名-禁止演绎2.5中国大陆许可协议进行许可。
BLOGBUS上新加了访问统计后,发现我的blog被浏览最多的就是那篇EDIFACT通用语法说明,hehe,看来还是写技术文档有市场。
接下来准备再写两篇,一篇是我几年来开发EDI的一些经验和教训,另一篇会向大家介绍下我最早做的一个EDIFACT语法解析器的主要算法。
最后,如果有空,争取在今年上半年做个小工具,用Python,或者做个Eclipse的插件,或者是UltraEdit之类文本编辑器的插件,能方便查看EDIFACT报文内容,及一些简单的校验功能。
-----------------------------------------------------
EDI在国内主要应用在航运、贸易、金融、工业尤其是制造业、政府机构等等,我目前接触过的就是航运和政府机构,此外还有一些制造业和贸易方面的一些零散应用。
EDI,电子数据交换,其实包括两个部分,电子数据的组织形式(Format)和交换形式(Transmit)。
EDIFACT其实是数据格式的一种,EDI数据的格式也可以是ANSIX12,甚至可以使用自定义的格式。
EDIFACT和X12是最通用的两种,所以也是最常见的,虽然两个标准间有不少差异,但如果和业务系统内其他的数据存在形式——RDBMS、XML、对象或Excel文档之类——去比较,EDIFACT和X12的区别应该算很小很小的了。
而传输一块,EDI传统的基于VAN的传输方式,由于其代价巨大,只有对成本相当不敏感的超大型机构才会考虑,本文的读者估计都会使用Internet来传输EDI数据,譬如用FTP甚至MIME之类的协议,这些传输实现都不会有问题。
所以,EDI接口开发的难度就在于系统内部数据格式到EDI数据格式的转换。
一般来说,EDI报文是用在独立的业务系统间,作为数据交换的一种手段,不会考虑在系统内使用EDIFACT等规范作为数据的存在形式(如果有这种考虑,请重新考虑:
))。
本文的读者(开发人员)多数也是受客户要求,为某个系统增加一个EDI数据交换的接口,才会来看EDIFACT的。
基于此种情况,在开发EDI接口时,客户系统的状况就十分重要了。
对于接收EDI报文的接口,如果客户系统是否值得信任、其生成的报文质量程度如何,对于开发难度有很大影响。
我开发过一个小应用,接收某大公司SAP系统发出的EDIFACT报文,然后解析入库,用以做统计和打印票据。
这样收到的报文质量相当稳定,开发起来就相当简单,上线后运行也十分良好,我负责后续维护的两年中,解析异常的情况不超过万分之一,而且多数都是及其特殊的业务原因造成的,通过人工干预也能迅速解决。
此种情况下,过多的考虑扩展性、数据容错性等等,都没什么意义,可以腾出精力去关注诸如性能之类的问题。
后来,我还开发过EDI业务平台,各种公司通过在平台上收发EDI报文来完成业务操作,此时,客户系统的差异相当大,80%以上的开发成本都在于诸如扩展性、容错性、可跟踪性以及运行管理、监控等非功能性需求上,这种情况下,一定要对项目后期乃至维护期会遇到的困难予以足够的重视,否则很有可能被拖到“焦油坑”里去。
以下是一些具体点的开发建议。
第一个建议就是“不要按EDIFACT标准进行开发”,因为没有人会使用完整的EDIFACT标准。
EDIFACT标准实在太全备了,以至于没有人会使用这个完整的规范,一般每个公司都会有自己裁剪后的版本,如果报文不符合这个规范,即使是符合EDIFACT标准的报文,客户系统一般也不会接纳。
此外,类似的公司规范中,还会有许多客户特殊的业务校验要求,比如,某个位置应该是DTMSegment
DTMDate/time/period C 5
此时,用户可能会要求此处必须有一个DTM+3:
20080101:
102',即开具发票的日期,并指定了日期的格式。
如果你在这里加了一个DTM+14:
200801011211:
203',虽然符合EDIFACT的格式,但客户系统可能就无法接受。
所以,开发EDI应用首先就是要求客户提供他们的EDIFACTSpec或Manual,并在此基础上进行开发。
第二个建议是“不要去开发通用的EDIFACT处理器”,因为正如前面所说,EDIFACT的语法校验并不难,所以开发一个解析器的工作量并不大,绝大多数的工作量在于具体的校验规则的实现(或输入),而这些校验规则往往又和具体的业务相关联。
所以,不要过早考虑扩展性,客户想要一个IFTMBF接口,那就开发一个IFTMBF,客户要一个INVOIC接口,就开发一个INVOIC。
而且,同样是INVOIC,每类客户的要求相差会很大,D01B中的INVOIC一共有232个Segment组成序列,但实际应用中,一般都会被裁到只剩20个Segment左右。
到底剩下哪20个Segment,要看具体的业务领域,如零售业,可能会有较多的货物相关信息如品名、数量,而航运相关的,则可能会有一些地点信息如启运地、目的地,或者是集装箱箱号之类的信息。
一般来说,开发一个EDI接口,面向的客户系统也都会是属于同一个业务领域的,譬如是航运业的EDI应用,那你就只要考虑与航运相关的那20几个Segment就行了。
第三个建议,“不要考虑开发通用的EDI2VO之类的Mapping工具”,直接将报文根据实际对象的构造切割成小块,分别校验、解析。
就像Excel中的二维表,能够比较容易的导入数据库,而对象映射到RDBMS表记录,则困难的多。
EDIFACT报文其实是用来替换古早古早就存在的纸面单证的,几乎所有的报文你都可以找到对应的纸面单证,EDIFACT的结构和纸面单证的结构完全一致,所以,你可以参考对象建模的方法来处理EDIFACT报文。
比如,你拿到一个EDIFACT的INVOIC报文标准,就可以将其视为一张纸面的发票,上面有些付款方、金额、费目、费率、数量、日期等等信息,照此将EDIFACT报文划分成多个块,然后按数据对象的形式进行组织。
例如,一个D01B的INVOIC报文结构如下(红色为修改,灰色为裁去)
0010 UNHMessageheader M 1
0020 BGMBeginningofmessage M 1
0030 DTMDate/time/period M 352
0040 PAIPaymentinstructions C 1
0050 ALIAdditionalinformation C 5
0060 IMDItemdescription C 1
0070 FTXFreetext C 99
0080 LOCPlace/locationidentification C 10
0090XGISGeneralindicator C 10
0100 DGSDangerousgoods C 1
0110 GIRRelatedidentificationnumbers C 10
0120 -----Segmentgroup1 ------------------C 99999-------+
0130 RFFReference M 1 |
0140 DTMDate/time/period C 5 |
0150 GIRRelatedidentificationnumbers C 5 |
0160 LOCPlace/locationidentification C 2 |
0170 MEAMeasurements C 5 |
0180 QTYQuantity C 2 |
0190 FTXFreetext C 5 |
0200 MOAMonetaryamount C 2 |
0210 RTERatedetails C 99----------+
0220 -----Segmentgroup2 ------------------C 99 1--------+
0230 NADNameandaddress M 1 |
0240 LOCPlace/locationidentification C 25 |
0250 FIIFinancialinstitutioninformation C 5 1 |
0260 MOAMonetaryamount C 99 |
|
0270 -----Segmentgroup3 ------------------C 9999-------+|
0280 RFFReference M 1 ||
0290 DTMDate/time/period C 5----------+|
|
0300 -----Segmentgroup4 ------------------C 5----------+|
0310 DOCDocument/messagedetails M 1 ||
0320 DTMDate/time/period C 5----------+|
|
0330 -----Segmentgroup5 ------------------C 5----------+|
0340 CTAContactinformation M 1 ||
0350 COMCommunicationcontact C 5----------++
0360 -----Segmentgroup6 ------------------C 5-----------+
0370 TAXDuty/tax/feedetails M 1 |
0380 MOAMonetaryamount C 1 |
0390 LOCPlace/locationidentification C 5-----------+
0400 -----Segmentgroup7 ------------------C 99----------+
0410 CUXCurrencies M 1 |
0420 DTMDate/time/period C 5-----------+
0430 -----Segmentgroup8 ------------------C 10----------+
0440XPATPaymenttermsbasis M 1 |
0450 DTMDate/time/period C 5 |
0460 PCDPercentagedetails C 1 |
0470 MOAMonetaryamount C 1 |
0480 PAIPaymentinstructions C 1 |
0490 FIIFinancialinstitutioninformation C 1-----------+
0500 -----Segmentgroup9 ------------------C 101--------+
0510 TDTDetailsoftransport M 1 |
0520 TSRTransportservicerequirements C 1 |
|
0530 -----Segmentgroup10------------------C 104-------+|
0540 LOCPlace/locationidentification M 1 ||
0550 DTMDate/time/period C 5----------+|
|
0560 -----Segmentgroup11------------------C 9999-------+|
0570 RFFReference M 1 ||
0580 DTMDate/time/period C 5----------++
0590 -----Segmentgroup12------------------C 5-----------+
0600 TODTermsofdeliveryortransport M 1 |
0610 LOCPlace/locationidentification C 2-----------+
0620 -----Segmentgroup13------------------C 99----------+
0630 EQDEquipmentdetails M 1 |
0640 SELSealnumber C 9-----------+
0650 -----Segmentgroup14------------------C 1000--------+
0660 PACPackage M 1 |
0670 MEAMeasurements C 5 |
0680 EQDEquipmentdetails C 1 |
|
0690 -----Segmentgroup15------------------C 5----------+|
0700 PCIPackageidentification M 1 ||
0710 RFFReference C 1 ||
0720 DTMDate/time/period C 5 ||
0730 GINGoodsidentitynumber C 5----------++
0740 -----Segmentgroup16------------------C 9999--------+
0750 ALCAllowanceorcharge M 1 |
0760 ALIAdditionalinformation C 5 |
0770 FTXFreetext C 1 |
|
0780 -----Segmentgroup17------------------C 51--------+|
0790 RFFReference M 1 ||
0800 DTMDate/time/period C 5----------+|
|
0810 -----Segmentgroup18------------------C 1----------+|
0820 QTYQuantity M 1 ||
0830 RNGRangedetails C 1----------+|
|
0840 -----Segmentgroup19------------------C 1----------+|
0850 PCDPercentagedetails M 1 ||
0860 RNGRangedetails C 1----------+|
|
0870 -----Segmentgroup20------------------C 2----------+|
0880 MOAMonetaryamount M 1 ||
0890 RNGRangedetails C 1 ||
0900 CUXCurrencies C 1 ||
0910 DTMDate/time/period C 1----------+|
|
0920 -----Segmentgroup21------------------C 1----------+|
0930 RTERatedetails
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDIFACT 应用 开发 经验
![提示](https://static.bingdoc.com/images/bang_tan.gif)