概述
包含强大的工具,可以从后端数据库中检索目标数据,并将这些数据映射为出站 EDI 文档(如 X12、EDIFACT 等)。本指南逐步介绍创建 MySQL 数据库到 EDI 工作流的过程,重点是生成 X12 810 发票文档。示例发票遵循 Amazon 所需的语法。 本文中描述的方法和原理也适用于生成其他 EDI 文档,但从数据库中提取的特定数据以及映射值之间的关系可能存在差异。 本指南从如何在 中完成映射的概述开始,然后逐步完成工作流的每一步。请参阅 示例数据 查看本文中使用的数据库结构、输出文件以及生成的 810 文档。中的 EDI 映射
将 MySQL 数据提取为 XML
使用 XML 作为通用格式,以完成数据转换和操作。所有 EDI 映射工作流都涉及将源数据(本例中为数据库数据)和目标数据(本例中为 EDI 文件)转换为 XML。 所有从数据库(或类数据库应用程序)提取数据的 端口都会自动将输出数据格式化为 XML 文件。因此,从数据库中提取的数据可以立即进行映射或转换。本指南使用 MySQL 端口 与 MySQL 数据库交互。提取 810 发票相关的数据
通常会根据采购订单 (PO) 向交易伙伴发送发票。当制造公司收到请求一组制成品的采购订单时,制造公司会以发票响应,以便收取所请求货物的款项。 因此,用来生成发票的数据通常来自之前接收到的采购订单。本文假设传入的采购订单数据会自动插入到数据库中,所以采购订单数据库表保存着与 810 发票相关的数据。为此工作流配置 MySQL 端口时,MySQL 端口将指向保存采购订单数据的表。 采购订单可以包含多个订单行,并且典型的数据库设置会将订单行数据存储在与PurchaseOrders 表分开的 LineItems 表中。LineItems 表具有指向 PurchaseOrders 表的外键,以便识别哪些订单行与哪个采购订单关联,但必须从两个表中提取数据才能检索填充 810 发票所需的全部信息。
定义 SELECT 操作 包含同时从 PurchaseOrders 表和 LineItems 表(具有合适的外键关系)提取数据所需的步骤。
将 EDI 文档表示为 XML
为了将从数据库中提取的 XML 数据映射为 EDI 文档,EDI 文档也必须表示为 XML。 包括许多可以在 EDI 和 XML 格式(X12、EDIFACT 等)之间相互转换的端口。本指南重点介绍映射 X12 文档,因此使用 X12 端口 生成目标 810 文档的 XML 表示。 在创建映射工作流之前,准备一个示例输出文档(例如示例 810)非常重要。该示例文档用于为映射步骤创建 XML 模型。您可以上传自己的示例文档,也可以从内置模板列表中选择。转换 XML 结构
一旦源格式和目标格式都表示为 XML,就可以使用强大的 XML Map 端口 将一个 XML 结构转换为另一个。 XML Map 端口需要示例 源 和 目标 模板文件,分别代表起始和结束的 XML 结构。从数据库中提取的 XML 输出是源文件,而 X12 810 文档的 XML 表示(通过将示例 810 传入 X12 端口生成)是目标文件。 一旦指定源结构和目标结构,XML Map 端口的可视化设计器将填充这两个结构。源结构中的元素可以被拖拽到目标结构的元素上,以在两者之间创建映射关系。此映射步骤需要理解 EDI 结构,这样合适的元素才能包含在输出文件中。 XML Map 端口包括值格式化器、条件逻辑,甚至是自定义脚本来在映射过程中操作和计算数据。有关这些功能的更多信息,请参阅 映射。 一旦映射关系创建,XML Map 端口可以自动将匹配源 XML 结构的文件转换为目标 XML 结构。在本例中,从数据库中提取的数据会自动转换为 X12 810 文档的 XML 模型。最后一步是采用 810 XML 文件的 XML 模型并将其转换为实际的 810 文档,通过 X12 端口可以轻松完成。创建映射工作流
本节包含在 中创建工作流的每一步,以检索数据库输出并将其映射到 810 发票。第 1 步:MySQL 端口
映射工作流的第一步是配置 MySQL 端口,以从 MySQL 数据库中提取相关数据。建立连接
点击导航栏上的 工作流,然后将一个 MySQL 端口实例添加到工作区画布(参见 设计工作流 了解说明)。对于生产环境的工作流,MySQL 端口实例名称应包含目标 MySQL 数据库,以及关于正在从数据库提取或推送的数据的上下文信息(例如 MySQL_Invoice_tradingPartner)。在此工作流中,为简单起见,端口实例名称为 MySQL_Output。

定义 SELECT 操作
建立连接后,使用 Select 操作从数据库中提取相关数据。如 提取 810 发票相关的数据 中所述,数据是从父PurchaseOrders 表和子 LineItems 表中提取的。
在 MySQL 端口 系统设置 页面上,将 操作 设置为 Select。在 Select 配置 部分中,单击 添加 以配置操作。这将显示数据库中的表列表。选择父表(包含 PO 数据)。稍后将添加子表(包含行项目数据)。在此示例中,PO 表为 test_purchase_orders,选择此表将填充配置部分的 列 区域。

Processed,如果记录尚未处理,则保存值 0,如果已处理,则保存值 1。当采购订单被插入表中时,预期 Processed 列会设置为 0。Select 配置应仅在 Processed 列为 0 时提取记录,并在成功提取记录后将该列更新为 1。
要完成这一步,请应用过滤器,仅提取 Processed = 0 的记录。在编辑器的 过滤器 部分,增加一条新规则:
- 将左侧下拉列表设置为要检查的列;本例中为
Processed - 将中间下拉列表设置为逻辑运算符;本例中为
Equals - 将右侧输入设置为要与该列比较的值;本例中为
0

Processed 列来过滤记录,该列还需要被更新,这样记录不会被重复提取。编辑器中的 高级 部分允许指定当成功从数据库中提取行时应更新的列。
在这种情况下,Processed 列应被更新为值 1。

test_purchase_orders 表中提取相应的记录,您必须配置 Select 配置 部分,以提取与每个采购订单相关的行项目。在此示例中,行项目数据保存在 test_po_line_items 表中。
在 Select 配置 中,单击 添加 以添加新的子表。选择 test_po_line_items 表。编辑器会自动更新左侧面板中的表树结构。与第一个表一样,您可以从 test_po_line_items 中选择特定列进行输出;本指南包含所有列。
当 MySQL 端口从 test_purchase_orders 表中提取一个采购订单记录时,它还会尝试从 test_po_line_items 表中提取记录。只有与当前采购订单关联的订单行才应被提取,所以必须在子表上应用 WHERE 约束。
在本例中,test_po_line_items 表中的 PONumber 列对应 test_purchase_orders 表中的 PONumber 列。只有订单行中的 PONumber 与采购订单中的 PONumber 匹配时,记录才应包含在采购订单记录的输出中。
要完成该步骤,请在 test_po_line_items 配置的 过滤器 部分添加一条新规则:
- 将左侧下拉列表设置为子表中需要检查的列;本例中为
PONumber - 将中间下拉列表设置为
Equals - 将右侧输入设置为引用父表:单击下拉箭头并选择
REF(出现$符号表示引用) - 将最后一个输入设置为父表中要比较的列;本例中同样为
PONumber

