CData Arc - XML Map コネクタでのキーブレイク処理の設定例

CData Arc - XML Map コネクタでのキーブレイク処理の設定例

こんにちは。CData Software Japan の色川です。

この記事では、CData Arc の「XML Map コネクタ」を利用したキーブレイク処理の設定例についてご紹介します。


   
   

目次

XML Map コネクタ

CData Arc は、データの操作と変換の中間形式としてXML を使用します。多くのコネクタは、さまざまな形式のファイルをXML に、またはその逆に変換します。さらにArc ではXML を使用してデータベースやSaaS などバックエンドシステムの入力と出力をモデル化します。この仕組みにより、様々なフォーマットのファイルやデータベース・SaaS などのバックエンドシステムをシームレスにつなぐことができます。このようなアーキテクチャを持つArc にとって、XML フォーマットをマッピングするXML Map コネクタは中核的なコネクタの1つです。

XML Map コネクタ

多くの機能やコネクタと同じように、XML Map コネクタも改善・強化が継続的に実施されており、直近のアップデートでは、スキーマの検索や編集機能が大きく強化されています。

XML Map コネクタは強力なマッピング機能を備えています。XML Map コネクタの機能について詳しくはヘルプトピックを。マッピングの概要については、こちらのナレッジベースビデオチュートリアルなども参考にしていただけます。あわせて活用ください。

キーブレイク(コントロールブレイク)処理

複数のレコード(ノード)を含むインプットデータ(メッセージファイル)を対象にして「同じキー項目を持つレコードの境目(キー項目が切り替わるタイミング)で何らかの処理を行いたいシナリオ」は、わりと良くあるケースかと思います。いわゆる「キーブレイク(コントロールブレイク)処理」ですね。

例えば「キー項目の値が変わった場合のみレコードを出力したい」場面や「あるキー項目の値が同じレコード単位に集計値を出力したい」場面などは、業種・業態を問わず機会が多そうです。もちろん、前者であれば「重複排除されたデータ」が、後者であれば「レコード単位に集計済のデータ」が、データソースから取得する段階で得られていればよりシンプルですが、外部から連携されるデータソースなどの場合は、連携フローの中でこれらの処理が必要となるケースも多いと思います。

この記事では、XML Map コネクタが持つ豊富な機能のうち「条件エディタ」と「変数」を活用しています。条件エディタの基本的な使い方については、こちらの記事が。変数(_map オブジェクト)の基本的な使い方については、こちらの記事が参考にしていただけます。

キーブレイク処理の設定例

それでは、それぞれの設定例を紹介していきます。

A.あるキー項目の値が変わった場合のみレコードを出力したい

まずは「キー項目の値が変わった場合のみレコードを出力したい」場合の設定をためしていきます。この設定例での「処理対象のインプット」や「期待するアウトプット」、「テンプレートファイル」などは以下の通りです。

[処理対象のインプット]


    
        A
        X
    
    
        A
        X
    
    
        B
        Y
    
    
        C
        Z
    
    
        C
        Z
    

[期待するアウトプット]


    
        A
        X
    
    
        B
        Y
    
    
        C
        Z
    

[テンプレートファイル]


    
        
        
    

まずは、この記事の例はインプットもアウトプットも同じデータ構造ですので、ソース側も宛先側も同じテンプレートファイル(データ構造)を指定します。

キーブレイク処理の設定例

キーブレイク処理の設定例

次に、繰り返しループ(Foreach)が設定されているレコード(Item)の子要素として、ループした直近のレコードが持つId を記録しておく変数(_Id)を作成します。変数は、ArcScript の特殊な組込みオブジェクトの1つである_map オブジェクトの属性として構成されます。

キーブレイク処理の設定例

キーブレイク処理の設定例

キーブレイク処理の設定例

変数(_Id)に、キー項目(Id)の値をマッピングします。

キーブレイク処理の設定例

繰り返しループ(Foreach)が設定されているレコード(Item)のマッピング条件として、Id の値が直近に処理したレコードから変わった場合もしくは最初に処理するレコードの場合のみレコードを出力するように、条件設定をします。

キーブレイク処理の設定例

キーブレイク処理の設定例

条件エディタにおいて、このシナリオのように「静的な値との比較ではない(動的な値同士での比較)」には、スクリプトモードでArcScript を利用したカスタム条件を指定します。

'[xpath(Id)]' != '[_map._Id | def]'

これでこの設定例のマッピングはできあがりです。

キーブレイク処理の設定例

テスト実行で試してみると、期待するアウトプットになっていることが確認できます。

キーブレイク処理の設定例

キーブレイク処理の設定例

B.あるキー項目の値が同じレコード単位に集計値を出力したい

まずは「あるキー項目の値が同じレコード単位に集計値を出力したい」場合の設定をためしていきます。この設定例での「処理対象のインプット」や「期待するアウトプット」、「テンプレートファイル」などは以下の通りです。

[処理対象のインプット]


    
        A
        10
    
    
        A
        15
    
    
        B
        20
    
    
        C
        25
    
    
        C
        35
    

[期待するアウトプット]


    
        A
        25
    
    
        B
        20
    
    
        C
        60
    

[テンプレートファイル]


    
        
        
    

このケースの場合「キー項目(Id)が変わるまで変数に集計をしておき、キー項目(Id)が変わったタイミングで直近までに集計したレコードを出力する」という点が、A.の例と大きく異なります。A. の例は「キー項目が変わったタイミングで現在ループ処理対象となっているレコードを出力してキー項目が変わるまでは出力しない」ロジック、B. の例は「キー項目が変わったタイミングでそれまでに集計されていた処理対象を出力して現在ループ処理対象となっているレコードのキー項目で集計を開始する」ロジック、というイメージです。またキー項目の単位での集計となるため、キー項目が変わったタイミングで出力した集計値のリセットなども必要です。A. の例と比べると少し応用的なマッピング設定といえるかも知れません。

まずは、この記事の例はインプットもアウトプットも同じデータ構造ですので、ソース側も宛先側も同じテンプレートファイル(データ構造)を指定します。

キーブレイク処理の設定例

キーブレイク処理の設定例

この設定例では、宛先側のItem ノードでは集計した値(変数)をマッピング(出力)するように構成します。そのためデフォルトで設定された同名のマッピングを削除しておきます。

キーブレイク処理の設定例

キーブレイク処理の設定例

次に、この設定例では、宛先側のItem ノードでは集計した値(変数)をマッピング(出力)するため、ソース側のレコード群(Item)と対になる繰り返しポイントとしてループ(Virtual Loop)を作成して、マッピングします。

キーブレイク処理の設定例

キーブレイク処理の設定例

キーブレイク処理の設定例

キーブレイク処理の設定例

キーブレイク処理の設定例

次に、繰り返しループ(Foreach)が設定されているループ(loop)配下にあるItem ノードと同レベルの次の要素として、ループした直近のレコード(集計対象のレコード)が持つId を記録しておく変数(_Id)と、集計値を記録しておく変数(_Value)を作成します。

キーブレイク処理の設定例

キーブレイク処理の設定例

キーブレイク処理の設定例

キーブレイク処理の設定例

キーブレイク処理の設定例

変数(_Id)に、キー項目(Id)の値をマッピングします。

キーブレイク処理の設定例

変数(_Value)に、ループした直近のレコードが持つ値(Value)を加算するようマッピングします。

キーブレイク処理の設定例

キーブレイク処理の設定例

[_map._Value | add([xpath("Value")])]

キーブレイク処理の設定例

次に、集計した値(変数)をマッピング(出力)するためのItem ノードにおいて、Id の値が直近に処理したレコードから変わった場合、もしくは最初に処理するレコードの場合(_Id の変数が未定義の場合)のみレコードを出力するように、条件設定をします。

キーブレイク処理の設定例

キーブレイク処理の設定例

