uCosminexus Interschema ユーザーズガイド

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

4.3.4 条件式とNULLを使用したマッピング

ここでは,コンポーネントに対する条件を定義する条件式を使用したマップ式の記述について説明します。値のマッピングと同様,この例でも固定長形式のフォーマット「FIX2」とセパレータ形式のフォーマット「SEPA2」をマッピングします。データの構造を図4-15に示します。

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

[図データ]

この例では,構造「分納」の子コンポーネント「納入数」に次の二つの規則があると想定して,マップ式を記述します。

この規則では,1番目の要素「納入数」の値は最大50であり,要素「個数」の値でもあります。2番目の要素「納入数」は,1番目の要素の残りを値として出力するか又は出力されません。以上の規則に従って,マップ式を記述します。

まず,「個数」の値によって2番目の「分納」を出力するかしないかを,「分納」に対してマップ式で記述します。ここでは,IF関数を使用して条件式を記述します。IF関数には引数が三つあります。IF関数の引数に記述する内容について次に説明します。

「分納」に対するマップ式を次に示します。

 
= IF((INDEX(0) == 1 | \2@個数 > 50), $, NULL);
 

「\n」は式を定義するコンポーネントからn階層上のコンポーネントを表すので,「\2」は「分納」から2階層上のコンポーネント,つまり出現中の「明細」を示します。「$」は親コンポーネントのマップ式を引き継ぐための指定で,ここではコンポーネントの出力を意味します。「NULL」はコンポーネントを出力しない指定です。

[図データ]

「分納」の出現番号と構造「明細」の子コンポーネント「個数」の値を条件とし,「分納」を出力するかしないかを定義しています。

次に,「納入数」に対するマップ式を示します。

 
= IF (INDEX(1) == 1, IF(\3@個数 > 50, 50, \3@個数), \3@個数 - 50);
 

上記マップ式では,IF関数を二つ使用しています。「\3」は「納入数」から3階層上のコンポーネント,つまり出現中の「明細」を示します。

[図データ]

「分納」の出現番号と「個数」の値を条件とし,「納入数」の値を定義しています。

次に,「納入番号」に対するマップ式を次に示します。

 
= IF(INDEX(1) == 1, "FIRST  ", "SECOND ");
 

「FIRST」及び「SECOND」は,出現番号を表すために仮に使用した文字列です。

[図データ]

「分納」の出現番号を条件とし,何番目の「納入数」に対応する納入番号として出力するかを定義しています。

以上で,条件式にNULLを使用したマップ式が定義できました。なお,親のマップ式を引き継ぐ記述法「$」をマップ式で使用する場合は,親階層以上のコンポーネントにマップ式を定義しておく必要があります。また,必ず出現しなければならないコンポーネントに対して「NULL」のマップ式を記述すると,データを変換するときにエラーとなるので注意してください。

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

表4-6 各コンポーネントのマップ式(条件式とNULLを使用したマッピング例)

構造/要素 マップ式
MH 注文番号 = FIX2@MSG2@注文番号;
単位 = VALUEMAP( FIX2@MSG2@単位, #, 1, 1, 2, 2, 3, 3 ) ;
明細 = FIX2@MSG2@明細[INDEX(0)];
   単価 = $@単価;
個数 = $@個数;
金額 = $@金額;
S分納 なし
  分納 = IF((INDEX(0) == 1 | \2@個数 > 50), $, NULL);
  納入数 = IF (INDEX(1) == 1, IF(\3@個数 > 50, 50, \3@個数), \3@個数 - 50);
納入番号 = IF(INDEX(1) == 1, "FIRST ", "SECOND ");
MT 注文日 =CURRENTDATE( );
注文総額 =SUM(SEPA2@MSG2@明細[*]@金額);