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ónInputBodyseguido de la vía de acceso al elemento al que se está refiriendo.InputBodyes equivalente aInputRootseguido 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ónOutputRootseguido 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ónBodypara hacer referencia al inicio del mensaje.Bodyes equivalente aRootseguido del nombre del analizador (por ejemplo,Root.XMLNS), que puede utilizar si lo prefiere. No puede utilizar elBodynombre 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.

Cuando se crean referencias de campo, los nombres utilizados han de ser identificadores ESQL válidos que cumplan con las normas de ESQL. Si escribe un elemento entre comillas, ESQL lo interpreta como un identificador. Si escribe un elemento entre comillas simples, ESQL lo interpreta un literal de tipo carácter. Todas las series de caracteres (series de caracteres, series de bits o series binarias (de bits) han de estar entre comillas, como puede verse en los ejemplos que siguen. Para incluir comillas o comillas simples dentro de una serie, incluya dos comillas o comillas simples consecutivas.
Importante: Para obtener una descripción completa de la sintaxis de referencia de campo, consulte Visión general de referencia de campo.
Para obtener más información sobre los tipos de datos ESQL, consulte Tipos de datos ESQL en flujos de mensajes.

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 elementoCardTypedesde 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:

Consulta de valores nulos
Cuando se compara un elemento con la palabra clave NULL de ESQL, esto prueba si el elemento se encuentra en el árbol lógico que ha creado el analizador a partir del mensaje de entrada.

Por ejemplo, con la siguiente sentencia, se puede comprobar si se ha incluido un número de factura en el mensaje de factura actual:

IF InputRoot.XMLNS.Invoice.InvoiceNo IS NULL THEN
   DO;
     -- more ESQL --
END IF;   

También puede utilizar una referencia ESQL, tal como se muestra en el ejemplo siguiente:

DECLARE cursor REFERENCE TO InputRoot.MRM.InvoiceNo;

IF LASTMOVE(cursor) = FALSE THEN 
   SET OutputRoot.MRM.Analysis = 'InvoiceNo does not exist in logical tree';
ELSEIF FIELDVALUE(cursor) IS NULL THEN
   SET OutputRoot.MRM.Analysis = 
       'InvoiceNo does exist in logical tree but is defined as an MRM NULL value';
ELSE
   SET OutputRoot.MRM.Analysis = 'InvoiceNo does exist and has a value';
END IF;

Para obtener más información sobre cómo declarar y utilizar referencias, consulte Creación de referencias de campo dinámicas. Para obtener una descripción de las funciones LASTMOVE y FIELDVALUE, consulte Función LASTMOVE y Función FIELDTYPE.

Si el mensaje se encuentra en el dominio MRM, existen consideraciones adicionales para la consulta de los elementos nulos, que dependen del formato físico. Para obtener más detalles, consulte Consulta de valores nulos en un mensaje en el dominio MRM.

Establecer valores nulos
Puede utilizar dos sentencias para establecer valores nulos:
  1. Utilizando la siguiente sentencia para establecer el elemento en NULL, el elemento se suprime del árbol de mensajes:
    SET OutputRoot.XMLNS.Invoice.Customer.Title = NULL;  

    Si el mensaje se encuentra en el dominio MRM, existen consideraciones adicionales para los valores nulos, que dependen del formato físico. Para obtener más detalles, consulte Establecimiento de valores nulos en un mensaje en el dominio MRM.

    Esta técnica se llama proceso de nulos implícito.

  2. Si esta establece el valor de este elemento en NULL como sigue:
    SET OutputRoot.XMLNS.Invoice.Customer.Title VALUE = NULL;  
    el elemento no se suprime del árbol de mensajes. En vez de eso, se asigna un valor especial de NULL al elemento.
    SET OutputRoot.XMLNS.Invoice.Customer.Title = NULL;  

    Si el mensaje se encuentra en el dominio MRM, el contenido de la corriente de bits de salida depende de los valores de las propiedades de manejo de nulos del formato físico. Para obtener más detalles, consulte Establecimiento de valores nulos en un mensaje en el dominio MRM.

    Esta técnica se llama proceso de nulos explícito.

Si establece un elemento MRM complejo o un elemento padre XML, XMLNS o JMS en NULL sin usar la palabra clave VALUE, dicho elemento y todos sus hijos se suprimirán del árbol lógico.