Creación de referencias de campo dinámico

Puede utilizar una variable del tipo REFERENCE como referencia dinámica para navegar por un árbol de mensajes. Esto actúa de manera similar a un cursor de mensaje o un puntero de variable. Generalmente es más sencillo y eficaz utilizar variables de referencia con preferencia a los índices de matriz cuando se accede a estructuras repetitivas. Las variables de referencia se aceptan en todas partes. Las referencias de campo se aceptan y se presentan con un conjunto de sentencias y funciones para permitir un manejo detallado de los árboles de mensajes.

Debe declarar una referencia dinámica antes de que pueda utilizarla. Una referencia dinámica se declara y se inicializa en una sola sentencia. En el ejemplo siguiente se muestra cómo se crea y se utiliza una referencia.

-- 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;

En este ejemplo se declara una referencia dinámica, myref, que apunta al primer elemento de la matriz en Purchases. El valor del primer elemento se incrementa en uno y el puntero (referencia dinámica) se mueve al elemento siguiente. Una vez más, el valor del elemento se incrementa en uno. Este proceso continúa hasta que el puntero sale fuera del ámbito de la matriz de mensajes (todos los elementos de esta matriz se han procesado) y la función LASTMOVE devuelve FALSE.

Los ejemplos siguientes muestran otros ejemplos.

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; 

En el segundo ejemplo, ref2 se establece para que apunte a InputBody porque el campo especificado no existe.

A excepción de la sentencia MOVE, que cambia la posición de la referencia dinámica, puede utilizar una referencia dinámica en cualquier lugar en que pueda utilizar una referencia estática. El valor de la referencia dinámica en cualquier expresión o sentencia es el valor del campo o la variable al que apunta actualmente. Por ejemplo, si se utiliza el mensaje del apartado Mensaje de ejemplo, el valor de Invoice.Customer.FirstName es Andrew. Si la referencia dinámica myref se establece para que apunte al campo FirstName como se indica a continuación:

DECLARE myref REFERENCE TO Invoice.Customer;

el valor de myref es Andrew. Puede ampliar esta referencia dinámica como se indica a continuación:

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

Esto cambia la dirección del ejemplo a Oaklands Hursley Village Hampshire SO213JR.

La posición de una referencia dinámica permanece fija aunque se modifique un árbol. Para ilustrar este punto, los pasos siguientes utilizan el mensaje del apartado Mensaje de ejemplo como mensaje de entrada y crean una versión modificada de este mensaje como mensaje de salida:

  1. Copie el mensaje de entrada al mensaje de salida.
  2. Para modificar el mensaje de salida, en primer lugar declare una referencia dinámica ref1 que apunte al primer elemento, The XML Companion.
    DECLARE ref1 REFERENCE TO 
    	OutputRoot.XML.Invoice.Purchases.Item[1];
    La referencia dinámica equivale ahora a la referencia estática OutputRoot.XML.Invoice.Purchases.Item[1].
  3. Utilice una sentencia de creación para insertar un primer elemento nuevo para esta compra.
    CREATE PREVIOUSSIBLING OF ref1 VALUES 'Item'; 
    La referencia dinámica equivale ahora a la referencia estática OutputRoot.XML.Invoice.Purchases.Item[2].

Conceptos relacionados
Flujos de mensajes
ESQL
Diseño de mensajes

Tareas relacionadas
Diseño de un flujo de mensajes
Definición del contenido del flujo de mensajes
Gestión de archivos ESQL

Referencia relacionada
Nodo Compute
Nodo Database
Nodo Filter
ESQL
Sentencia DECLARE
Sentencia IF
Función LASTMOVE
Sentencia MOVE
Sentencia SET
Sentencia WHILE
Mensaje de ejemplo