SELECT 操作输出为 XML
定义 Select 操作后,MySQL 端口将输出表示为 XML。要查看输出的 XML 模型,请点击 </> 代码 按钮:
test_po_line_items 表对应的 XML 子部分会针对每个订单行重复。
现在,该 XML 结构必须映射为表示 X12 810 发票的 XML 结构。然后,生成的映射 XML 可以直接转换为 EDI 文档。
本指南中使用的映射位于 数据库 XML 结构。
第 2 步:X12 端口
X12 端口在映射工作流中充当两个角色。- 它用于生成 810 发票的 XML 表示。这可以通过在 X12 端口的 交易 页面上传示例文件,或使用随 X12 端口提供的内置模板文件来完成。在 X12 端口连接到 XML Map 端口后,上传的模板文件和内置模板文件会显示在 XML Map 端口的 目标 字段中(以
connector://为前缀)。 - 当 X12 端口将 XML Map 端口生成的 XML 转换为 X12 文档时,它将执行工作流中的最后一步。

上传测试文件
如果已经有示例 810 发票文件,上传测试文件 功能可简化为目标 EDI 文档生成 XML 模型的过程。打开 X12 端口 交易 页面,然后单击 更多 > 上传文件:
本指南中使用的示例 810 文档位于 X12 810。
配置 X12 端口
除了创建一个示例 XML 模型,X12 端口还用于将 XML Map 端口映射的 XML 转换为输出 EDI 文件。它还会根据端口中配置的设置向文档添加交换和功能组数据。因此,必须根据将接收出站 X12 810 文档的交易伙伴的具体设置来配置 X12 端口。 在 X12 端口的 系统设置 页面上,将 转换类型 属性设置为XML-to-X12。在此模式下运行时,X12 端口的输入应是结构化为 EDI 文档的 XML。使用前一步中 XML Map 端口的 创建测试文件 选项,可确保输入 XML 与此特定结构匹配。
默认情况下,勾选了 动态处理伙伴。这意味着端口会自动从 EDI 交易中识别并跟踪交易伙伴关系。在这种情况下,不需要手动配置伙伴,因为端口会在许可限制内动态管理所有伙伴。本指南使用默认设置。请参阅 X12 端口设置 了解取消勾选该项后需要执行的操作。
端口还会根据配置的设置填充交换和功能组值。但是,交易伙伴可能需要进一步的交换 (ISA) 和功能组 (GS) 值才能成功接收 810。请与交易伙伴明确沟通需要哪些头部元素。有关更多信息,请参阅 X12 端口 文档。
第 3 步:XML Map 端口
现在 MySQL 端口和 X12 端口已经分别生成了输入和输出数据的 XML 模型,使用 XML Map 端口将一个 XML 结构转换为另一个。 将 XML Map 端口添加到工作流,然后将 MySQL 端口连接到 XML Map 端口,将 XML Map 端口连接到 X12 端口。
配置 XML Map 端口
在 XML Map 端口的 XML 映射 页面上,找到 源 和 目标 模板文件字段。端口会将 MySQL 端口 Select 配置 中的 XML 模型检测为可用的源模板文件,并将 X12 端口测试文件中的 XML 模型检测为可用的目标模板文件。如果任一选项不可用,请验证测试文件和配置是否已正确保存,以及端口是否已在画布上连接。 指定模板文件后,XML Map 可视化设计器会自动填充 MySQL Select 配置和示例 X12 810 文件的 XML 结构。
理解 XML 结构
要在 XML Map 端口中创建正确的映射关系,需要理解源结构和目标结构如何以 XML 表示。 结构中有两种类型的 XML 元素(节点)。父 节点和 叶 节点定义了 XML 数据的层级结构,其中父节点对相关元素进行分组,叶节点代表要映射的实际数据值。使用父节点旁边的展开和收起按钮可以显示或隐藏其叶节点。有关更多信息,请参阅 映射节点。 在 MySQL XML 中,每个父节点代表一张正在提取数据的表,每个叶节点代表该表中的一列。在 810 XML 中,每个 EDI 循环 和 段 都是父节点,每个单独的 EDI 元素 都是叶节点。创建映射
一旦 XML Map 端口配置了源结构和目标结构,就可以在设计器中拖拽节点来创建映射。 映射主要通过两个步骤创建:- 在父节点之间创建
Foreach循环关系 - 在已建立的
Foreach循环中映射叶节点之间的值
创建 Foreach 循环
Foreach 关系意味着每当源中出现一个元素时,就会在目标中创建一个新的 XML 结构。例如,如果源中的 ElementA 映射到目标中的 ElementB,输入文件中每次出现 ElementA 都会在输出文件中产生一个 ElementB 实例(以及所有 ElementB 的子元素)。
在这种情况下,从 PO 表 (test_purchase_orders) 中提取的每条记录都会在生成的 EDI 中产生一个新的交易 (TX),而从订单项表 (test_po_line_items) 中提取的每条记录都会产生一个新的 IT1Loop。将 test_purchase_orders 元素拖到 TX-00401-810 元素上,如下图所示:


用来创建目标结构的示例 X12 810 文档可能在映射设计器中显示多个 IT1Loop1 元素。您可以删除除一个之外的所有这些元素(右键单击节点并选择 删除节点),因为 Foreach 关系会确保生成正确数量的 IT1Loop1 元素。
映射叶节点
建立Foreach 关系后,可以映射循环中叶节点的值。映射叶节点决定了填充由 Foreach 循环创建的 XML 结构的值。
一些叶节点映射很简单,另一些则需要使用 节点值编辑器 或 代码脚本编辑器。以下各节介绍 EDI 文档中常见的叶节点映射类型。有关更多信息,请参阅 映射。
简单叶节点映射
当源文件中的值应直接插入生成的输出中时,只需将叶节点从源拖到目标中的叶节点上,即可映射这些值。此过程需要理解 EDI 目标格式,以及生成的 X12 文档中需要包含哪些值。 例如,X12 810 中的 BIG04 元素保存了发票所对应的采购订单编号。它对应数据库输出中的 PONumber 元素。将 PONumber 节点拖拽到 BIG/BIG04 节点上,以建立该关系。
PONumber)。叶节点 xpath 与父节点中的 Foreach xpath(/Items/test_purchase_orders)相关。可以将所有父节点的 xpath 与叶节点中的 xpath 串联起来,以在源 XML 中找到映射值的完整 xpath:/Items/test_purchase_orders/PONumber。
在本例中,其他直接的叶节点映射值包括以下内容:
- PODate > BIG/BIG03
- CurrencyCode > CUR/CUR02
- ItemID > IT1Loop1/IT1/IT107
- Quantity > IT1Loop1/IT1/IT102
- PricePerUnit > IT1Loop1/IT1/IT104
- PONumber(再次) > IT1Loop1/IT1/IT111
上下文映射
一些叶节点映射取决于目标中的其他元素。例如,目标 XML 中的 N1Loop1 循环是表示 EDI 交易中的参与方或实体(例如开票方、收货方、采购方等)的元素集合。N1Loop1/N1/N101 元素指示参与方的特定角色,而参与方的角色决定了应从源 XML 中映射哪些值。 在本指南中,源数据包括收货方和收款方的详细信息。为了在 EDI 输出中包含这些数据,需要两个独立的 N1Loop1 结构,一个将 N1Loop1/N1/N101 设置为ST(ShipTo 的值),另一个设置为 RI(RemitTo 的值)。然后可以通过从源中拖放 ShipToID 和 RemitToID,映射每个相应循环的 N1Loop1/N1/N102 值:

