> ## Documentation Index
> Fetch the complete documentation index at: https://docs.arc.cdata.com/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL アウトプットをEDI 810 Invoice にマッピング

> MySQL データベースからデータを取得し、CData Arc でX12 810 EDI Invoice ドキュメントにマッピングします。

export const companyName = "CData";

export const siteNameShort = "Arc";

export const siteName = "CData Arc";

## 概要

{siteName} には、バックエンドデータベースから対象のデータを取得し、そのデータをX12 やEDIFACT などの送信EDI ドキュメントにマッピングするための強力なツールが含まれています。このガイドでは、MySQL データベースからEDI へのワークフローを作成するプロセスを、X12 810 Invoice ドキュメントの生成に焦点を当てて説明します。サンプルのInvoice は、Amazon が要求する構文を反映しています。

このガイドで説明するアプローチと原則は、他のEDI ドキュメントの生成にも適用できます。ただし、データベースから取得する具体的なデータや、マッピングされる値間の関係には違いがある場合があります。

このガイドは、{siteNameShort} でマッピングを実現する方法の概要から始まり、フローの各ステップを順を追って説明します。本記事で使用するデータベース構造、出力ファイル、および結果として得られる810 ドキュメントについては、[サンプルデータ](#サンプルデータ)を参照してください。

## {siteName} でのEDI マッピング

### MySQL データをXML として取得する

{siteNameShort} は、データの変換と操作のための共通フォーマットとしてXML を使用します。すべてのEDI マッピングフローでは、ソースデータ（この場合はデータベースのデータ）とデスティネーションデータ（この場合はEDI ファイル）をXML に変換します。

データベース（またはデータベースに類するアプリケーション）からデータを取得する{siteNameShort} のすべてのコネクタは、自動的に出力データをXML ファイルとしてフォーマットします。そのため、データベースから取得したデータは、すぐにマッピングや変換ができる状態になっています。このガイドでは、MySQL データベースとやり取りするために[MySQL コネクタ](../connectors/mysql/mysql)を使用します。

### 810 Invoice に関連するデータの取得

Invoice は通常、発注書（PO）への応答として取引パートナーに送信されます。製造会社が一連の製造品を要求するPO を受け取ると、製造会社は要求された商品の代金を支払うためのInvoice で応答します。

その結果、Invoice の生成に使用されるデータは通常、以前に受信したPO から得られます。このガイドでは、受信したPO データが自動的にデータベースに挿入されることを前提としているため、PO のデータベーステーブルには810 Invoice に関連するデータが保持されています。このフロー用にMySQL コネクタを設定する際、MySQL コネクタはPO データが保持されているテーブルを対象とします。

PO には複数の明細項目を含めることができ、典型的なデータベース構成では明細項目データを`PurchaseOrders` テーブルとは別の`LineItems` テーブルに保存します。`LineItems` テーブルには`PurchaseOrders` テーブルへの外部キーがあるため、どの明細項目がどのPO に関連付けられているかを判別できますが、810 Invoice を生成するために必要なすべての情報を取得するには、両方のテーブルからデータを取得する必要があります。

[Select アクションの定義](#select-アクションの定義)には、（適切な外部キー関係を持つ）`PurchaseOrders` テーブルと`LineItems` テーブルから同時にデータを取得するために必要な手順が含まれています。

### EDI ドキュメントをXML として表現する

データベースから取得したXML データをEDI ドキュメントにマッピングするには、EDI ドキュメントもXML として表現する必要があります。{siteNameShort} には、EDI とXML フォーマット間を変換するさまざまなコネクタが含まれています（X12 とEDIFACT がその2つです）。このガイドではX12 ドキュメントのマッピングに焦点を当てているため、対象の810 ドキュメントのXML 表現を生成するために[X12 コネクタ](../connectors/x12)を使用します。

マッピングフローを作成する前に、サンプルの出力ドキュメント（サンプルの810 など）を用意しておくことが重要です。サンプルドキュメントは、マッピングステップ用のXML モデルを作成するために使用されます。独自のサンプルドキュメントをアップロードするか、組み込みテンプレートのリストから選択することができます。

### XML 構造の変換

ソースとデスティネーションのフォーマットがXML として表現されたら、強力な[XML Map コネクタ](../connectors/xml-map/xml-map)を使用して、一方のXML 構造を他方に変換します。

XML Map コネクタには、それぞれ開始時と終了時のXML 構造を表すサンプルの**Source** および**Destination** テンプレートファイルが必要です。データベースから取得したXML 出力がソースファイルであり、X12 810 ドキュメントのXML 表現（サンプルの810 をX12 コネクタに通すことで生成）がデスティネーションファイルです。

ソースとデスティネーションの構造を指定すると、XML Map コネクタのビジュアルデザイナーに2つの構造が読み込まれます。ソース構造の要素をデスティネーション構造の要素にドラッグアンドドロップして、両者の間にマッピング関係を作成します。このマッピングステップでは、適切な要素が出力ファイルに含まれるよう、EDI 構造を理解しておく必要があります。

XML Map コネクタには、マッピングプロセス中にデータを操作・計算するための値フォーマッタ、条件ロジック、さらにはカスタムスクリプトが含まれています。これらの機能の詳細については、[マッピング](../mapping/mapping)を参照してください。

マッピング関係を作成すると、XML Map コネクタは、ソースXML 構造に一致する任意のファイルをデスティネーションXML 構造を持つファイルに自動的に変換できます。この例では、データベースから取得したデータが自動的にX12 810 ドキュメントのXML モデルに変換されます。最後のステップは、810 XML ファイルのXML モデルを取得して実際の810 ドキュメントに変換することで、これはX12 コネクタで簡単に実現できます。

## マッピングフローの作成

このセクションには、{siteNameShort} でデータベース出力を取得して810 Invoice にマッピングするフローを作成するための各ステップが含まれています。

### ステップ1：MySQL コネクタ

マッピングフローの最初のステップは、MySQL データベースから関連データを取得するために[MySQL コネクタ](../connectors/mysql/mysql)を設定することです。

#### 接続の確立

ナビゲーションバーの**フロー**をクリックし、ワークスペースのキャンバスにMySQL コネクタのインスタンスを追加します（手順については[フローの設計](../flows/designing-a-flow)を参照してください）。本番のフローでは、MySQL コネクタのインスタンス名に、対象のMySQL データベースと、データベースから取得またはデータベースにプッシュされるデータに関するコンテキスト情報を含めるべきです（例えば、MySQL\_Invoice\_tradingPartner）。このフローでは、わかりやすさのためにコネクタのインスタンス名を**MySQL\_Output** とします。

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mysql_edi_1.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=9740af9cb4f83ea5f3209b0791b362d9" alt="ワークスペースキャンバス上のMySQL コネクタ" width="800" data-path="public/images/mysql_edi_1.png" />

ドロップダウンリストから**Connection** を選択するか、**Create** ボタンをクリックして新しい接続を作成します。次の画像は**Add Connection** ページを示しています。各フィールドの詳細については、[接続の確立](../connectors/mysql/mysql#establish-a-connection)を参照してください。

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mysql_edi_connection_config.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=64c5e8e47f5d42f36e9374392d7ad4d1" alt="MySQL の接続追加ページ" width="600" data-path="public/images/mysql_edi_connection_config.png" />

#### Select アクションの定義

接続を確立したら、[Select](../connectors/mysql/mysql-select) アクションを使用してデータベースから関連データを取得します。[810 Invoice に関連するデータの取得](#810-invoice-に関連するデータの取得)で述べたように、データは親の`PurchaseOrders` テーブルと子の`LineItems` テーブルから取得されます。

MySQL コネクタの**設定**タブで、**Action** を`Select` に設定します。**Select Configuration** セクションで**Add** をクリックして、アクションを設定します。これにより、データベース内のテーブルのリストが表示されます。親テーブル（PO データを持つもの）を選択します。子テーブル（明細項目データを持つもの）は後で追加します。この例ではPO テーブルは`test_purchase_orders` であり、このテーブルを選択すると設定セクションの**Columns** 部分が読み込まれます。

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_db_output_mapping.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=7fba8b012b1c43c519b7bbe23797808b" alt="test_purchase_orders テーブルを使用したMySQL Select の設定" width="800" data-path="public/images/mapmysql-810_db_output_mapping.png" />

エディタを使用して、テーブル内のどの列を取得するかを選択します。このガイドでは、出力XML にすべての列を含めます。

テーブルの列の1つに`Processed` があり、レコードが処理されていない場合は値`0` を、処理済みの場合は`1` を保持します。PO がテーブルに挿入される際には、`Processed` 列が`0` に設定されていることが期待されます。Select Configuration は`Processed` 列が`0` の場合にのみレコードを取得し、レコードの取得に成功したらこの列を値`1` で更新するべきです。

これを実現するには、`Processed` = `0` のレコードのみを取得するフィルタを適用します。エディタの**Filter** セクションで、新しいルールを追加します：

* 左側のドロップダウンをチェックする列に設定します。この例では`Processed` です
* 中央のドロップダウンで論理演算子を選択します。この例では`Equals` です
* 右側の入力を、列と比較する値に設定します。この例では`0` です

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_db_output_mapping_filtered.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=5745a4a17673d603c2729d8e7f41b59e" alt="Processed フィルタを使用したMySQL Select の設定" width="800" data-path="public/images/mapmysql-810_db_output_mapping_filtered.png" />

`Processed` 列でレコードをフィルタリングすることに加えて、レコードが複数回取得されないように列を更新する必要があります。エディタの**Advanced** セクションでは、データベースから行が正常に取得された際に更新する列を指定できます。

この場合、`Processed` 列を値`1` で更新するべきです。

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_db_output_mapping_filtered_updated.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=036b784aa51f6bef7812c28b2f5a6d8e" alt="Processed 列の更新値を設定したMySQL Select の設定" width="700" data-path="public/images/mapmysql-810_db_output_mapping_filtered_updated.png" />

`test_purchase_orders` テーブルから適切なレコードが取得されるようになったので、各PO に関連付けられた明細項目を取得するために**Select Configuration** セクションを設定する必要があります。この例では、明細項目データは`test_po_line_items` テーブルに保持されています。

**Select Configuration** で、**Add** をクリックして新しい子テーブルを追加します。`test_po_line_items` テーブルを選択します。エディタは左側のパネルのテーブルツリー構造を自動的に更新します。最初のテーブルと同様に、`test_po_line_items` から出力する特定の列を選択できます。このガイドではすべての列を含めます。

MySQL コネクタが`test_purchase_orders` テーブルからPO レコードを取得する際、`test_po_line_items` テーブルからもレコードを取得しようとします。現在のPO に関連付けられた明細項目のみを取得するべきなので、子テーブルに`WHERE` 制約を適用する必要があります。

この例では、`test_po_line_items` テーブルの`PONumber` 列が`test_purchase_orders` テーブルの`PONumber` 列に対応しています。明細項目の`PONumber` がPO の`PONumber` と一致する場合にのみ、レコードをPO レコードの出力に含めるべきです。

これを実現するには、`test_po_line_items` の設定の**Filter** セクションに新しいルールを追加します：

* 左側のドロップダウンを、チェックする子テーブルの列に設定します。この例では`PONumber` です
* 中央のドロップダウンを`Equals` に設定します
* 右側の入力で、ドロップダウンの矢印をクリックして`REF` を選択し、親テーブルを参照するように設定します（参照を示す`$` 記号が表示されます）
* 最後の入力を、比較する親テーブルの列に設定します。この例では再び`PONumber` です

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_db_output_mapping_full.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=07763619c0c4440f9a6309a62ce1ed07" alt="親子関係を完全に設定したMySQL Select の設定" width="800" data-path="public/images/mapmysql-810_db_output_mapping_full.png" />

これで設定が完了したので、MySQL コネクタに保存してください。

設定を保存すると、2つの方法でデータベースからデータを取得できます。MySQL コネクタの[Automation タブ](../connectors/database/database#automation-tab)で**Receive Automation** が有効になっている場合、コネクタは受信間隔に従って未処理のPO（および関連する明細項目）を自動的に取得しようとします。あるいは、**トランザクション**タブに移動して**Receive** をクリックすることで、手動でレコードを取得できます。どちらの場合も、コネクタは設定されたテーブルに対してSELECT クエリを実行し、選択されたデータを含む出力メッセージを生成します。

#### XML としてのSelect アクションの出力

Select アクションが定義されると、MySQL コネクタは出力をXML として表現します。出力のXML モデルを表示するには、**\</> Code** ボタンをクリックします：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_output_mapping_code.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=5f6e7dc113697e31610c68240a9e3670" alt="XML 出力構造を示すMySQL コネクタのコードビュー" width="800" data-path="public/images/mapmysql-810_output_mapping_code.png" />

MySQL コネクタがデータベースからデータを取得する際、取得した値を使用してこの構造を持つXML ドキュメントを生成します。XML ファイル内のサブ構造は繰り返すことができます。例えば、単一のPO に対して複数の明細項目が取得された場合、`test_po_line_items` テーブルのXML サブセクションは各明細項目について繰り返されます。

次に、このXML 構造をX12 810 Invoice を表すXML 構造にマッピングする必要があります。その後、結果としてマッピングされたXML を直接EDI ドキュメントに変換できます。

<Note>このガイドで使用するマッピングは[データベースのXML 構造](#データベースのxml-構造)にあります。</Note>

### ステップ2：X12 コネクタ

X12 コネクタは、このマッピングフローで2つの役割を果たします。

1. 810 Invoice のXML 表現を生成するために使用されます。これは、X12 コネクタの**トランザクション**タブでサンプルファイルをアップロードするか、X12 コネクタに同梱されている組み込みテンプレートファイルを使用することで行えます。アップロードされたテンプレートファイルと組み込みテンプレートファイルは、X12 コネクタがXML Map コネクタに接続された後、XML Map コネクタの**Destination** フィールドに（`connector://` を接頭辞として）表示されます。
2. X12 コネクタは、XML Map コネクタによって生成されたXML をX12 ドキュメントに変換することで、フローの最後のステップを実行します。

X12 コネクタのインスタンスをキャンバスに追加します。X12 コネクタのインスタンス名には通常、X12 ドキュメントを送信する取引パートナーの名前を含めるべきです。このフローでは、わかりやすさのためにインスタンス名を**XML\_To\_X12** とします。

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mysql_edi_2.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=ca43e7e74d336bd3799fe91590009ebd" alt="キャンバスに追加されたX12 コネクタ" width="800" data-path="public/images/mysql_edi_2.png" />

#### テストファイルのアップロード

すでにサンプルの810 Invoice ファイルがある場合、**Upload Test File** 機能により、対象のEDI ドキュメントのXML モデルを生成するプロセスが簡素化されます。X12 コネクタの**トランザクション**タブを開き、**More > Upload Files** をクリックします：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_upload_test_file.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=759f930bfad437759d10f43eb6b50ec2" alt="X12 コネクタのトランザクションタブのファイルアップロードオプション" width="800" data-path="public/images/mapmysql-810_upload_test_file.png" />

アップロードするサンプルの810 Invoice を参照します。X12 コネクタはこのドキュメントのXML モデルを内部的に生成し、XML Map コネクタはそれを自動的に検出できます。モデルは内部に保存されるため、コネクタの外観や設定は変わりません。

サンプルの810 ファイルがない場合、XML Map コネクタをX12 コネクタに接続すると、XML Map コネクタの**設定**タブの**Destination File** フィールドに、選択可能な組み込みテンプレートファイルのリストが読み込まれます。詳細については、[組み込みテンプレートファイルの選択](../connectors/xml-map/xml-map-template-files#choose-a-built-in-template-file)を参照してください。

<Note>このガイドで使用するサンプルの810 ドキュメントは[X12 810](#x12-810)にあります。</Note>

#### X12 コネクタの設定

X12 コネクタは、サンプルXML モデルの作成に加えて、XML Map コネクタによってマッピングされたXML を出力EDI ファイルに変換するために使用されます。また、コネクタで設定された設定に従って、ドキュメントにインターチェンジおよびファンクショナルグループのデータを追加します。そのため、送信X12 810 ドキュメントを受信するパートナーに固有の設定でX12 コネクタを設定することが重要です。

X12 コネクタの**設定**タブで、**Translation Type** プロパティを`XML-to-X12` に設定します。このモードで動作している場合、X12 コネクタへの入力はEDI ドキュメントとして構造化されたXML であるべきです。XML Map コネクタの前のステップで**Create Test Files** オプションを使用すると、入力XML がこの特定の構造に一致することが保証されます。

デフォルトでは、**Dynamically process partners** がチェックされています。これは、コネクタがEDI トランザクションから取引パートナー関係を自動的に識別して追跡することを意味します。この場合、コネクタはライセンスの上限内ですべてのパートナーを動的に管理するため、手動でのパートナー設定は不要です。このガイドではデフォルト設定を使用します。これをオフにした場合に何が必要になるかについては、[X12 コネクタの設定](../connectors/x12#connector-configuration)を参照してください。

コネクタは、設定された設定に基づいてインターチェンジおよびファンクショナルグループの値も入力します。ただし、810 を正常に受信するために、取引パートナーがさらにインターチェンジ（ISA）およびファンクショナルグループ（GS）の値を要求する場合があります。どのヘッダー要素が必要かを確認するため、取引パートナーと明確にコミュニケーションを取ってください。詳細については、[X12 コネクタ](../connectors/x12)のドキュメントを参照してください。

### ステップ3：XML Map コネクタ

MySQL コネクタとX12 コネクタがそれぞれ入力データと出力データのXML モデルを生成したので、XML Map コネクタを使用して一方のXML 構造を他方に変換します。

XML Map コネクタをフローに追加し、MySQL コネクタをXML Map コネクタに、XML Map コネクタをX12 コネクタに接続します。

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mysql_edi_3.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=2846665d33df5e6a6c3c260818cc0cba" alt="MySQL、XML Map、X12 コネクタを含む完全なフロー" width="800" data-path="public/images/mysql_edi_3.png" />

#### XML Map コネクタの設定

XML Map コネクタの**XML Map** タブで、**Source** および**Destination** テンプレートファイルのフィールドを見つけます。コネクタは、MySQL コネクタの[Select Configuration](#select-アクションの定義)からのXML モデルを利用可能なソーステンプレートファイルとして、X12 コネクタのテストファイルからのXML モデルを利用可能なデスティネーションテンプレートファイルとして検出します。いずれかのオプションが利用できない場合は、テストファイルと設定が適切に保存され、コネクタがキャンバス上で接続されていることを確認してください。

テンプレートファイルを指定すると、XML Map のビジュアルデザイナーにMySQL Select 設定とサンプルのX12 810 ファイルのXML 構造が自動的に読み込まれます。

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_xml_map_designer.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=73562fb1c702fc5f27937b1664e9134b" alt="MySQL とX12 の構造を表示するXML Map コネクタのビジュアルデザイナー" width="800" data-path="public/images/mapmysql-810_xml_map_designer.png" />

<Tip>デスティネーション構造の*Interchange* および*FunctionalGroup* 要素に*Meta* 要素がある場合、安全に削除できます。X12 コネクタは、XML をEDI に変換する際に、関連するメタデータをISA およびGS セグメントに適用します。</Tip>

#### XML 構造の理解

XML Map コネクタで適切なマッピング関係を作成するには、ソースとデスティネーションの構造がXML でどのように表現されているかを理解する必要があります。

構造には2種類のXML 要素（ノード）があります。*Parent*（親）および*Leaf*（リーフ）ノードはXML データの階層構造を定義し、親ノードは関連する要素をグループ化し、リーフノードはマッピングされる実際のデータ値を表します。親ノードの横にある展開ボタンと折りたたみボタンを使用して、そのリーフを表示または非表示にします。詳細については、[ノードのマッピング](../mapping/mapping-config#ノードのマッピング)を参照してください。

MySQL のXML では、各親ノードはデータが取得されるテーブルを表し、各リーフノードはそのテーブルの列を表します。810 のXML では、各EDI の*loop* と*segment* が親ノードであり、個々のEDI の*element* がリーフノードです。

## マッピングの作成

ソースとデスティネーションの構造でXML Map コネクタを設定したら、デザイナーでノードをドラッグアンドドロップしてマッピングを作成します。

マッピングは主に2つのステップで作成されます：

1. 親ノード間の`Foreach` ループ関係を作成する
2. 確立された`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* 要素にドラッグします：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_xml_map_foreach_1.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=234f682587ce1a49c232dc399ce1e721" alt="Foreach ループを作成するためにtest_purchase_orders をTX-00401-810 にドラッグ" width="1096" height="904" data-path="public/images/mapmysql-810_xml_map_foreach_1.png" />

次に、以下に示すように、*test\_po\_line\_items* を*IT1Loop1* 要素にドラッグします：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_xml_map_foreach_2.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=753c7d97e59ea199a0d3365d867947f2" alt="test_po_line_items をIT1Loop1 にドラッグ" width="1097" height="903" data-path="public/images/mapmysql-810_xml_map_foreach_2.png" />

<Note>Destination 構造を作成するために使用したサンプルのX12 810 ドキュメントには、マッピングデザイナーに表示される複数の*IT1Loop1* 要素がある場合があります。*Foreach* 関係によって正しい数の*IT1Loop1* 要素が生成されることが保証されるため、これらの要素のうち1つを除いてすべて削除できます（ノードを右クリックして**Delete Node** を選択します）。</Note>

### リーフノードのマッピング

`Foreach` 関係を確立したら、ループ内のリーフノードから値をマッピングできます。リーフノードのマッピングは、`Foreach` ループによって作成されたXML 構造に入力される値を決定します。

一部のリーフノードのマッピングは単純ですが、他のものは[Node Value Editor](../mapping/mapping-node-value-editor)または[Code Script Editor](../mapping/mapping-config#コードスクリプト)の使用が必要です。以下のセクションでは、EDI ドキュメントにおける一般的な各種類のリーフノードのマッピングについて説明します。追加情報については、[マッピング](../mapping/mapping)を参照してください。

#### 単純なリーフノードのマッピング

ソースの値を結果の出力に直接挿入するべき場合は、ソースのリーフノードをデスティネーションのリーフノードにドラッグするだけで値をマッピングできます。このプロセスでは、EDI のデスティネーションフォーマットと、結果のX12 ドキュメントに含める必要がある値を理解しておく必要があります。

例えば、X12 810 の*BIG04* 要素は、Invoice が作成されるPO 番号を保持します。これはデータベース出力の*PONumber* 要素に対応します。*PONumber* ノードを*BIG/BIG04* ノードにドラッグして、この関係を確立します。

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_xml_map_one_leaf.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=10aaa56e98f2a40c5fcf09e1be1e07a8" alt="XML Map コネクタでPONumber をBIG04 にマッピング" width="1098" height="901" data-path="public/images/mapmysql-810_xml_map_one_leaf.png" />

マッピングされたデスティネーションノードの右側にあるxpath は、マッピングされた値のソース（前の画像では`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

各ソース値を、変更や条件ロジックなしでデスティネーションのEDI ドキュメントにドラッグアンドドロップできます。

#### コンテキストに応じたマッピング

一部のリーフノードのマッピングは、デスティネーション内の他の要素に依存します。例えば、デスティネーションXML 内の*N1Loop1* ループは、EDI トランザクションにおける当事者またはエンティティ（請求先、出荷先、発注先など）を表す要素の集合です。*N1Loop1/N1/N101* 要素は当事者の具体的な役割を示し、当事者の役割によってソースXML からマッピングするべき値が決まります。

このガイドでは、ソースデータに出荷先当事者と送金先当事者の当事者詳細が含まれています。このデータをEDI 出力に含めるには、2つの個別の*N1Loop1* 構造が必要です。1つは*N1Loop1/N1/N101* を`ST`（ShipTo の値）に設定したもの、もう1つは*N1Loop1/N1/N101* を`RI`（RemitTo の値）に設定したものです。次に、ソースから*ShipToID* と*RemitToID* をドラッグアンドドロップすることで、それぞれのループの*N1Loop1/N1/N102* 値をマッピングできます：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_xml_map_n1_leaf.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=abe139f8bb397a18833e7747a1c89d89" alt="ShipToID とRemitToID をN1Loop1 構造にマッピング" width="1099" height="912" data-path="public/images/mapmysql-810_xml_map_n1_leaf.png" />

他の出荷先データ（*ShipToAddr*、*ShipToZip* など）を、*N101* が`ST` に設定されている*N1Loop1* 構造の*N2*、*N3*、*N4* 要素にマッピングします。同様に、他の送金先データ（*RemitToAddr*、*RemitToZip* など）を、*N101* が`RI` に設定されている*N1Loop1* 構造の適切な要素にマッピングします。

<Note>一部のEDI ループ（このセクションの*N1Loop1* ループなど）では**Destination** マッピングに複数の個別ノードが必要であり、他のもの（前のセクションの*IT1Loop1* ループなど）ではデスティネーションマッピングに単一のノードのみが必要です。この違いは、*Foreach* 関係が正しい数の出力ノードを自動的に生成するかどうかによって決まります。*N1Loop1* ノードには*Foreach* 関係が関連付けられていないため、デスティネーションマッピングには正しい数の*N1Loop1* ノードを明示的に含める必要があります。</Note>

#### 単純な計算

一部の値はソースXML から直接取得されず、ソース内の1つ以上の値を使用して計算されます。例えば、各*IT1Loop1* ループ（各明細項目）には、その明細項目に適用される税額を表す*TXI/TXI02* 要素があります。ソースデータには、購入に適用される税を計算するために必要なすべての情報が含まれています：

* 単価
* 数量
* 税率

ただし、計算された税の値自体はソースに存在しないため、XML Map コネクタで計算する必要があります。

[Node Value Editor](../mapping/mapping-node-value-editor)には、マッピング中にデータを操作するために使用できる[フォーマッタ](../scripting/value-formatters/formatters)があります。この場合、ソースデータをデスティネーションの値に変換するために[multiply](../scripting/value-formatters/number-formatters#multiply-value) フォーマッタを使用する必要があります。

まず、*PricePerUnit* ソースノードを*IT1Loop1/TXI/TXI02* デスティネーションノードにマッピングします。単価は式の入力変数の1つであるため、これは適切な数式を生成するための良い出発点です。次に、デスティネーションノードの右側にあるタブレットと鉛筆の <img src="https://mintcdn.com/cdata-arc/97fbscTC2p-cCdS3/public/images/xmlmap_expressioneditor_icon.png?fit=max&auto=format&n=97fbscTC2p-cCdS3&q=85&s=279e0291b4b0d206c405d81b6bee4ef5" alt="タブレットと鉛筆のアイコン" noZoom style={{ display: "inline-block", verticalAlign: "middle", height: "0.9em", margin: 0 }} width="28" height="26" data-path="public/images/xmlmap_expressioneditor_icon.png" /> アイコンをクリックして、次の画像に示すNode Value Editor を開きます：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_xml_map_tax_expression_1.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=ccf5d216d539f5d2e22852cd9062e9dd" alt="初期の税の式を表示するNode Value Editor" width="800" data-path="public/images/mapmysql-810_xml_map_tax_expression_1.png" />

明細項目の合計コストを求めるために、価格パラメータに数量を掛けます。縦のパイプ文字（`|`）を使用して*PricePerUnit* の値を`multiply` フォーマッタに渡し、次に`multiply` フォーマッタのパラメータを*Quantity* ソース要素の値に設定します：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_xml_map_tax_expression_2.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=463df3b231312b53a4bf0a6ae809fe20" alt="数量に対するmultiply フォーマッタを使用した税の式" width="800" data-path="public/images/mapmysql-810_xml_map_tax_expression_2.png" />

<Note>*Quantity* の`xpath` 値は、文字列リテラルではなく動的な値として解釈されるよう、角括弧で囲む必要があります。</Note>

この合計コストの値に*TaxPercent* を掛け、さらにパーセントからドルに変換するために.01 を掛ける必要があります。完全な式は次の画像に示されています：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_xml_map_tax_expression_3.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=2bc8637abf8f3ed540b16c67379cb34e" alt="TaxPercent と.01 の乗数を含む完全な税の式" width="800" data-path="public/images/mapmysql-810_xml_map_tax_expression_3.png" />

式を保存すると、マッピングは指定された動的な入力から適切な値を自動的に計算します。

<Note>前の画像でわかるように、Node Value Editor の使用中に、フォーマッタやソースドキュメント内のデータを簡単に検索できます。</Note>

#### 累積計算

出力の810 ドキュメントには、Invoice の合計金額を表す*TDS* セグメントがあります。各明細項目のコストを合計するには、各明細項目ループ内で更新できる永続的な変数が必要です。

値を変数に保存し、マッピングの後半でこれらの値を取得するには、スクリプトが必要です。{siteNameShort}Script では、値は*属性*として保存され、*アイテム*は複数の属性を持つことができるオブジェクトです。アイテムの属性は次の構文で参照されます：`item_name.attribute_name`

`_map` アイテムは、ドキュメントマッピング全体を通じて属性値を保持する特別なアイテムです。言い換えると、ほとんどの属性（変数）は単一のノードマッピングでのみ保持されますが、`_map` アイテムの属性はマッピング内のすべてのノードを通じて保持されます。

各明細項目のコストを合計するには、明細項目の*Foreach* ループ内（*IT1Loop1* ループ内）で`_map` アイテムの属性を設定します。このスクリプトは*IT1Loop1* ループ内の特定の要素に関連付けられていないため、専用の[code script](../mapping/mapping-config#コードスクリプト)要素をデスティネーションマッピングに追加します。この要素は結果のEDI ドキュメントには表示されませんが、マッピング内の他の用途のためにスクリプトロジックが実行されていることを示します。

まず、*IT1Loop1* 要素を右クリックして**Add Node > Add Code Script** を選択し、新しいcode script 要素を追加します（この要素はクリックしてドラッグすることで位置を変更できます）：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_xml_map_tax_summation_1.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=425a75446311a3c82c916bf05e16f93f" alt="IT1Loop1 へのcode script 要素の追加" width="800" data-path="public/images/mapmysql-810_xml_map_tax_summation_1.png" />

スクリプトは明細項目の全コストを計算する必要があり、これは次の式で求められます：

`(PricePerUnit * Quantity) + (PricePerUnit * Quantity * TaxPercent * .01)`

{siteNameShort}Script で次の式を表すようにscript 要素を編集します。script 要素に名前を付けて、**Add Script** をクリックします。

```xml theme={null}
<arc:set attr="lineItemCost" value="[xpath(PricePerUnit) | multiply([xpath(Quantity)])]" />
<arc:set attr="lineItemTax" value="[lineItemCost | multiply([xpath(TaxPercent)]) | multiply(.01) | round(2)]" />
<arc:set attr="_map.costSum" value="[_map.costSum | def(0) | add([lineItemCost]) | add([lineItemTax])]" />
```

このスクリプトが各明細項目ループ中に実行された後、*\_map.costSum* 属性はすべての明細項目の合計コスト（税込み）を保持します。この値を*TDS/TDS01* 要素で参照するには、*TDS01* 要素の右側にある`</>` アイコンをクリックし、*result.text* の値を先ほどの属性に設定します：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_xml_map_tax_summation_after.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=496a5c56fb235e59823d3960fc804089" alt="_map.costSum 参照を含むTDS01 要素" width="600" data-path="public/images/mapmysql-810_xml_map_tax_summation_after.png" />

#### 条件付きマッピング

一部のノードでは、出力に表示されるべきかどうか、およびそれらに設定するべき値を決定するために条件ロジックが必要です。例えば、*ITD* セグメントにはInvoice の条件に関するデータが含まれており、これは条件が指定されている場合にのみ出力の810 に含める必要があります。

デスティネーションマッピングの*ITD* 要素の横にあるじょうごアイコンを使用して、要素（およびその子）が出力ドキュメントに表示されるかどうかを決定する条件を適用できます。アイコンをクリックして、マッピング条件エディタでルールを追加します。この場合、PO の条件には、Invoice に条件を指定する必要があるかどうかを示す接頭辞があります：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_xml_map_condition.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=e0c89157dfea541dbd4403dce54df1c4" alt="ITD 要素のマッピング条件エディタ" width="700" data-path="public/images/mapmysql-810_xml_map_condition.png" />

*ITD* 要素は特別な条件が指定されている場合にのみ表示されるようになったので、*ITD01* 要素は条件の適切なコードを保持する必要があります。この例では、関連する条件に次の値を使用するべきです：

* 02 - Expedited Payment
* 03 - Delayed Payment
* 11 - Alternative Payment Profile

入力データの*Terms* 要素の値は、フォーマッタを使用して*ITD01* の値に変換できないため、*ITD01* マッピングを決定するためのカスタムスクリプトが必要です。*ITD01* 要素を編集して**Node Value Editor** を開き、**Script Mode** トグルを使用してカスタムスクリプトを提供します。次のスクリプトは上記のパターンを実現します：

```xml theme={null}
<arc:set attr="termsCode" value="" />
<arc:set attr="termsInput" value="[xpath(Terms)]" />

<arc:select value="[termsInput]">
 <arc:case value="Expedited Payment">
  <arc:set attr="termsCode" value="02" />
 </arc:case>
 <arc:case value="Delayed Payment">
  <arc:set attr="termsCode" value="03" />
 </arc:case>
 <arc:case value="Alternative Payment Profile">
  <arc:set attr="termsCode" value="11" />
 </arc:case>
</arc:select>

<arc:set attr='result.text'>[termsCode]</arc:set>
```

上記の例では[arc:select](../scripting/keyword-reference/op-arc-select) キーワードを使用していますが、一連の[arc:if](../scripting/keyword-reference/op-arc-if) および[arc:else](../scripting/keyword-reference/op-arc-else) ステートメントで同じ結果を得ることができます。

#### インデックスマッピング

デスティネーションXML の一部の要素は、*Foreach* 関係内のループ数をカウントする必要があります。例えば、*IT1Loop1/IT1/IT101* 要素は明細項目番号を保持するため、PO 内の各明細項目についてインクリメントする必要があります。同様に、*Meta/ST02* 要素はドキュメント内の各PO についてインクリメントする必要があります。

`_index` 属性は、最も局所的な*Foreach* ループ関係のインデックスを保持する特別な変数です（ネストされた*Foreach* ループの場合、`_index` は最も内側のループを指します）。*Foreach* 関係が正しく確立されている限り、*Meta/ST02* と*IT1Loop1/IT1/IT101* の両方を次の値に設定して、PO と明細項目の数を正しくカウントできます：

`[_index]`

この特別な属性は、より高度なマッピングロジックで*Foreach* ループ内の現在のインデックスが関連する場合、任意のカスタムスクリプト環境でも利用できます。

#### マッピングでの日付の生成

デスティネーションXML の一部の要素は、ソースデータをまったく参照しません。*BIG/BIG01* 要素はInvoice の日付を表しますが、これは現在のマッピングステップまで利用できません。

特別な[now](../scripting/value-formatters/date-formatters#now-outputformat) 日付フォーマッタを使用して、現在の日時の新しい日付値を生成できます。すべてのフォーマッタと同様に、これは任意のノードマッピングのNode Value Editor で利用できます。

すべてのフォーマッタには、フォーマットする入力属性が必要です。多くの場合、XML マッピング中、入力属性は`xpath` フォーマッタで取得された値（言い換えると、ソースXML から解析された値）です。この場合、`now` フォーマッタは常に現在の日時を返すため、どの属性が渡されても問題ありません。そのため、プレースホルダーとしてデフォルトの`_` アイテムを渡すことができます：

<img src="https://mintcdn.com/cdata-arc/AKthyJ-LnqphL8js/public/images/mapmysql-810_now_date.png?fit=max&auto=format&n=AKthyJ-LnqphL8js&q=85&s=6eb48507e31ad4696ac5da7799c37a6b" alt="now() 日付フォーマッタを表示するNode Value Editor" width="700" data-path="public/images/mapmysql-810_now_date.png" />

<Note>`now` フォーマッタに渡されるパラメータは、日付の出力フォーマットを定義します。</Note>

#### 明細項目と合計コストのカウント

*CTT* セグメントには、明細項目の合計数をカウントするための要素と、項目の合計コストを表すハッシュ値が含まれます。これらの値を計算するアプローチは、[累積計算](#累積計算)で説明したものと似ています。

関連する値は、明細項目データが利用可能なマッピングのセクション（*IT1Loop1* セクション）で計算し、その後*CTT* マッピングの後半で参照する必要があります。これには、特別な`_map` アイテムに値を保存するカスタムスクリプトが必要です。

*IT1Loop1* ループ（`test_po_line_items` レコードに対して*Foreach* 関係でマッピングされている）で、右クリックして**Add Node > Add Code Script** を選択し、新しいノードを追加します。スクリプトはマッピングがループするたびに実行されます。言い換えると、各明細項目について1回実行されます。値を計算するには、行数と合計コストを合計し、`_map` アイテムの属性に保存する必要があります。

明細項目数は単純なカウンタで計算され、コストは[累積計算](#累積計算)で使用したのと同じ式で計算できます。

```xml theme={null}
<arc:set attr="_map.lineItemCount" value="[_map.lineItemCount | def(0) | add(1)]">

<arc:set attr="currentCost" value="[xpath(PricePerUnit) | multiply([xpath(Quantity)])]" />
<arc:set attr="currentTax" value="[currentCost | multiply([xpath(TaxPercent)]) | multiply(.01) | round(2)]" />

<arc:set attr="_map.totalCost" value="[_map.totalCost | def(0) | add([lineItemCost]) | add([lineItemTax])]" />
```

*CTT01* 要素は\*\_map.lineItemCount\* に直接マッピングできます。スクリプトエディタを開いて先ほどの属性を参照します：

```xml theme={null}
<arc:set attr="result.text">[_map.lineItemCount]</arc:set>
```

*CTT02* 要素は\*\_map.totalCost\* にマッピングできます。ただし、*CTT* ハッシュでは小数点を無視する必要があり、これはここではコストに100 を掛けることと同等です：

```xml theme={null}
<arc:set attr="result.text">[_map.lineItemCount | multiply(100)]</arc:set>
```

## フローの概要

MySQL コネクタはバックエンドシステムのPO データからXML を生成し、このXML はXML Map コネクタによってEDI フォーマットにマッピングされます。次に、EDI XML はX12 コネクタに渡され、インターチェンジヘッダーが追加されてXML がX12 フォーマットに変換されます。

このフローの最も手間のかかるステップは、XML マッピングの作成です。マッピングでは、親ノード間の`Foreach` 関係を確立し、その後、ドラッグアンドドロップ、Node Value Editor の使用、条件の追加、カスタムスクリプトの記述を組み合わせて個々のリーフノードをマッピングする必要があります。

## サンプルデータ

### データベースのXML 構造

```xml theme={null}
<Items>
  <test_purchase_orders selectQuery="SELECT * FROM `test_purchase_orders` WHERE `Processed` = 0">
    <PONumber key="true" />
    <CurrencyCode />
    <CustomerID />
    <PODate type="datetime" />
    <Processed type="int" updateValue="1" />
    <RemitToAddr />
    <RemitToCountry />
    <RemitToID />
    <RemitToState />
    <RemitToZip />
    <ShipToAddr />
    <ShipToCountry />
    <ShipToID />
    <ShipToState />
    <ShipToZip />
    <Terms />
    <test_po_line_items selectQuery="SELECT * FROM `test_po_line_items` WHERE `PONumber` = ${PONumber}">
      <ItemID key="true" />
      <PONumber />
      <PricePerUnit type="double" />
      <Quantity type="int" />
      <TaxPercent type="double" />
    </test_po_line_items>
  </test_purchase_orders>
</Items>
```

### X12 810

```text theme={null}
ISA*00*          *00*          *ZZ*VENDOR         *ZZ*AMAZON         *090322*1001*U*00400*000001631*0*T*>~
GS*IN*VENDOR*AMAZON*20090322*1001*480*X*004010~
ST*810*0001~
BIG*20090320*5002841638*20090311*Q6515853~
CUR*BT*CAD~
N1*RI*VENDORNAME~
N3*PO BOX 1234~
N4*TORONTO*ON*M5W 5M5*CA~
N1*ST*AMAZON CANADA~
N3*500 MCCARTHY DR*FAIRVIEW BUSINESS PARK~
N4*MISSISSAUGA*ON*L5R 3W5*CA~
ITD*01*3*****60~
IT1*1*4*EA*12.6*NT*UP*786932788990*VN*1012380100000*PO*Q2515852~
TXI*GS*2.52*5~
IT1*2*30*EA*29.5*NT*UP*786936725951*VN*1000570100000*PO*Q2515852~
TXI*GS*44.25*5~
IT1*3*90*EA*22.5*NT*UP*782936735321*VN*0543900100000*PO*Q2515852~
TXI*GS*101.25*5~
IT1*4*5*EA*29.5*NT*UP*786936782268*VN*1000570200000*PO*Q2515852~
TXI*GS*7.38*5~
TDS*326330~
TXI*GS*155.4*5*****3108*954090650~
CTT*4*129~
SE*22*0001~
GE*1*480~
IEA*1*000001631~
```
