uCosminexus Interschema ユーザーズガイド

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

4.2.2 マップ式の定義

マップ式を定義する必要があるのは,出力フォーマットビューで,マップ式の定義が必須であることを示すマークが表示されているコンポーネント,可変回出現コンポーネント,及び省略できない型コンポーネントです。

[図データ]

ここでは,出力側のルート構造「MSG1」の子コポーネントすべてにマップ式を定義する必要があります。フォーマット「SEPA1」とフォーマット「FIX1」のコンポーネント間の対応を次に示します。

[図データ]

フォーマット「FIX1」の「注文日」以外の要素は,入力側のフォーマット「SEPA1」のコンポーネントを,出力側のフォーマット「FIX1」の同じ名前のコンポーネントに代入するマップ式を記述します。「注文日」は,入力側の同じ名前のコンポーネントを代入するのではなく,データ変換時の日付が出力されるように設定したいので,関数を使用したマップ式を記述します。

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

<この項の構成>
(1) 要素「注文番号」「単位」「品名」のマップ式
(2) 要素「単価」「個数」「金額」のマップ式
(3) 要素「注文日」のマップ式

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

出力フォーマットのコンポーネントに,対応する入力フォーマットのコンポーネントをドラッグ&ドロップし,代入のマップ式を定義します。

まず,要素「注文番号」に代入のマップ式を記述します。

  1. 出力フォーマットの「注文番号」をクリックして選択します

    [図データ]

  2. 入力フォーマットの「注文番号」をクリックして選択し,「注文番号」を出力フォーマットの「注文番号」へドラッグ&ドロップします

    [図データ]

    出力フォーマットの「注文番号」にはマップ式が定義済みであることを示すマークが付き,マップビューには出力フォーマットの「注文番号」のマップ式が表示されます。マップ式を次に示します。
     
    = SEPA1@MSG1@注文番号 ;
     
    代入のマップ式には,ドラッグ&ドロップしたコンポーネント名が表示されます。コンポーネント名は,フォーマット名,ルート構造から目的のコンポーネントまでを「@」でつないだグローバル名で表します。ここでは,出力フォーマットの「注文番号」には,入力フォーマット「SEPA1」のルート構造「MSG1」の子コンポーネント「注文番号」を代入する,という意味のマップ式です。
  3. 「単位」及び「品名」のマップ式を記述します
    「注文番号」と同様に,対応する入力フォーマットのコンポーネントをドラッグ&ドロップし,代入のマップ式を記述します。

    [図データ]

(2) 要素「単価」「個数」「金額」のマップ式

要素「単価」「個数」「金額」は複数回出現するコンポーネントです。入力側と出力側のコンポーネントを対応付けて代入のマップ式を記述するときに,出現順序を対応付けるINDEX関数を使用します。

INDEX関数は,引数で指定したコンポーネントの現在の出現番号(インデクスと呼びます)を取り出し,コンポーネント間の出現順序を1対1で対応付けます。例えば,互いに4回出現する入力側のコンポーネント「A」と出力側のコンポーネント「D」を対応付けたいとします。

[図データ]

1回目に出現した「A」の値は1回目に出現した「D」の値として代入し,2回目に出現した「A」の値は2回目に出現した「D」の値に代入する,というようにコンポーネント間の値の代入を出現回数で対応付けます。

[図データ]

この場合,コンポーネント「D」に対してINDEX関数を使用したマップ式を記述します。入力側のコンポーネント「A」を出力側のコンポーネント「D」にドラッグ&ドロップで代入すると,次のようなマップ式が表示されます。

 
=IN@ROOT@A[INDEX(  )] ;
 

INDEX関数の括弧内の引数は,式が記述されているコンポーネントの位置を起点として階層数を表すもので,インデクス値の参照先となるコンポーネントを指定します。「0」はマップ式を記述する自コンポーネント,「n」はマップ式を記述するコンポーネントからn階層分,上位に位置するコンポーネントを表します。INDEX関数の引数の指定例を図4-8に示します。

図4-8 INDEX関数の引数の指定例

[図データ]

