REFERENCE 型の変数は、メッセージ・ツリー内をナビゲートするための動的参照として使用できます。この動作は、メッセージ・カーソルまたは変数ポインターの動作とよく似ています。
一般に、反復構造にアクセスするときには、配列指標よりも参照変数を使用するほうが、簡単で効率的です。 参照変数は、フィールド参照が受け入れられているなら受け入れられます。また、メッセージ・ツリーの詳細な操作ができるように、ステートメントと関数のセットが付属しています。
動的参照は、宣言してからでなければ使用できません。 動的参照は、1 つのステートメント内で宣言し初期化されます。
このトピックのすべての例では、サンプル・メッセージを入力メッセージとして使用します。 以下は、参照を作成して使用する方法を示しています。
-- Declare the dynamic reference
DECLARE myref REFERENCE TO OutputRoot.XMLNS.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;
SET myref = CAST (myref AS INTEGER) + 1;
この例では、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 が、以下のように Customer フィールドを指すように設定されているとします。
DECLARE myref REFERENCE TO Invoice.Customer;
この場合、次のようにして、この動的参照をそのフィールドの子である住所 (Address) に拡張できます。
SET myref.Billing.Address[1] = 'Oaklands';
これにより、この例の住所 (Address) は Oaklands Hursley Village Hampshire SO213JR になります。
動的参照の位置は、ツリーが変更された場合でも固定されています。 この点を例示するため、次に示すステップでは、サンプル・メッセージのメッセージを入力メッセージとして使用して、このメッセージの修正バージョンを出力メッセージとして作成します。