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. Siga las relaciones pertinentes de padres e hijos desde la parte superior del árbol hacia abajo, hasta que llegue al elemento que necesite.

Cuando se crean referencias de campo, los nombres utilizados han de ser identificadores ESQL válidos que cumplan con las normas de ESQL. Si encierra cualquier elemento entre comillas, ESQL lo interpreta como un identificador. Si encierra cualquier 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 Referencias de campo ESQL.
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 el mensaje Invoice, mostrado en la figura del apartado Escribir ESQL. Si, por ejemplo, desea consultar el elemento CardType que está en un nodo Compute, utilice la siguiente sentencia:

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

Si desea realizar la misma prueba en un nodo Database o Filter (donde se hace referencia al único mensaje de entrada), codifique:

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 del 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 convirtiéndolo en mayúsculas o calculando un nuevo valor, codifique:

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, codifique:

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

También puede usar la sentencia equivalente:

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

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

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 siguientes ejemplos muestran sentencias SET para tipos de elementos que no aparecen en el mensaje Invoice de ejemplo.

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

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:

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

-- Bucle a través del mensaje de entrada
SET OutputRoot.XML.Invoice[] = 
    (SELECT I FROM InputRoot.XML.Invoice[] AS I
              WHERE I.Customer.LastName = CurrentCustomer
    );

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

La variable declarada CurrentCustomer se inicializa en la sentencia DECLARE: esta 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 Invoice y crear un registro adicional:

-- Bucle a través del mensaje de entrada
SET OutputRoot.XML.Invoice[] = 
    (SELECT I, 'Customer' || I.Customer.LastName AS ExtraField 
              FROM InputRoot.XML.Invoice[] AS I
    );

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

-- Bucle a través del mensaje de entrada
SET OutputRoot.XML.Invoice[] = 
    (SELECT I AS Order
            FROM InputRoot.XML.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 Invoice actual:

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

También se puede usar una referencia ESQL. El siguiente ejemplo ilustra lo anterior.

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 no existe en el árbol lógico, pero se ha definido como valor NULL de MRM';
ELSE
   SET OutputRoot.MRM.Analysis = 'InvoiceNo no existe y tiene un valor';
END IF;

Para obtener más información sobre sobre cómo declarar y utilizar referencias, consulte Creación de referencias de campo dinámicas. Si desea ver 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 más detalles, consulte el apartado Consultar valores nulos en un mensaje del dominio MRM.

Establecimiento de valores nulos
Para establecer valores nulos se pueden utilizar dos sentencias.
  1. Utilizando la siguiente sentencia para establecer el elemento en NULL, el elemento se suprime del árbol de mensaje:
    SET OutputRoot.XML.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 más detalles, consulte el apartado Establecer valores nulos en el dominio MRM.

    Esto se llama proceso de nulos implícito.

  2. Si esta establece el valor de este elemento en NULL como sigue:
    SET OutputRoot.XML.Invoice.Customer.Title VALUE = NULL;  
    el elemento no se suprime del árbol de mensaje. En vez de eso, se asigna un valor especial de NULL al elemento.
    SET OutputRoot.XML.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 más detalles, consulte el apartado Establecer valores nulos en el dominio MRM.

    Esto 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.

Conceptos relacionados
Visión general de flujos de mensajes
Nombres de correlaciones
Modelado de mensajes
Tareas relacionadas
Diseñar un flujo de mensajes
Definir el contenido del flujo de mensajes
Acceder a elementos en un mensaje del dominio MRM
Referencia relacionada
Nodo Compute
Nodo Database
Nodo Filter
Referencia de ESQL
Sentencia DECLARE
Sentencia IF
Función FIELDVALUE
Función LASTMOVE
Función SELECT
Sentencia SET
Referencias de campo ESQL
Palabras clave reservadas ESQL
Mensaje de ejemplo
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión
Copyright IBM Corporation 1999, 2006 Última actualización: 22/08/2006
ac06010_