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