Acceder a elementos en el cuerpo del mensaje
Cuando desee acceder al contenido de un mensaje, para leer o escribir, utilice la estructura y la disposición de los elementos del árbol que crea el analizador a partir de la corriente de bits.
Acerca de esta tarea
Siga las relaciones pertinentes de padres e hijos desde la parte superior del árbol hacia abajo, hasta que llegue al elemento que necesite.
- Si hace referencia al árbol de mensajes de entrada para interrogar su contenido en un nodo de Cálculo , utilice el nombre de correlación
InputBody
seguido de la vía de acceso al elemento al que se está refiriendo.InputBody
es equivalente aInputRoot
seguido del nombre del analizador (por ejemplo,InputRoot.MRM
), que puede utilizar si lo prefiere. - Si hace referencia al árbol de mensajes de salida para establecer o modificar su contenido en el nodo Cálculo , utilice el nombre de correlación
OutputRoot
seguido del nombre del analizador (por ejemplo,OutputRoot.MRM
). - Si hace referencia al mensaje de entrada para interrogar su contenido en un nodo Datos o Filtro , utilice el nombre de correlación
Body
para hacer referencia al inicio del mensaje.Body
es equivalente aRoot
seguido del nombre del analizador (por ejemplo,Root.XMLNS
), que puede utilizar si lo prefiere. No puede utilizar elBody
nombre de correlación en un nodo de DatabaseInput .Debe utilizar estos nombres de correlación diferentes porque sólo hay un mensaje al que hacer referencia en un nodo Datos o Filtro ; no puede crear un mensaje de salida en estos nodos. Utilice un nodo de Cálculo para crear un mensaje de salida.
Suponga que ha creado un flujo de mensajes que maneja la factura de mensaje, que se muestra en la figura de Escribiendo ESQL. Si, por ejemplo, desea interrogar el elementoCardType
desde un nodo de Cálculo , utilice la sentencia siguiente:
IF InputBody.Invoice.Payment.CardType='Visa' THEN
DO;
-- more ESQL --
END IF;
Si desea realizar la misma prueba en un nodo Datos o Filtro (donde la referencia es al mensaje de entrada único), código:
IF Body.Invoice.Payment.CardType='Visa' THEN
DO;
-- more ESQL --
END IF;
Si desea copiar un elemento de un mensaje XML de entrada en un mensaje de salida en el nodo de Cálculo sin cambiarlo, utilice el ESQL siguiente:
SET OutputRoot.XMLNS.Invoice.Customer.FirstName =
InputBody.Invoice.Customer.FirstName;
Si desea copiar un elemento de un mensaje XML de entrada en un mensaje de salida y actualizarlo, por ejemplo convirtiéndolo en mayúsculas o calculando un nuevo valor, codifique:
SET OutputRoot.XMLNS.Invoice.Customer.FirstName =
UPPER(InputBody.Invoice.Customer.FirstName);
SET OutputRoot.XMLNS.Invoice.InvoiceNo = InputBody.Invoice.InvoiceNo + 1000;
Si desea establecer un elemento STRING en un valor constante, codifique:
SET OutputRoot.XMLNS.Invoice.Customer.Title = 'Mr';
También puede usar la sentencia equivalente:
SET OutputRoot.XMLNS.Invoice.Customer.Title VALUE = 'Mr';
Si desea actualizar un INTEGER o DECIMAL, por ejemplo el elementoTillNumber
, con el valor26
, utilice la siguiente asignación (válida sólo en el nodo Cálculo ):
SET OutputRoot.MRM.Invoice.TillNumber=26;
El tipo de datos entero almacena números utilizando el complemento a dos de 64 bit, que permite números del -9223372036854775808 al 9223372036854775807. Se puede especificar una notación hexadecimal para enteros así como el formato literal normal para enteros. La letras hexadecimales A a F pueden escribirse en mayúsculas o minúsculas del mismo modo que la X después del cero inicial, que es necesaria. El ejemplo que sigue produce el mismo resultado que el ejemplo anterior:
SET OutputRoot.MRM.Invoice.TillNumber= 0x1A;
Los ejemplos siguientes muestran sentencias SET para tipos de elementos que no aparecen en Ejemplo de mensaje.
Para establecer un elemento FLOAT en un valor que no sea un entero, codifique:
SET OutputRoot.MRM.FloatElement1 = 1.2345e2;
Para establecer un elemento BINARY en un valor constante, codifique:
SET OutputRoot.MRM.BinaryElement1 = X'F1F1';
Para valores BINARY debe utilizar un carácter X inicial (mayúsculas o minúsculas) e incluir los caracteres hexadecimales (también en mayúsculas o minúsculas) entre comillas simples, como puede verse.
Para establecer un elemento BOOLEAN en un valor constante (el valor 1 es igual a true (verdadero) y el valor 0 es igual a false (falso)), codifique:
SET OutputRoot.MRM.BooleanElement1 = true;
o bien
SET OutputRoot.MRM.BooleanElement1 = 1;
Puede utilizar la sentencia SELECT para filtrar registros procedentes de un mensaje de entrada sin volver a formatear los registros y sin necesidad de conocer el formato completo de cada registro. Considere el siguiente ejemplo:
-- Declare local variable
DECLARE CurrentCustomer CHAR 'Smith';
-- Loop through the input message
SET OutputRoot.XMLNS.Invoice[] =
(SELECT I FROM InputRoot.XMLNS.Invoice[] AS I
WHERE I.Customer.LastName = CurrentCustomer
);
Este código graba todos los registros del mensaje de entrada en el mensaje de salida si se cumple la condición WHERE (LastName = Smith). Los registros que no cumplan con la condición no se copian desde el mensaje de entrada al mensaje de salida. I se utiliza como alias del nombre de correlación InputRoot.XMLNS.Invoice[].
La variable declarada CurrentCustomer se inicializa en la sentencia DECLARE: esta opción es la forma más eficaz de declarar una variable de la cual se conoce el valor inicial.
Esta técnica de alias puede utilizarse con otras construcciones de SELECT. Por ejemplo, si desea seleccionar todos los registros del mensaje de entrada y crear un registro adicional:
-- Loop through the input message
SET OutputRoot.XMLNS.Invoice[] =
(SELECT I, 'Customer' || I.Customer.LastName AS ExtraField
FROM InputRoot.XMLNS.Invoice[] AS I
);
También se puede incluir una cláusula AS para colocar registros en una subcarpeta en el árbol de mensajes:
-- Loop through the input message
SET OutputRoot.XMLNS.Invoice[] =
(SELECT I AS Order
FROM InputRoot.XMLNS.Invoice[] AS I
);
Si está consultando o estableciendo elementos que contengan, o puedan contener, valores nulos, tenga en cuenta los siguientes puntos: