uCosminexus Interschema ユーザーズガイド

[目次][用語][索引][前へ][次へ]

4.3.1 構造を含んだマッピング

ここでは,レングスタグ形式のフォーマットから固定長形式のフォーマットへマッピングする例を使用し,構造が階層化されたデータのマッピングについて説明します。

レングスタグ形式のフォーマットとして「LT2」,固定長形式のフォーマットとして「FIX2」を使用します。データの構造を図4-11に示します。

図4-11 フォーマット「LT2」「FIX2」のデータの構造

[図データ]

入力側のデータのレングスタグ構造には,各要素のサイズを表す要素「LEN」がありますが,出力側のデータにはこの要素は必要ありません。したがって,マップ式は,レングスタグ構造の実際の値を持つ要素だけを取り出すマップ式を記述します。

[図データ]

要素ごとにマップ式の定義について説明します。

<この項の構成>
(1) 要素「注文番号」「単位」のマップ式
(2) 構造「明細」のマップ式
(3) 構造「明細」の子コンポーネントのマップ式
(4) 構造「分納」の子コンポーネントのマップ式
(5) 要素「注文日」のマップ式
(6) 要素「注文総額」のマップ式

(1) 要素「注文番号」「単位」のマップ式

入力フォーマットの「注文番号」を出力フォーマットの「注文番号」にドラッグ&ドロップし,代入のマップ式を記述します。

[図データ]

マップ式を次に示します。

 
= LT2@MSG2@S注文番号@注文番号 ;
 

要素「単位」も要素「注文番号」と同様に代入のマップ式を記述します。

(2) 構造「明細」のマップ式

マップ式は,構造に対しても記述できます。構造に対するマップ式は,入力側と出力側それぞれの出現順序の関係を対応付けます。要素のマップ式と同様に,入力側の構造を出力側の構造へドラッグ&ドロップして記述できます。複数回出現する構造には,複数回出現する要素のマップ式の記述と同様に,INDEX関数を使用したマップ式を記述します。

構造「明細」のマップ式を記述します。出力側の構造「明細」は,入力側の構造「明細」とマッピングします。

  1. 出力側の構造「明細」を選択し,入力側の構造「明細」をドラッグ&ドロップします
    マップ式を次に示します。
     
    = LT2@MSG2@明細[INDEX(  )] ;
     
    構造「明細」は,複数回出現するので,INDEX関数を使用します。出力側の構造「明細」自身を指定したいので,引数には自コンポーネントを表す「0」を指定します。
  2. INDEX関数の括弧内に引数として「0」を記述します
    これで入力側の構造「明細」と出力側の構造「明細」が対応付けられました。

(3) 構造「明細」の子コンポーネントのマップ式

構造「明細」の子コンポーネントのマップ式を記述します。

親の構造「明細」のマップ式で入出力の関係が定義されているので,子コンポーネントの式には構造「明細」のマップ式を引き継ぐ形のマップ式を記述します。

まず,要素「単価」は,入力側の構造「明細」の子コンポーネント「単価」を代入するので「入力側の単価要素を代入する」という意味の式を記述します。

  1. 出力フォーマットの「単価」を選択します
    入力側の「単価」を選択して,出力側の「単価」へドラッグ&ドロップします。
    この場合のマップ式を次に示します。
     
    = $@S単価@単価 ;
     
    「$」は親コンポーネントの構造で定義してあるマップ式を引き継ぐための記述法です。ここでは,親コンポーネントの構造「明細」は,入力側の構造「明細」と対応付けられています。したがって,マップ式は,入力側の構造「明細」の孫コンポーネント「単価」の値を代入する,という意味になります。既に親コンポーネントの構造同士でインデクスが対応付けられているので,ここではインデクスについて記述する必要はありません。
    なお,ドラッグ&ドロップで親コンポーネントのマップ式を引き継ぐ場合,親(先祖)のコンポーネントのマップ式が正しく記述されている必要があります。親(先祖)のコンポーネントのマップ式が記述されていない,又は誤りがある場合は,$を使用して引き継ぐ形のマップ式は記述しません。
  2. 「単価」と同様に,要素「個数」「金額」,構造「分納」も親コンポーネントのマップ式を引き継ぐマップ式を記述します
    構造「分納」は複数回出現するので,INDEX関数を使用してインデクスを対応付けます。
     
    = $@分納[INDEX(0)] ;
     
    引数には自コンポーネントを表す「0」を指定します。

(4) 構造「分納」の子コンポーネントのマップ式

分納構造の子コンポーネント「納入数」「納入番号」は「$」を使用して,親コンポーネントの構造「分納」のマップ式を引き継ぐ形式のマップ式を記述します。

 
= $@S納入数@納入数;
 

(5) 要素「注文日」のマップ式

要素「注文日」は,「4.2 簡単なマッピング例」での例と同様に,データ変換時の日付を出力するようにしたいので,CURRENTDATE関数のマップ式を記述します。

 
= CURRENTDATE();
 

(6) 要素「注文総額」のマップ式

要素「注文総額」は,出力した構造「明細」の「金額」の合計を出力する要素です。したがって,出力した構造「明細」の「金額」の合計を計算するマップ式を記述します。ここでは関数を使用します。

  1. 出力側の「注文金額」を選択します
  2. [関数]ボタンをクリックして[関数]ダイアログを表示します
  3. 一覧から,要素の合計値を計算するSUM関数を選択します
    マップ式を次に示します。
     
    = SUM(  ) ;
     
  4. SUM関数の引数として,合計値を計算する要素のグローバル名を記述します
    ここでは,出力側の「金額」の合計を計算するので,引数に「FIX2@MSG2@明細[*]@金額」と記述します。インデクス「*」は,すべての構造の出現を意味する記述法です。ここでは,すべての構造「明細」の出現を意味します。つまり,明細[1],明細[2]及び明細[3]の「金額」をすべて合計する,という意味になります。なお,インデクス「*」は,SUM関数などの特定の関数の引数だけで使用できる略記法です。
    「注文総額」のマップ式を次に示します。
     
    = SUM( FIX2@MSG2@明細[*]@金額 ) ;
     
    また,要素「金額」は3回しか現れないので,四則演算でマップ式を記述してもかまいません。四則演算を使用した要素「金額」マップ式を次に示します。
     
    = FIX2@MSG2@明細[1]@金額 + FIX2@MSG2@明細[2]@金額 + FIX2@MSG2@明細[3]@金額 ;
     
    SUM関数のマップ式と同じ結果が得られます。
    以上で,レングスタグ形式のフォーマット「LT2」と,固定長形式のフォーマット「FIX2」のマッピングが定義できました。
    各コンポーネントのマップ式を表4-4に示します。

    表4-4 各コンポーネントのマップ式(構造を含んだマッピング例)

    構造/要素 マップ式
    注文番号 = LT2@MSG2@S注文番号@注文番号;
    単位 = LT2@MSG2@S単位@単位 ;
    明細 = LT2@MSG2@明細[INDEX(0)] ;
       単価 = $@S単価@単価 ;
    個数 = $@S個数@個数 ;
    金額 = $@S金額@金額 ;
    分納 = $@分納[INDEX(0)] ;
       納入数 = $@S納入数@納入数 ;
    納入番号 = $@S納入番号@納入番号 ;
    注文日 = CURRENTDATE() ;
    注文総額 = SUM(FIX2@MSG2@明細[*]@金額) ;