Acceso a elementos en el cuerpo del mensaje

Cuando desee acceder al contenido de un mensaje, para leerlo o escribirlo, utilice la estructura y la disposición de los elementos en el árbol que el analizador crea a partir de la corriente de bits de entrada Siga las relaciones de elemento superior y elemento dependiente de arriba a abajo en el árbol, hasta alcanzar el elemento necesario.

Al construir referencias de campos, los nombres que se utilizan deben ser identificadores ESQL válidos que cumplan con las normas ESQL. Si especifica algún elemento entre comillas, ESQL interpreta que es un identificador. Si especifica algo entre apóstrofos, ESQL interpreta que es un literal de caracteres. Debe especificar todas las series (series de caracteres, series de bytes o series binarias (bit)) entre comillas o apóstrofos, como se muestra en los ejemplos siguientes. Para incluir un apóstrofo o unas comillas dentro de una serie, incluya dos apóstrofos consecutivos o unas comillas. Para obtener una descripción completa de la sintaxis de referencia del campo, consulte Referencias de campo ESQL. Si desea más información sobre los tipos de datos ESQL, consulte Tipos de datos de ESQL en flujos de mensajes.

Suponga que se ha creado un flujo de mensajes que maneja el mensaje Factura que se muestra en la figura en Configuración de ESQL dentro de nodos. Si, por ejemplo, desea consultar el elemento CardType incluido en un nodo Compute, utilice la siguiente sentencia:


IF InputBody.Invoice.Payment.CardType='Visa' THEN
   DO;
     -- more ESQL --
END IF;   

Si desea hacer la misma prueba en el nodo Database o Filter (donde la referencia es a un solo mensaje de entrada), escriba el 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 Compute sin cambiarlo, utilice el siguiente ESQL:


SET OutputRoot.XML.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 pasando a mayúsculas o calculando un nuevo valor, escriba el código:


SET OutputRoot.XML.Invoice.Customer.FirstName = 
               UPPER(InputBody.Invoice.Customer.FirstName);  
SET OutputRoot.XML.Invoice.InvoiceNo = InputBody.Invoice.InvoiceNo + 1000;  

Si desea establecer un elemento STRING en un valor constante, escriba el código:


SET OutputRoot.XML.Invoice.Customer.Title = 'Mr';  

También puede utilizar la sentencia equivalente:


SET OutputRoot.XML.Invoice.Customer.Title VALUE = 'Mr';  

Si desea actualizar un INTEGER o DECIMAL, por ejemplo el elemento TillNumber, con el valor 26, utilice la siguiente asignación (sólo es válida en el nodo Compute):

SET OutputRoot.MRM.Invoice.TillNumber=26;  

El tipo de datos entero almacena los números utilizando el formulario "twos complement" de 64 bits, lo que admite números que oscilan entre -9223372036854775808 y 9223372036854775807. Puede especificar una notación hexadecimal para los enteros así como un formato literal de entero normal. Las letras hexadecimales de la A a la F pueden escribirse en mayúsculas o en minúsculas, al igual modo que la X después del cero inicial, que es necesaria. El ejemplo siguiente tiene el mismo resultado que el ejemplo anterior:

SET OutputRoot.MRM.Invoice.TillNumber= 0x1A;  

Los siguientes ejemplos muestran sentencias SET para tipos de elementos que no aparecen en el ejemplo de mensaje Factura.

Para establecer un elemento FLOAT en un valor que no sea un entero, escriba el código:

SET OutputRoot.MRM.FloatElement1 = 1.2345e2;  

Para establecer un elemento BINARY en un valor constante, escriba el código:

SET OutputRoot.MRM.BinaryElement1 = X'F1F1';  

Para valores BINARY, debe utilizar un carácter inicial X (mayúsculas o minúsculas) e indicar los caracteres hexadecimales (también mayúsculas o minúsculas) entre apóstrofos, tal como se muestra.

Para establecer un elemento BOOLEAN en un valor constante (el valor 1 es igual a true, 0 es igual a false), escriba el código:

SET OutputRoot.MRM.BooleanElement1 = true;

o

SET OutputRoot.MRM.BooleanElement1 = 1;

Puede utilizar la sentencia SELECT para filtrar registros de un mensaje de entrada sin volver a formatear los registros y sin conocer el formato completo de cada registro. Suponga el siguiente ejemplo:

-- Declare local variable
DECLARE CurrentCustomer CHAR 'Smith';

