Você pode utilizar uma variável de tipo REFERENCE como uma referência dinâmica para navegar por uma árvore de mensagens. Isso atua de maneira semelhante a um cursor de mensagem ou ponteiro de variável. Geralmente, é mais simples e mais eficiente utilizar variáveis de preferência em vez de índices matriciais ao acessar estruturas repetitivas. As variáveis de referência são aceitas em qualquer lugar. As referências de campos são aceitas e são fornecidas com um conjunto de instruções e funções para permitir a manipulação detalhada de árvores de mensagens.
Você deve declarar uma referência dinâmica antes de utilizá-la. Uma referência dinâmica é declarada e inicializada e uma única instrução. O exemplo a seguir mostra como criar e utilizar uma referência.
-- 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;
Esse exemplo declara uma referência dinâmica, myref, que aponta para o primeiro item na matriz em Purchases. O valor no primeiro item é incrementado em um e o ponteiro (referência dinâmica) é movido para o próximo item. Mais uma vez o valor do item é incrementado em um. Esse processo continua até o ponteiro mover para fora do escopo da matriz da mensagem (todos os itens dessa matriz foram processados) e a função LASTMOVE retornar FALSE.
O exemplo abaixo mostra exemplos adicionais.
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;
No segundo exemplo, ref2 está definido para apontar para InputBody, porque o campo especificado não existe.
Com exceção da instrução MOVE, que altera a posição da referência dinâmica, você pode utilizar uma referência dinâmica em qualquer local em que utiliza uma referência estática. O valor da referência dinâmica em qualquer expressão ou instrução é o valor do campo ou variável para o qual ela aponta. Por exemplo, utilizando a mensagem em Mensagem de Exemplo, o valor de Invoice.Customer.FirstName será Andrew. Se a referência dinâmica myref for definida para apontar para o campo FirstName da seguinte maneira:
DECLARE myref REFERENCE TO Invoice.Customer;
o valor de myref é Andrew. Você também pode estender essa referência dinâmica da seguinte forma:
SET myref.Billing.Address[1] = 'Oaklands';
Isso altera o endereço no exemplo para Oaklands Hursley Village Hampshire SO213JR.
A posição de uma referência dinâmica permanece fixa mesmo se uma árvore for modificada. Para ilustrar esse ponto, as etapas a seguir utilizam a mensagem em Mensagem de Exemplo como mensagem de entrada e criam uma versão modificada dessa mensagem como uma mensagem de saída: