uCosminexus Interschema ユーザーズガイド

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

6.6.3 順序決定式

選択構造の子コンポーネントは,定義された順に変換するデータとコンポーネントが合うかどうかを評価します。

例えば,選択構造「DATA」があります。この構造は,「MSG1」「MSG2」「MSG3」という子コンポーネントを持っています。

[図データ]

コンポーネントをMSG1,MSG2,MSG3の順に定義した場合,まず,コンポーネント「MSG1」を評価して正当であれば「MSG1」を選択し,不当であれば「MSG2」を評価します。コンポーネント「MSG2」が正当であれば「MSG2」を選択し,不当であれば「MSG3」を評価します。つまり,選択構造のコンポーネントは定義順に評価され,最初に正当なものが選択されます。

[図データ]

この評価順序は,順序決定式を定義して変更できます。データの値によって選択するコンポーネントが決まっている場合,直接そのコンポーネントを選択する指定ができます。親の選択構造のコンポーネントには評価順序の条件を表す式(順序決定式)を記述し,子コンポーネントには自コンポーネントを選択する場合の値(順序決定値)を指定します。以上のように定義しておくと,データ変換時に式を評価し,同じ値を持つコンポーネントを優先的に評価します。

評価順序を決定する式は,[順序決定式]ダイアログに記述します。[順序決定式]ダイアログは,式を定義する選択構造の[構造のプロパティ]ダイアログで[順序決定式]ボタンをクリックすると表示されます。

図6-11 [順序決定式]ダイアログ

[図データ]

順序決定式は,テキストを直接入力したり,ダイアログから演算子,関数などを選択したりして記述します。

評価順序を決定する値は,[順序決定値]ダイアログに記述します。[順序決定値]ダイアログは,値を定義するコンポーネントの[コンポーネントのプロパティ]ダイアログで[順序決定値]ボタンをクリックすると表示されます。

図6-12 [順序決定値]ダイアログ

[図データ]

順序決定値は,値の属性を指定して,値を直接入力します。

評価順序は対で指定するので,選択構造に対して順序決定式を定義したら,子コンポーネントに対して順序決定値を定義します(一つの選択構造に対して複数の子コンポーネントに値を定義します)。

「MSG1」「MSG2」「MSG3」というコンポーネントを持つ選択構造「DATA」の場合の例を次に示します。

図6-13 順序決定式の例

[図データ]

この構造に対して,選択構造「DATA」の子コンポーネントを選択する順序決定式を定義します。

要素「メッセージ番号」の値によって子コンポーネントを選択するので,構造「DATA」に対してメッセージ番号のコンポーネント名を記述します。

 
ROOT@HEAD@メッセージ番号
 

コンポーネント名は,ルート構造から対象コンポーネントまでを「@」で連結して指定します。

また,n階層上のコンポーネントを指定する略記法「\n」を使用した順序決定式を次に示します。「\1」で「DATA」の1階層上の構造「ROOT」を示します。

 
\1@HEAD@メッセージ番号
 

また,子コンポーネントには順序決定式に対応する値として,メッセージ番号の値を定義します。「MSG1」に対しては「1」,「MSG2」に対しては「2」,「MSG3」に対しては「3」を定義します。以上のように定義しておくと,変換するデータのメッセージ番号が「2」の場合は,コンポーネント「MSG2」が優先的に選択されて評価されることになります。なお,選択構造の順序決定式の指定条件が,子コンポーネントの順序決定値のどれにも合わなかった場合は,次のように処理されます。

 

次に,ORDEROFFSET関数を使用して順序決定式を定義する方法について説明します。

通常,順序決定式では,式を定義する選択構造よりも前に出現するコンポーネントを指定します。しかし,入力フォーマットの場合,ORDEROFFSET関数を使用して,選択条件の値にしたいコンポーネントが出現していない状態で,選択条件を指定できます。ORDEROFFSET関数の使用例を次に示します。

図6-14 ORDEROFFSET関数の使用例

[図データ]

図6-14の例では,選択構造の子の先頭から10バイトの位置に,メッセージを識別するための区分があります。メッセージMSG2は,「M2」という区分で識別されています。

[図データ]

ORDEROFFSET関数で順序決定式を指定する場合の規則を次に示します。

ORDEROFFSET関数で指定した位置にデータが存在しない場合は,エラーになります。ORDEROFFSET関数については,「6.7.3 関数」を参照してください。