ST 的 N1Loop1 结构中的 N2、N3 和 N4 元素。同样,将其他收款方数据(RemitToAddr、RemitToZip 等)映射到 N101 设置为 RI 的 N1Loop1 结构中的适当元素。
一些 EDI 循环在 目标 映射中需要多个不同的节点(例如本节中的 N1Loop1 循环),而其他循环在目标映射中只需要一个节点(例如上一节中的 IT1Loop1 循环)。差异取决于 Foreach 关系是否会自动生成正确数量的输出节点:由于 N1Loop1 节点没有与其关联的 Foreach 关系,因此目标映射需要显式包含正确数量的 N1Loop1 节点。
简单计算
一些值不是直接从源 XML 中提取的,而是使用源中的一个或多个值计算得出。例如,每个 IT1Loop1 循环(即每个订单行)都有一个 TXI/TXI02 元素,代表适用于该订单行的税额。源数据包含计算适用于购买的税额所需的所有信息:- 单价
- 数量
- 税率

|) 将 PricePerUnit 值传给 multiply 格式化器,然后将 multiply 格式化器的参数设置为 Quantity 源元素中的值:

Quantity 的
xpath 值必须用方括号括起来,才能解释为动态值而不是字符串文字。
如前面的图像所示,使用节点值编辑器时,可以轻松搜索格式化器和源文档中的数据。
累加计算
输出的 810 文档有一个 TDS 段,代表发票的总金额。汇总每个订单行的成本需要一个可在每个订单行循环中更新的持久变量。 需要脚本将值存储在变量中,并在之后的映射中检索这些值。在 Script 中,值存储为 属性,项目 是可以具有多个属性的对象。项目属性使用以下语法引用:item_name.attribute_name
_map 项是一个特殊项,会在整个文档映射过程中保留属性值。换句话说,大多数属性(变量)只会为单个节点映射保留,而 _map 项的属性会在映射中的每个节点上保持不变。
为了汇总每个订单行的成本,请在订单行的 Foreach 循环中(即 IT1Loop1 循环)设置 _map 项的一个属性。由于该脚本没有与 IT1Loop1 循环中的任何特定元素相关联,因此应将专用的 代码脚本 元素添加到目标映射。该元素不会出现在生成的 EDI 文档中,但表示正在执行脚本逻辑,以用于映射中的其他用途。
首先,右键单击 IT1Loop1 元素并选择 添加节点 > 添加代码脚本 来添加一个新的代码脚本元素(可以通过单击并拖动来重新定位该元素):

