uCosminexus Interschema ユーザーズガイド
ここでは,固定長形式のフォーマットからレングスタグ形式のフォーマットへのマッピングについて説明します。
固定長形式のフォーマットとして「FIX1」,レングスタグ形式のフォーマットとして「LT1」を使用します。データの構造を図4-12に示します。
図4-12 フォーマット「FIX1」「LT1」のデータの構造
レングスタグ形式の構造は,要素サイズを表す要素(ここでは要素「LEN」)があります。要素「LEN」には,直接対応する要素が入力側にありません。入力データの形式が固定長の場合は,入力側の要素のサイズは決まっているので,レングスタグのサイズを表す要素に対して,固定値を代入することでマップ式を定義できます。
しかし,注意点として,入力側の要素のデータから不要なスペースなどを削除してデータを出力する場合は,データの内容によって出力される要素のサイズが異なってしまいます。また,入力側の要素が可変長の場合も同様の問題が発生します。
この対策として,レングスタグ構造の要素サイズを表す要素には,実際に出力要素として代入された要素のサイズを代入するマップ式を記述する必要があります。ここでは,マップ式の評価を遅延(待機)させる指定「%delay」とコンポーネントのサイズを計算する関数「LENGTH」を使用します。
普通,マップ式は出力側の要素の出現順に評価されます。また,前提として,マップ式が評価される時点では,式中に現れるすべてのコンポーネントの値が決まっていなければいけません。この場合,式に記述するコンポーネントが入力側の要素であれば問題ありませんが,レングスタグ構造では出力側の要素を指定する必要があります。
例えば,要素「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」のマップ式定義を遅延させる,という指定になります。
評価順序遅延指定は,同じ親コンポーネントを持つ兄弟コンポーネントの中で複数指定できません。また,評価順序遅延指定に誤りがあると,重大なエラーの原因となるおそれがあるので注意してください。
レングスタグ構造の実際のデータを持つ要素は,対応する入力側のコンポーネントをドラッグ&ドロップし,代入のマップ式を記述します。構造「S注文番号」の子コンポーネント「注文番号」のマップ式を次に示します。
= FIX1@MSG1@注文番号;
また,複数回出現する構造の子コンポーネントの場合は,INDEX関数を使用した代入のマップ式を記述します。構造「S単価」の子コンポーネント「単価」は3回出現するコンポーネントですが,複数回出現は親コンポーネントに定義されています。
したがって,コンポーネント「S単価」のインデクスを取り出して,出現順序を対応付ける必要があります。INDEX関数の引数に,出力側のコンポーネント「単価」の1階層上のコンポーネントを表す「1」を記述し「S単価」を指定します。この場合のマップ式を次に示します。
= FIX1@MSG1@単価[INDEX(1)] ;
次に,要素「LEN」マップ式を記述します。
ここでは,構造「S注文番号」の子コンポーネント「LEN」のマップ式を記述します。「LEN」は次のコンポーネント「注文番号」の値を代入するので,「注文番号」の値が決まるまでマップ式評価を遅延させる必要があります。
そこで,評価順序を遅延させる「%delay」を指定します。
%delay %next = LENGTH( ) ;
%delay %next = LENGTH(LT1@MSG1@S注文番号@注文番号 ) ;
%delay %next = LENGTH( LT1@MSG1@S単価[INDEX(1)]@単価 ) ;
%delay %next = LENGTH( \1@単価 ) ;
以上で,固定長形式のフォーマット「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@品名; |
All Rights Reserved, Copyright (C) 2000, Information-technology Promotion Agency, Japan.
All Rights Reserved. Copyright (C) 2005, 2008, Hitachi, Ltd.
All Rights Reserved, Copyright (C) 1985-1998, Microsoft Corporation.