動的フィールド参照の作成

REFERENCE 型の変数は、メッセージ・ツリー内をナビゲートするための動的参照として使用できます。 この動作は、メッセージ・カーソルまたは変数ポインターの動作とよく似ています。 一般に、反復構造にアクセスするときには、配列指標よりも参照変数を使用するほうが、 簡単で効率的です。参照変数はどこでも受け入れられます。フィールド参照は受け入れられており、 メッセージ・ツリーの詳細な操作ができるよう、ステートメントと関数のセットを指定します。

動的参照は、宣言してからでなければ使用できません。 動的参照は、1 つのステートメント内で宣言し初期化されます。 以下は、参照を作成して使用する方法を示しています。

-- Declare the dynamic reference
DECLARE myref REFERENCE TO OutputRoot.XML.Invoice.Purchases.Item[1];

--  Continue processing for each item in the array
WHILE LASTMOVE(myref)=TRUE 
        DO -- Add 1 to each item in the array
      SET myref = myref + 1;
-- Move the dynamic reference to the next item in the array
      MOVE myref NEXTSIBLING;
END WHILE;

この例では、myref という動的参照を宣言しています。 それは、Purchases 内の配列の最初の項目を指します。 最初の項目の値に 1 加算したら、ポインター (動的参照) は次の項目に移動します。 再び項目の値に 1 加算します。 このプロセスは、ポインターがメッセージ配列の範囲外になるまで (この配列中のすべての項目が処理されるまで) 続けられ、その後、LASTMOVE 関数が FALSE を戻します。

以下にさらにいくつかの例を示します。

DECLARE ref1 REFERENCE TO InputBody.Invoice.Purchases.Item[1];

DECLARE ref2 REFERENCE TO
	InputBody.Invoice.Purchases.NonExistentField;

DECLARE scalar1 CHARACTER;
DECLARE ref3 REFERENCE TO scalar1; 

第 2 の例では、存在しないフィールドが指定されているため、ref2 は InputBody を指すように設定されます。

動的参照は、静的参照を使用できるところならどこでも使用できます。 例外は、動的参照の位置を変更する MOVE ステートメントです。 ある式またはステートメントの中での動的参照の値は、それが現在指しているフィールドまたは変数の値です。 たとえば、サンプル・メッセージ に示されているメッセージの場合、 Invoice.Customer.FirstName の値は Andrew です。 下記のようにして動的参照 myref が FirstName フィールドを指すように設定されている場合、

DECLARE myref REFERENCE TO Invoice.Customer;

myref の値は Andrew になります。 次のようにして、この動的参照を拡張できます。

SET myref.Billing.Address[1] = 'Oaklands';

これにより、この例の住所 (Address) は Oaklands Hursley Village Hampshire SO213JR になります。

動的参照の位置は、ツリーが変更された場合でも固定されています。 この点を例示するため、次に示すステップでは、サンプル・メッセージのメッセージを入力メッセージとして使用して、このメッセージの修正バージョンを出力メッセージとして作成します。

  1. 入力メッセージを出力メッセージにコピーします。
  2. 出力メッセージを変更するため、まず、最初の項目 The XML Companion を指す動的参照 ref1 を宣言します。
    DECLARE ref1 REFERENCE TO 
    	OutputRoot.XML.Invoice.Purchases.Item[1];
    これで動的参照は、静的参照 OutputRoot.XML.Invoice.Purchases.Item[1] に相当するものになります。
  3. CREATE ステートメントを使って、この購入の最初の項目を新たに挿入します。
    CREATE PREVIOUSSIBLING OF ref1 VALUES 'Item'; 
    これで動的参照は、静的参照 OutputRoot.XML.Invoice.Purchases.Item[2] に相当するものになります。

関連概念
メッセージ・フロー
ESQL
メッセージのモデル化

関連タスク
メッセージ・フローの設計
メッセージ・フローの内容の定義
ESQL ファイルの管理

関連資料
Compute ノード
Database ノード
Filter ノード
ESQL
DECLARE ステートメント
IF ステートメント
LASTMOVE 関数
MOVE ステートメント
SET ステートメント
WHILE ステートメント
サンプル・メッセージ