uCosminexus Interschema ユーザーズガイド

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

4.3.2 レングスタグフォーマットへのマッピング

ここでは,固定長形式のフォーマットからレングスタグ形式のフォーマットへのマッピングについて説明します。

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

図4-12 フォーマット「FIX1」「LT1」のデータの構造

[図データ]

レングスタグ形式の構造は,要素サイズを表す要素(ここでは要素「LEN」)があります。要素「LEN」には,直接対応する要素が入力側にありません。入力データの形式が固定長の場合は,入力側の要素のサイズは決まっているので,レングスタグのサイズを表す要素に対して,固定値を代入することでマップ式を定義できます。

しかし,注意点として,入力側の要素のデータから不要なスペースなどを削除してデータを出力する場合は,データの内容によって出力される要素のサイズが異なってしまいます。また,入力側の要素が可変長の場合も同様の問題が発生します。

この対策として,レングスタグ構造の要素サイズを表す要素には,実際に出力要素として代入された要素のサイズを代入するマップ式を記述する必要があります。ここでは,マップ式の評価を遅延(待機)させる指定「%delay」とコンポーネントのサイズを計算する関数「LENGTH」を使用します。

<この項の構成>
(1) 評価順序を遅延(待機)させるマップ式
(2) 代入のマップ式
(3) %delayのマップ式

(1) 評価順序を遅延(待機)させるマップ式

普通,マップ式は出力側の要素の出現順に評価されます。また,前提として,マップ式が評価される時点では,式中に現れるすべてのコンポーネントの値が決まっていなければいけません。この場合,式に記述するコンポーネントが入力側の要素であれば問題ありませんが,レングスタグ構造では出力側の要素を指定する必要があります。

例えば,要素「LEN」に対する式を評価する時点では,まだ要素「DATA」の値は決まっていないため,単純にマップ式中に要素「DATA」を記述すると,式の評価結果はエラーになってしまいます。

[図データ]

要素「DATA」の値が決まるまで,要素「LEN」のマップ式評価を待機させる必要があります。このために,評価順序を遅延(待機)させる「%delay」を利用します。評価順序遅延指定には次の2種類があります。

要素「LEN」の次のコンポーネントである「DATA」が評価されるまで,要素「LEN」のマップ式評価を遅延(待機)させるには,「%delay %next」を指定します。同時に,LENGTH関数を使用してサイズを計算します。LENGTH関数は,引数で指定されたコンポーネントのサイズを計算する関数です。レングスタグ構造の下の要素で,実際の値を持つ要素を指定します。ここでは,実際の値を持つ要素として「DATA」を指定します。

要素「LEN」に対するマップ式を次に示します。

 
%delay %next =LENGTH(OUT@ROOT@LENGTHTAG@DATA);
 

要素「DATA」のサイズが計算されるまで,要素「LEN」のマップ式定義を遅延させる,という指定になります。

評価順序遅延指定は,同じ親コンポーネントを持つ兄弟コンポーネントの中で複数指定できません。また,評価順序遅延指定に誤りがあると,重大なエラーの原因となるおそれがあるので注意してください。

(2) 代入のマップ式

レングスタグ構造の実際のデータを持つ要素は,対応する入力側のコンポーネントをドラッグ&ドロップし,代入のマップ式を記述します。構造「S注文番号」の子コンポーネント「注文番号」のマップ式を次に示します。

 
= FIX1@MSG1@注文番号;
 

また,複数回出現する構造の子コンポーネントの場合は,INDEX関数を使用した代入のマップ式を記述します。構造「S単価」の子コンポーネント「単価」は3回出現するコンポーネントですが,複数回出現は親コンポーネントに定義されています。

[図データ]

したがって,コンポーネント「S単価」のインデクスを取り出して,出現順序を対応付ける必要があります。INDEX関数の引数に,出力側のコンポーネント「単価」の1階層上のコンポーネントを表す「1」を記述し「S単価」を指定します。この場合のマップ式を次に示します。

 
= FIX1@MSG1@単価[INDEX(1)] ;
 

(3) %delayのマップ式

次に,要素「LEN」マップ式を記述します。

ここでは,構造「S注文番号」の子コンポーネント「LEN」のマップ式を記述します。「LEN」は次のコンポーネント「注文番号」の値を代入するので,「注文番号」の値が決まるまでマップ式評価を遅延させる必要があります。

[図データ]

そこで,評価順序を遅延させる「%delay」を指定します。

  1. 構造「S注文番号」の子コンポーネント「LEN」を選択します
    マップビューに式を記述します。
  2. マップ式に評価遅延指定「%delay %next」を記述します
    「%delay %next」はテキストに直接記述するか又は[特殊記号]ダイアログで選択してマップ式に挿入します。
  3. マップ式にLENGTH関数を記述します
    テキストに直接記述するか又は[関数]ダイアログで選択してマップ式に挿入します。マップ式を次に示します。
     
    %delay %next = LENGTH(  ) ;
     
  4. LENGTH関数の引数として,括弧内に実際の値を持つ要素を指定します
    構造「S注文番号」の子コンポーネント「注文番号」を指定します。
  5. 出力側の「注文番号」をマップ式の括弧内にドラッグ&ドロップします

    [図データ]

    すると,次のマップ式が表示されます。
     
    %delay %next = LENGTH(LT1@MSG1@S注文番号@注文番号 ) ;
     
    また,複数出現する構造の子コンポーネントのマップ式定義では,INDEX関数を使用します。構造「S単価」の子コンポーネント「LEN」のマップ式を次に示します。
     
    %delay %next = LENGTH( LT1@MSG1@S単価[INDEX(1)]@単価 ) ;
     
    INDEX関数の引数には,構造「S単価」を指定したいので,1階層上のコンポーネントを表す「1」を指定します。
    また,略記法を用いると,構造「S単価」の子コンポーネント「LEN」のマップ式は次のようになります。
     
    %delay %next = LENGTH( \1@単価 ) ;
     
    \n」はn階層上の親の構造を表すので,この場合「\1」は「注文番号」の親構造「S注文番号」になります。

以上で,固定長形式のフォーマット「FIX1」とレングスタグ形式のフォーマット「LT1」のマップ式が定義できました。

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

表4-5 各コンポーネントのマップ式(レングスタグフォーマットへのマッピング例)

構造/要素 マップ式
S注文番号 LEN %delay %next = LENGTH(\1@注文番号);
注文番号   = FIX1@MSG1@注文番号;
S単位 LEN %delay %next = LENGTH(\1@単位);
単位   = FIX1@MSG1@単位;
S単価 [3] LEN %delay %next = LENGTH(\1@単価);
単価   = FIX1@MSG1@単価[INDEX(1)];
S個数 [3] LEN %delay %next = LENGTH(\1@個数);
個数   = FIX1@MSG1@個数[INDEX(1)];
S金額 [3] LEN %delay %next = LENGTH(\1@金額);
金額   = FIX1@MSG1@金額[INDEX(1)];
S注文日 LEN %delay %next = LENGTH(\1@注文日);
注文日   = FIX1@MSG1@注文日;
S品名 LEN %delay %next = LENGTH(\1@品名);
品名   = FIX1@MSG1@品名;