コンポーネント「D」は自コンポーネントに複数回の出現回数が定義されているので,引数で「0」を指定して自コンポーネントのインデクスを取り出し,その同じインデクスのコンポーネント「A」の値を代入します。マップ式を次に示します。

 
=IN@ROOT@A[INDEX(0)] ;
 

INDEX関数で,自コンポーネントである「D」のインデクスを取り出します。インデクスが「1」の場合は,1回目に出現したコンポーネント「A」の値が1回目に出現したコンポーネント「D」に代入されます。同様に,インデクスに対応した値が代入されます。

「INDEX(0)」と記述する代わりに,入力側と出力側の出現順序を対応付ける略記法「?」も使用できます。その場合のマップ式を次に示します。

 
=IN@ROOT@A[?] ;
 

では,実際にINDEX関数を使用したマップ式を記述します。

まず,要素「単価」のマップ式を記述します。

  1. 出力フォーマットの「単価」を選択し,入力フォーマットの「単価」をドラッグ&ドロップします
    マップビューに次のマップ式が表示されます。
     
    = SEPA1@MSG1@単価 [INDEX(  )] ;
     
    「単価」は,3回出現するコンポーネントなので,マップ式にはINDEX関数を使用します。入力側のコンポーネント「単価」と出力側のコンポーネント「単価」を1対1で出現順序を対応付けます。

    [図データ]

    ここでは,自コンポーネントである出力側のコンポーネント「単価」を指定したいので,INDEX関数の引数に「0」を記述します。出力側のコンポーネント「単価」のインデクスを取り出し,入力側と出力側の「単価」の出現順序を対応付けるように指定します。
  2. カーソルがINDEX関数の括弧内に位置づけられているので,括弧内に「0」と入力します
    マップ式を次に示します。
     
    = SEPA1@MSG1@単価 [INDEX(0)] ;
     
    これで,入力側と出力側の「単価」の出現順序が対応付けられました。
  3. 「個数」及び「金額」のマップ式を記述します
    「単価」と同様に,INDEX関数を使用したマップ式を記述します。

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

要素「注文日」は,入力フォーマットの「注文日」を代入するのではなく,データを変換したときの日付が出力されるように,関数を使用してマップ式を記述します。

  1. 出力フォーマットの「注文日」を選択します
    ここでは,コンポーネントをドラッグ&ドロップするのではなく,マップビューに式を直接記述します。マップ式で使用する演算子,関数,及び特殊記号は直接入力できますが,ダイアログからも選択できます。ダイアログから選択した演算子や関数は,マップビュー内のカーソル位置に挿入されます。

    [図データ]

    マップ式の左辺には,マップ式を定義するコンポーネント名が表示されます。
    ここでは,日付を設定するために関数を使用します。
  2. [関数]ボタンをクリックします
    [関数名]ダイアログが表示されます。

    図4-9 [関数名]ダイアログ

    [図データ]

  3. 一覧から関数を選択します
    ここでは,データを変換するときの日付を「注文日」に出力したいので,現在の日付を返す関数「CURRENTDATE」を選択します。
  4. [OK]ボタンをクリックします
    マップビューに選択した関数が挿入されます。

    [図データ]

    要素「注文日」のマップ式を次に示します。
     
    = CURRENTDATE();
     
    CURRENTDATE関数には引数は必要ないので,ここではこれ以上記述する必要はありません。要素「注文日」には,データを変換するときの日付が出力されるようになりました。

以上ですべての要素にマップ式が定義できました。

マップ式の記述法として,マップ式左辺の先頭に代入式のイコール「=」,マップ式の最後にセミコロン「;」が必要です。マップ式を直接入力して記述する場合は,「=」,「;」の記述もれがないように注意してください。

各コンポーネントのマップ式を表4-3に示します。

表4-3 各コンポーネントのマップ式(簡単なマッピング例)

要素 マップ式
注文番号 = SEPA1@MSG1@注文番号 ;
単位 = SEPA1@MSG1@単位 ;
単価 [3] = SEPA1@MSG1@単価 [INDEX(0)] ;
個数 [3] = SEPA1@MSG1@個数 [INDEX(0)] ;
金額 [3] = SEPA1@MSG1@金額 [INDEX(0)] ;
注文日 = CURRENTDATE() ;
品名 = SEPA1@MSG1@品名 ;