条件エディタにおいて、このシナリオのように「静的な値との比較ではない(動的な値同士での比較)」には、スクリプトモードでArcScript を利用したカスタム条件を指定します。

'[_map._Id | def([xpath(Id)])]' != '[xpath(Id)]'

キーブレイク処理の設定例

次に、Item ノードで集計した値がマッピング(出力)されるように、それぞれ変数の値をマッピングします。

キーブレイク処理の設定例

キーブレイク処理の設定例

キーブレイク処理の設定例

キーブレイク処理の設定例

集計値を出力した後に、集計値を記録する変数(_Value)をリセットするようにコードスクリプトを作成して、変数(_Value)をゼロリセットするように設定(0 をマッピング)します。

キーブレイク処理の設定例

キーブレイク処理の設定例

キーブレイク処理の設定例

キーブレイク処理の設定例

最後に、この設定例の構成だと、最後のレコード群(Id が3 の集計値)が繰り返しループ(loop)の中で出力されませんので、ループ終了後に、集計値(出力すべき処理対象)があれば、最後の集計レコードとして出力するように構成します。

Item ノードをコピーして、Items ノード配下のループ終了後の位置に子要素として貼り付けます。

キーブレイク処理の設定例

キーブレイク処理の設定例

キーブレイク処理の設定例

ここでは集計値をリセットするスクリプトノードは不要なので削除しておきます。

キーブレイク処理の設定例

キーブレイク処理の設定例

コピーしたItem ノードで「集計値(出力すべき処理対象)がある場合のみ、最後の集計レコードを出力する」ように、条件設定をします。

キーブレイク処理の設定例

キーブレイク処理の設定例

'[_map._Id | def(false, true)]'

キーブレイク処理の設定例

これでこの設定例のマッピングはできあがりです。

キーブレイク処理の設定例

テスト実行で試してみると、期待するアウトプットになっていることが確認できます。

キーブレイク処理の設定例

キーブレイク処理の設定例

その他

この記事の例では、処理対象とするインプットデータ(メッセージファイル)が「キー項目でソートされている状態」を前提にしています。もしレコードの出現順がソートされていないような場合は、事前にソートしておく必要がありますので留意してください。

また、A. の例のような「重複排除」や、B. の例のようなグループ集計等については、この記事のようにフローの途中(XML Map コネクタを利用したマッピングプロセス)に実行するのではなく、データソースから取得する段階(フローの起点)で実施するアプローチの方がよりシンプルに実現できる場面も多いかも知れません。その場合、SaaS やDBMS はもちろん、CSV やExcel ファイル、XML やJSON のようなファイルデータをデータソースとしたい場面においても、Arc とCData Drivers を組み合わせて利用すれば、SQL ベースでデータを取得することができます。どのようなアプローチがよりフィットするかは、自動化したいデータ連携フローの目的や制約・条件等によっても異なりますので、それぞれのシナリオにあわせて選択してください。

まとめ

この記事では、CData Arc の「XML Map コネクタ」を利用したキーブレイク処理の設定例についてご紹介しました。

XML Map コネクタは、CData Arc の中でも中核的なコネクタです。今回の記事で紹介したような設定例を含め、データマッピングに必要とされる豊富な機能を提供しています。XML Map コネクタの詳細については、ヘルプトピックもぜひご参照ください。

CData Arc はシンプルで拡張性の高いコアフレームワークに、豊富なMFT・EDI・エンタープライズコネクタを備えたパワフルな製品です。CData Drivers との組み合わせで270を超えるアプリケーションへの連携を実現できます。

皆さんのつなぎたいシナリオでぜひ CData Arc を試してみてください。
CData Arc - セキュアなデータ連携とマネージドファイル転送(MFT)

製品を試していただく中で何かご不明な点があれば、テクニカルサポートへお気軽にお問い合わせください。

CData Software Japan - Support Form


この記事では CData Arc™ 2024 - 24.3.9133.0 を利用しています

関連コンテンツ