可以使用类型 REFERENCE 的变量作为动态引用来浏览消息树。它的用法类似于消息光标或变量指针。访问重复结构时,优先于数组下标使用引用变量通常更为简单和高效。任何地方都可接受引用变量。接受字段引用并与一个语句集合和函数放在一起以允许消息树的详细操作。
在您可以使用之前,必须声明一个动态引用。 动态引用在单句语句中声明和初始化。下例显示如何创建并使用引用。
-- 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;
在第二个示例中,ref2 设置为指向 InputBody,因为指定的字段不存在。
除了 MOVE 语句(它更改动态引用的位置)之外,动态引用可用于任何可以使用静态引用的地方。任何表达式或语句中的动态引用的值是它当前指向的字段或变量的值。例如,使用示例消息中的消息,Invoice.Customer.FirstName 的值是 Andrew。如果动态引用 myref 按如下所示设置为指向 FirstName 字段:
DECLARE myref REFERENCE TO Invoice.Customer;
myref 的值为 Andrew。您可以扩展此动态引用,如下所示:
SET myref.Billing.Address[1] = 'Oaklands';
该语句把示例中的地址更改为 Oaklands Hursley Village Hampshire SO213JR。
即使修改了树,动态引用的位置仍保持固定。为了说明这点,下面的步骤将示例消息中的消息用作它们的输入消息,然后创建此消息的修改后版本作为输出消息: