将 EDI 850 采购订单映射为 CSV
Version 24.3.9111
Version 24.3.9111
将 EDI 850 采购订单映射为 CSV
概述
知行之桥包含强大的数据转换工具,支持将 EDI 文件(X12,EDIFACT 等等)映射为像 CSV 的平面文件(逗号分隔值)。本指南将重点介绍将 X12 850 文件(采购订单)映射为 CSV 格式。在本文中描述的方法也同样适用于其它 EDI 文件的映射,但是映射关系可能不同。
本指南将从介绍知行之桥如何处理 EDI 映射开始,然后逐步完成在应用程序中创建映射工作流的过程。本页底部附有示例的输入(X12 850)和输出(CSV)文件。
视频资源
观看此视频,了解知行之桥中数据转换的概述。
知行之桥中的 EDI 映射
从 XML 转换/转换至 XML
知行之桥使用 XML 作为中间格式,处理和转换数据。在大多数映射项目的第一步是将源文件(本例中为 X12)转换为 XML,大多数映射项目的最后一步是将 XML 转换为目标格式(在本例中为 CSV)。
因为从 XML 转换/转换至 XML 在数据转换中都是十分重要的步骤,知行之桥包括很多专用的端口,用作文件和 XML 的相互转换。本指南将会使用 X12 端口和 CSV 端口。这些端口可以自动地将其各自的文件转换为 XML,反之亦然。使用这些端口,源格式(一个 X12 850 采购订单)和目标格式(有所需列的 CSV 文件)可以建模为 XML。
转换 XML
一旦源格式和目标格式都建模为 XML,那么任务就是将一个 XML 结构转换为另一个。这可以通过强大的 XML Map 端口完成。
XML Map 端口需要一个示例源文件和目标文件,分别代表起始的 XML 结构和最终的 XML 结构。在指定所需文件之后,XML 端口的可视化设计器将会被两个 XML 结构填充。
在 XML Map 端口的可视化设计器中,源结构的元素可以被拖至目标结构的元素上,以此来在两者之间建立映射关系。本映射步骤需要了解源文件中的数据,以便在输出文件中可以包含合适的元素。
XML Map 端口包括 value 格式化器,条件逻辑,甚至是自定义的脚本来在映射过程中操作和计算数据。
一旦映射关系创建,XML Map 端口可以自动将匹配源 XML 结构的文件转换为目标 XML 结构。在本例中,这意味着 X12 850 的 XML 模型将会自动转换为 CSV 文件的 XML 模型。最后一步是采用 CSV 的 XML 模型并将其转换为实际的 CSV 文件,通过 CSV 端口可以轻松完成。
展平一个采购订单
在将 850 采购订单映射为 CSV 时,比较有难度的是需要“展平”此采购订单。单个 850 文件可能包含多个采购订单,且每个采购订单包含不同数量的订单行。相比之下,CSV 文件具有用于储存该数据的静态数的列。
由于 CSV 列的数量无法扩展以适应 850 中不同数量的采购订单,因此 850 无法映射到 CSV 文件中的单个记录(行)。同样,由于 CSV 列的数量无法扩展以容纳采购订单中不同数量的订单行,因此无法将采购订单映射到 CSV 文件中的单个记录(行)。CSV 中的每个记录必须储存一个的采购订单中的单个订单行,因为一个订单行可以表示为一组静态值,而与 850 中的订单行数和采购订单数无关。“展平” 850 指的是采用多层可变结构并将其简化为一组静态订单行。
XML Map 端口使用 Foreach 循环关系的概念在映射过程中展平结构。在这种情况下,应为 850 中的每个订单行创建一个新的 CSV 记录。在 XML Map 端口中建立此关系,就是使用可视化设计器将一个元素(代表订单行中的 ‘PO1’ 元素)拖到另一个元素(代表 CSV 记录/行的元素)上的过程。因此使用 XML Map 端口展平结构非常简单,但是确实需要了解源 XML 和目标 XML 结构,以建立合适的 Foreach 关系。
总结
总结,在知行之桥中创建映射需要这些步骤:
- 使用特定于输入格式的端口(例如 X12 端口)将示例输入文件(例如 X12 850)转换为 XML
- 使用特定于输出格式的端口(例如 CSV 端口)将一个输出示例文件(例如一个具有所需列的 CSV 文件)转换为 XML
- 使用最终的两个 XML 文件分别作为 XML Map 端口的源文件和目标文件
- 在 XML Map 端口的可视化设计器中通过拖拽,在源 XML 结构和目标 XML 结构间建立关系
最终结果是一个自动化工作流,接收 X12 文件作为输入并返回 CSV 文件作为输出。
创建映射工作流
本节包括在知行之桥中创建工作流,将示例 850 采购订单映射为一个平面 CSV 文件的每一步。
步骤 1:X12 端口
映射工作流的第一步是将一个示例文件(X12 850)转换为 XML。
使用 X12 端口完成该步骤,将 X12 文件转换为 XML,并可以选择在转换过程中验证交换头。
在 工作流 界面,将 X12 端口的实例拖拽到画布中。X12 端口实例名称应该包括发送 X12 文件方(例如 Amazon)的名称:
配置 X12 端口
在 X12 端口的设置界面中,转换类型应设为 X12 转换为 XML,当在此模式中操作时,X12 端口可以在转换 X12 文件为 XML 格式时,验证 X12 交换头(确保 X12 文件被发送且被接收方接收)。如果测试指示符属性被设置为 ‘T-Test Data’,那么此验证就不会执行。
如果需要执行交换头部验证,请在转换配置部分和功能组配置部分配置发送方 ID 和接收方 ID 属性。发送方 ID 限定符和接收方 ID 限定符可能需要指定,为 ID 值提供上下文。
对于本文的范围,不需要进一步的配置,但是对于特定用例,可能需要进一步的配置。X12 端口的完整文档可以在这里找到。
上传测试文件
进入到 X12 端口的输入界面,找到 更多 下拉菜单。下拉菜单中有一个上传测试文件选项:
使用该选项,在磁盘上浏览示例 850 文档,其中包含映射所需的 X12 段。如果没有的话可能必须从交易伙伴处获取一个示例 X12 文件。本文底部附有本指南使用的示例 850 文件。
上传测试文件选项指示 X12 端口在内部保存上传的 X12 文档的 XML 模型(在之后的 XML Map 端口将会使用该模型)。
步骤 2:CSV 端口
映射工作流中的下一步是转换一个目标文件(有合适的 CSV 文件)为 XML。这一步通过 CSV 端口来完成,CSV 端口可以实现 XML 和 CSV 的相互转换。
拖拽一个 CSV 端口实例到工作流中。端口 不 应该连接到前一步的 X12 端口。
配置 CSV 端口
CSV 端口唯一需要配置的属性是首行是标题信息。如果 CSV 是从映射工作流中产生的,会在文件顶部有一行列标题名称,那么该设置就应该被启用。完整的 CSV 配置文档可以在这里找到。
上传测试文件
进入到 CSV 端口的输入界面,找到与 X12 端口部分描述相同的上传测试文件选项。使用该选项,在磁盘中浏览示例 CSV 文件,其中包含合适的列(如果启用了首行是标题信息,那么还包括列标题)。本文底部附有本指南使用的示例 CSV 文件。
上传测试文件之后,CSV 端口将会保存已上传文件的 XML 模型。该 XML 模型将会在下一步中使用。
步骤 3:XML Map 端口
现在 X12 端口和 CSV 端口已经生成了源文件和目标文件的 XML 模型,XML Map 端口需要将一个 XML 结构转换为另一个。
拖拽一个 XML Map 端口实例到工作流中,之后将 X12 端口连接到 XML Map 端口,将 XML Map 端口连接到 CSV 端口。
注意:记得在工作流画布的右下角保存更改(关闭所有打开的端口配置以查看蓝色的保存图标)。
配置 XML Map 端口
在 XML Map 端口配置界面中,找到源文件和目标文件的下拉菜单。XML Map 端口应从 X12 端口的测试文件检测 XML 模型,作为可用的源文件,从 CSV 端口的测试文件中检测 XML 模型,作为可用的目标文件。如果两个选项都不可用,请验证测试文件是否已正确上传,端口是否已在工作流画布中连接以及是否通过工作流页面右下角的蓝色保存图标保存了工作流的更改。
一旦源文件和目标文件被指定,XML 可视化设计器将自动使用 X12 850 和 CSV 文件的 XML 结构(和测试值)填充。
理解 XML 结构
在 XML Map 端口中创建正确的映射关系需要理解如何用 XML 表示源和目标结构。
首先,在结构中有两种 XML 元素(节点)。“父”节点由子节点组成但是没有值。’Leaf’ 节点由值组成但是没有子节点。父节点可以使用旁边的 + 或 - 展开(以展示子节点)或收缩(以隐藏子节点)。
在 850 XML 中,每个 EDI loop 和 segment 是一个父节点。每个单独的 EDI element 是一个 Leaf 节点。
在 CSV XML 中,每个在根 Items 元素下的直接子节点叫做 record 元素:它代表了 CSV 中不同的行/记录。每一个 record 元素都是 列 元素:它们每个代表记录的单个字段/列。每个 column 元素都是一个 Leaf 节点。
在 XML Map 端口中,父节点只能被映射到其它的父节点,Leaf 节点只能被映射到其它的 Leaf 节点。当映射 EDI 到 CSV 时主要的难点是选择正确的 loop 或 segment 元素(从 EDI 源)以拖到 record 元素(在 CSV 目标中)。然后,可以将 EDI element 节点拖拽到 列 节点,用 EDI 文件中的特定值填充 CSV。
创建映射
一旦 XML 端口配置源和目标结构,在可视化设计器中拖放节点,即可完成映射。
映射可通过主要的两步来创建:
- 在父节点之间创建 Foreach 循环关系
- 在建立的 Foreach Leaf 节点中映射值
创建 Foreach 循环
Foreach 关系意味着在源中某个元素出现一次,在目标中应该创建一个新的 XML 结构。如果源中的 ElementA 映射到目标中的 ElementB,输入文件中每次出现的 ElementA 都会在输出文件中产生 ElementB(以及所有 ElementB 的子级)。
在本例中(展平一个采购订单节),源 850 中的每个订单行都应在目标 CSV 中产生一条新记录。要创建此关系,将代表一个订单行的源元素拖到一个代表一条 CSV 记录上。本例中,源元素为 PO1Loop1,目标元素为 _850_out:
如上图所示,_850_out 目标元素显示了(绿色)映射到它的源文件的 xpath。每次 XML 解析器在输入文件找到匹配绿色 xpath 元素,一个新的 _850_out 元素就会被添加到输出文件(包括所有 _850_out 元素的子级:CustomerId,PONumber 等等)。
Foreach 循环是此映射所需的唯一循环。其它映射项目可能需要嵌套或其它方式的多个循环。
映射 Leaf 节点
一旦 Foreach 关系建立,Leaf 节点的值可以在循环中被映射。映射 Leaf 节点决定了填充由 Forecah 循环创建的 XML 结构的值。
简单的 Leaf 节点映射
当源中的一个值应被直接插入输入的结果中,从源中拖拽一个 Leaf 节点到目标中的 Leaf 节点,以完成值的映射。例如:在源850中 PO101 存有订单行编号,与目标中的 LineItemNumber 元素对应:
注意这些元素的 xpaths 是相对于 Foreach xpatch 路径的。
某些值不是特定于订单行的,而是从 PO2 元素外部映射的:
- PO1/RestockDate 保存补货日期的日期
- PO1/FulfillmentLatency 保存履行延迟的值
注意这些节点以“..”开头,表明相对的 xpaths “退出” Foreach 映射的 PO1Loop1 元素。
先行断言条件映射
850 文件包含多个 N1Loop1 元素,代表交换中的实体以及实体的角色(收货方,开票方等等)。对于每个 N1Loop1,’N1Loop1/N1/N102’ 元素保存了标识该实体的值(例如实体方名称或 ID),因此这些值必须被映射到输出的 CSV 中,然而每个 N102 元素的 xpath 是相同的(根据实体的角色),因此只靠 N102 的 xpath 去映射正确的值是不够的。
参与方的角色在 N1Loop1/N1/N101 中,因此在将 N102 element 值映射到输出 CSV 之前,映射需要“查看” N101_ element。换句话说,需要将 BillToPartyCode 映射到:
N1Loop1/N1/N102 WHERE N1Loop1/N1/N101 = 'BT'
条件映射可以通过 Lookahead 语法来完成。
首先,将包含该值的元素从源拖拽到目标元素(BillToPartyCode):
然后,将鼠标悬停在映射的 BillToPartyCode 元素上,然后单击数位板图标以打开表达式编辑器:
注意当前被映射的 xpath 是 N1Loop1/N1/N102 且要查找的 xpath 是 N1Loop1/N1/N101。先行断言 语法指定如下:
- 在当前 xpath 中找到要“查找”最接近的父元素(本例中为 N1 元素)
- 在方括号“[]”中指定要查找的(本例中为 N1 元素)元素的 xpath
- 添加一个“=”表达式,来表明该元素要比对的值(在本例中为“BT”)
- 用反斜杠“\”转义方括号,这样就不会被作为 xpath 的一部分而进行求值
最终的 Lookahead 表达式如下:
重复同样的步骤适用于剩下的目标元素。生成的映射已接近完成:
使用表达式编辑器修改和计算
除了 xpath 控制,表达式编辑器支持 格式化器 在一个映射中修改或控制值。ItemTotalCost 元素需要被映射到订单行的总价格中,它不是直接在源元素中可以获得,而是通过行数量与行价格相乘简单计算得出。
作为开始,将行价格 (PO1/PO104) 映射为 ItemTotalCost 元素(因为这是将用于计算值的两个输入之一)。然后打开表达式编辑器:
multiply 格式化器 可以用来将此起始值(每行价格)乘以行数量。格式化器 语法如下:
- 格式化器序列包含在方括号中(就像当前 ItemTotalCost 表达式中的情况一样)
- 格式化器序列工作的顺序为从左到右
- 格式化器序列使用竖线字符分隔(例如“[value | formatter1() | formatter2() | formatter3()]”)
注意:将源节点拖到目标节点上所产生的 xpath() 语法本身就是一种特殊的格式化器。
在 xpath 表达式的右端(和右方括号内)添加一个竖线分隔符,为格式化器创建新空间。在此空间中,可以手动输入 multiply() 格式化器 或导航到表达式编辑器 格式化器,搜索“multiply”,单击合适的 格式化器 将其增加到表达式中:
为了将起始值(行价格)与行数量相乘,需要指定行数量的值作为 multiply 格式化器 的参数。因为需要从输入的850提取该值,需要另一个 xpath 表达式,其 xpath 对应行数量(PO1/PO2):
最终的表达式可以通过将每个行的价格乘以行数量来正确计算总订单行价格。
保存表达式后,映射完成:
保存 XML Map 端口中的改动,完整的工作流就完成了。
示例文件
本指南使用以下的示例数据:
X12 850
ISA*00* *00* *ZZ*AMAZONDS *01*003025392 *160623*1448*U*00401*000000013*0*P*+~
GS*PO*AMAZONDS*ATFDS*20070911*2001*95*X*004010~
ST*850*0003~
BEG*00*DS*TesT0008516**20070805~
CUR*BT*USD~
N1*BT*Amazon.com.kydc,Inc.*92*KYDC~
N1*SF*WHSE*92*WHSE~
N1*ST*Charlie Dinkins~
N3*11254 Main St*Suite 112~
N4*Seattle*WA*98104*US*CC*United States~
TD5**92*UPS_GR_RES****ZZ*RES~
N1*LW*Amber Baker~
N3*123 Anderson Avenue~
N4*Seattle*WA*98103*US~
PO1*1*3*EA*18.04*NT*SK*1617*****BL*1*ZZ*Amazon.com~
PO1*2*2*EA*54.42*NT*SK*4927*****BL*1*ZZ*Amazon.com~
PO1*3*1*EA*18*NT*SK*9876*****BL*1*ZZ*Amazon.com~
CTT*3*6~
SE*15*0003~
GE*1*40~
IEA*1*000000040~
CSV
CustomerId,PONumber,PODate,BillToPartyCode,ShipFromCode,ShipToAddress,ShipToCity,ShipToZIP,LineItemNumber,ItemID,ItemQuantity,ItemPrice,ItemTotalCost
Sir Charles,128F195,20190805,AbRes,W22,2408 Creek St,Springfield,52213,1,BouncyRubberBall,4,2.49,9.96
Sir Charles,128F195,20190805,AbRes,W22,2408 Creek St,Springfield,52213,2,SquishyNerfBall,2,4.29,8.58