-- Loop through the input message
SET OutputRoot.XML.Invoice[] = 
    (SELECT I FROM InputRoot.XML.Invoice[] AS I
              WHERE I.Customer.LastName = CurrentCustomer
    );

Esto graba todos los registros del mensaje Factura de entrada en el mensaje de salida si se cumple la condición WHERE (LastName = Smith). Todos los registros que no cumplen la condición no se copian de la entrada en la salida. I se utiliza como alias para el nombre de correlación InputRoot.XML.Invoice[].

La variable declarada CurrentCustomer se inicializa en la sentencia DECLARE: esto es la forma más eficaz de declarar una variable para la que se conoce el valor inicial.

Puede utilizar esta técnica de alias con otras construcciones SELECT. Por ejemplo, si desea seleccionar todos los registros del mensaje Factura de entrada y crear un registro adicional:

-- Loop through the input message
SET OutputRoot.XML.Invoice[] = 
    (SELECT I, 'Customer' || I.Customer.LastName AS ExtraField 
              FROM InputRoot.XML.Invoice[] AS I
    );

También puede incluir una cláusula AS para colocar registros en una subcarpeta en el árbol de mensajes:

-- Loop through the input message
SET OutputRoot.XML.Invoice[] =
    (SELECT I AS Order
            FROM InputRoot.XML.Invoice[] AS I
    );

Si está consultando o estableciendo documentos que contienen, o pueden contener, valores nulos, tenga en cuenta las siguientes consideraciones:

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

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

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

También puede utilizar una consulta de ESQL. El siguiente ejemplo lo muestra.

DECLARE cursor REFERENCE TO InputRoot.MRM.InvoiceNo;

IF LASTMOVE(cursor) = FALSE THEN 
   SET OutputRoot.MRM.Analysis = 'InvoiceNo no existe en el árbol lógico';
ELSEIF FIELDVALUE(cursor) IS NULL THEN
   SET OutputRoot.MRM.Analysis = 
       'InvoiceNo sí existe en el árbol lógico pero se ha definido como un valor MRM NULL';
ELSE
   SET OutputRoot.MRM.Analysis = 'InvoiceNo existe y tiene un valor';
END IF;

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

Si el mensaje está en el dominio de MRM, existen consideraciones adicionales para consultar 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 de MRM..

Configuración de valores nulos
Existen dos sentencias que puede utilizar para establecer valores nulos.
  1. Si establece el elemento en NULL con la siguiente sentencia, el elemento se suprime del árbol de mensajes:
    SET OutputRoot.XML.Invoice.Customer.Title = NULL;  

    Si el mensaje está en el dominio de MRM, existen consideraciones adicionales para valores nulos que dependen del formato físico. Para obtener más detalles, consulte Configuración de valores nulos en un mensaje en el dominio de MRM.

    Esto se denomina proceso nulo implícito.

  2. Si establece el valor de este elemento en NULL como se indica a continuación:
    SET OutputRoot.XML.Invoice.Customer.Title VALUE = NULL;  
    el elemento no se elimina del árbol de mensajes. En lugar de ello, se asigna al elemento un valor NULL especial.
    SET OutputRoot.XML.Invoice.Customer.Title = NULL;  

    Si el mensaje está en el dominio de MRM, el contenido de la corriente de bits de salida depende de los valores del formato físico nulo que manejen las propiedades. Para obtener información detallada, consulteConfiguración de valores nulos en un mensaje en el dominio de MRM.

    Esto se denomina proceso explícito de valores nulos.

Si establece un elemento complejo MRM o un elemento superior XML, XMLNS o JMS en el valor NULL sin utilizar la palabra clave VALUE, dicho elemento y todos sus elementos dependientes se suprimen del árbol lógico.

Conceptos relacionados
Flujos de mensajes
Árbol lógico de mensajes
Nombres de correlación
Diseño de mensajes

Tareas relacionadas
Diseño de un flujo de mensajes
Definición del contenido del flujo de mensajes
Acceso a elementos de un mensaje en el dominio MRM

Referencia relacionada
Nodo Compute
Nodo Database
Nodo Filter
ESQL
Sentencia DECLARE
Sentencia IF
Función FIELDVALUE
Función LASTMOVE
Función SELECT
Sentencia SET
Referencias de campo ESQL
Palabras clave reservadas de ESQL
Mensaje de ejemplo