(PricePerUnit * Quantity) + (PricePerUnit * Quantity * TaxPercent * .01)
编辑脚本元素,用 Script 表示以下公式。命名脚本元素,然后点击 添加脚本。
</> 图标并将 result.text 值设置为先前的属性:

条件映射
一些节点需要条件逻辑来决定它们是否应出现在输出中,以及其中应设置什么值。例如,ITD 段包含有关发票条款的数据,而且只有在指定了条款时,才需要在输出的 810 中包含该段。 可以使用目标映射中 ITD 元素旁边的漏斗图标来应用条件,决定该元素(以及它的子元素)是否出现在输出文档中。单击该图标并在映射条件编辑器中添加一条规则;在本例中,采购订单条款具有一个前缀,用来表明是否必须在发票中指定条款:
- 02 - 加急付款
- 03 - 延迟付款
- 11 - 替代付款模式
索引映射
目标 XML 中的一些元素需要对 Foreach 关系中的循环次数进行计数。例如,IT1Loop1/IT1/IT101 元素保存订单行编号,因此需要为采购订单中的每个订单行递增。同样,Meta/ST02 元素需要为文档中的每个采购订单递增。_index 属性是一个特殊变量,保存最局部的 Foreach 循环关系的索引(对于嵌套的 Foreach 循环,_index 指最内层循环)。只要 Foreach 关系正确建立,就可以将 Meta/ST02 和 IT1Loop1/IT1/IT101 都设置为以下值,以正确统计采购订单和订单行:
[_index]
如果 Foreach 循环中的当前索引与更高级的映射逻辑相关,则此特殊属性在任何自定义脚本环境中也可用。
在映射中生成日期
目标 XML 中的一些元素完全不引用源数据。BIG/BIG01 元素代表发票日期,该值直到当前映射步骤才可用。 可以使用特殊的 now 日期格式化器为当前日期时间生成新的日期值。像所有格式化器一样,它可在任何节点映射的节点值编辑器中使用。 所有格式化器都需要一个输入属性来格式化。通常,在 XML 映射期间,输入属性是使用xpath 格式化器检索的值(也就是从源 XML 解析的值)。在本例中,传给 now 格式化器的属性并不重要,因为它始终返回当前日期时间。因此,可以将默认 _ 项作为占位符传递:

传递给
now 格式化器的参数定义了日期的输出格式。计算订单行和总成本
CTT 段包含用于计算订单行总数的元素,以及表示项目总成本的哈希值。计算这些值的方法与 累加计算 中描述的方法类似。 相关的值必须在可以使用订单行数据的映射部分(即 IT1Loop1 部分)中进行计算,然后在之后的 CTT 映射中引用。这需要一个自定义脚本,将值存储在特殊的_map 项中。
在 IT1Loop1 循环中(使用 Foreach 关系映射到 test_po_line_items 记录),右键单击并选择 添加节点 > 添加代码脚本 来添加新节点。脚本会在每次映射循环时执行;换句话说,它会为每个订单行执行一次。为了计算值,需要汇总行数和总成本,然后存储在 _map 项的属性中。
订单行数量通过一个简单的计数器计算,而成本可以使用 累加计算 中使用的相同公式计算。
工作流总结
MySQL 端口从后端系统中生成采购订单数据的 XML,随后 XML Map 端口将该 XML 映射为 EDI 格式。然后将 EDI XML 传给 X12 端口,以添加交换头并将 XML 转换为 X12 格式。 此工作流中最复杂的步骤是创建 XML 映射。映射需要在父节点之间建立Foreach 关系,然后结合拖放操作、使用节点值编辑器、添加条件和编写自定义脚本来映射单个叶节点。