Acessando Elementos no Corpo da Mensagem

Quando desejar acessar o conteúdo de uma mensagem, para leitura ou gravação, utilize a estrutura e a disposição dos elementos na árvore que é criada pelo analisador a partir do fluxo de bits de entrada. Siga os relacionamentos entre pai e filho relevantes do início da árvore para baixo, até chegar no elemento requerido.

Ao construir referências de campos, os nomes utilizados devem ser identificadores ESQL válidos que estejam de acordo com as regras ESQL. Se você colocar alguma coisa entre aspas duplas, o ESQL interpretará isso como um identificador. Se você colocar alguma coisa entre aspas simples, o ESQL interpretará isso como um literal de caractere. Você deve colocar todas as cadeias (cadeias de caracteres, cadeias de bytes ou cadeias binárias (bits)) entre aspas, conforme mostrado nos exemplos abaixo. Para incluir aspas simples ou duplas em uma cadeia, inclua duas aspas simples consecutivas ou uma aspa dupla.
Importante: Para obter uma descrição completa de uma sintaxe de referência a campos, consulte Referências de Campos ESQL.
Para obter informações adicionais sobre tipos de dados ESQL, consulte Tipos de Dados ESQL nos Fluxos de Mensagens.

Suponha que você tenha criado um fluxo de mensagem que lide com a mensagem Invoice, mostrada na figura em Gravando ESQL. Se, por exemplo, você desejar interrogar o elemento CardType a partir de dentro de um nó Compute, utilize a seguinte instrução:

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

Se desejar fazer o mesmo teste em um nó Database ou Filter (em que a referência é para a mensagem de entrada única), codifique:

IF Body.Invoice.Payment.CardType='Visa' THEN
   DO;
     -- mais ESQL --
END IF;

Se desejar copiar um elemento de uma mensagem XML de entrada para uma mensagem de saída no nó Compute sem alterá-lo, utilize o seguinte ESQL:

SET OutputRoot.XML.Invoice.Customer.FirstName =
               InputBody.Invoice.Customer.FirstName;

Se desejar copiar um elemento de uma mensagem XML de entrada para uma mensagem de saída e atualizá-lo, por exemplo, dobrando para maiúscula ou calculando um novo valor, codifique:

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

Se você deseja definir um elemento STRING como um valor constante, codifique:

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

Você também pode utilizar a instrução equivalente:

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

Se desejar atualizar um INTEGER ou DECIMAL, por exemplo o elemento TillNumber, com o valor 26, utilize a seguinte designação (válida apenas no nó Compute):

SET OutputRoot.MRM.Invoice.TillNumber=26;  

O tipo de dados inteiro armazena os números utilizando o formato de complemento duplo de 64 bits e portanto permite que os números no intervalo de -9223372036854775808 a 9223372036854775807. Você pode especificar notação hexadecimal para inteiros e também o formato literal inteiro normal. As letras hexadecimais A a F podem ser escritas em maiúsculas ou minúsculas, assim como o X após o zero inicial, que é requerido. O exemplo abaixo produz o mesmo resultado que o exemplo mostrado acima:

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

Os exemplos a seguir mostram instruções SET para tipos de elementos que não aparecem na mensagem de exemplo Invoice.

Para definir um elemento FLOAT para um valor não-inteiro, codifique:

SET OutputRoot.MRM.FloatElement1 = 1.2345e2;  

Para definir um elemento BINARY para um valor constante, codifique:

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

Para valores BINARY, é necessário utilizar um caractere inicial X (em maiúscula ou minúscula) e colocar os caracteres hexadecimais (também em maiúsculas ou minúsculas) entre aspas simples, conforme mostrado.

Para definir um elemento BOOLEAN como um valor constante (o valor 1 é igual a true, 0 é igual a false), codifique:

SET OutputRoot.MRM.BooleanElement1 = true;

ou

SET OutputRoot.MRM.BooleanElement1 = 1;

Você pode utilizar a instrução SELECT para filtrar registros de uma mensagem de entrada, sem reformatar os registros e sem nenhum conhecimento do formato completo de cada registro. Considere o seguinte exemplo:

-- Declarar variável local
DECLARE CurrentCustomer CHAR 'Smith';

-- Loop da mensagem de entrada
SET OutputRoot.XML.Invoice[] = 
    (SELECT I FROM InputRoot.XML.Invoice[] AS I
              WHERE I.Customer.LastName = CurrentCustomer
    );

Isto faz com que todos os registros da mensagem de entrada Invoice sejam gravados para a mensagem de saída, se a condição WHERE (LastName = Smith) for atendida. Todos os registros que não atenderem a condição não serão copiados da entrada para a saída. I é utilizando como um alias para o nome de correlação InputRoot.XML.Invoice[].

A variável declarada CurrentCustomer é inicializada na instrução DECLARE: essa é a forma mais eficiente de declarar uma variável para a qual o valor inicial é conhecido.

Você pode utilizar essa técnica de alias com outras construções SELECT. Por exemplo, se desejar selecionar todos os registros da mensagem de entrada Invoice e criar um registro adicional:

-- Loop da mensagem de entrada
SET OutputRoot.XML.Invoice[] = 
    (SELECT I, 'Customer' || I.Customer.LastName AS ExtraField 
                  FROM InputRoot.XML.Invoice[] AS I
    );

Você também poderia incluir uma cláusula AS para colocar registros em uma subpasta na árvore de mensagens:

-- Loop da mensagem de entrada
SET OutputRoot.XML.Invoice[] = 
    (SELECT I AS Order
                FROM InputRoot.XML.Invoice[] AS I
    );

Se estiver consultando ou definindo elementos que contêm ou podem conter valores nulos, esteja ciente das seguintes considerações:

Consultando Valores Nulos
Ao comparar um elemento com a palavra-chave ESQL NULL, isso testa se o elemento está presente na árvore lógica que foi criada na mensagem de entrada pelo analisador.

Por exemplo, você pode verificar se um número de fatura está incluído na mensagem Invoice atual com a seguinte instrução:

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

Você também pode utilizar uma referência ESQL. O exemplo a seguir ilustra isso.

DECLARE cursor REFERENCE TO InputRoot.MRM.InvoiceNo;

IF LASTMOVE(cursor) = FALSE THEN 
   SET OutputRoot.MRM.Analysis = 'InvoiceNo não existe na árvore lógica';
ELSEIF FIELDVALUE(cursor) IS NULL THEN
   SET OutputRoot.MRM.Analysis = 
       'InvoiceNo existe na árvore lógica, mas está definida como um valor MRM NULL';
        ELSE
   SET OutputRoot.MRM.Analysis = 'InvoiceNo existe e possui um valor';
END IF;

Para obter mais informações sobre declaração e uso de referências, consulte Criando Referências de Campos Dinâmicos. Para obter uma descrição das funções LASTMOVE e FIELDVALUE, consulte Função LASTMOVE e Função FIELDTYPE.

Se a mensagem estiver no domínio MRM, haverá considerações adicionais para consultar elementos nulos que dependem do formato físico. Para obter detalhes adicionais, consulte Consultando Valores Nulos em uma Mensagem no Domínio MRM.

Definindo Valores Nulos
Existem duas instruções que podem ser utilizadas para definir valores nulos.
  1. Se você definir o elemento como NULL utilizando a instrução a seguir, o elemento será excluído da árvore de mensagens:
    SET OutputRoot.XML.Invoice.Customer.Title = NULL;  

    Se a mensagem estiver no domínio MRM, isto indica que existem considerações adicionais para valores nulos que dependem do formato físico. Para obter detalhes adicionais, consulte Definindo Valores Nulos em uma Mensagem no Domínio MRM.

    Isso é chamado de processamento nulo implícito.

  2. Se você definir o valor desse elemento como NULL, da seguinte forma:
    SET OutputRoot.XML.Invoice.Customer.Title VALUE = NULL;  
    o elemento não será excluído da árvore de mensagens. Em vez disso, um valor especial de NULL será atribuído ao elemento.
    SET OutputRoot.XML.Invoice.Customer.Title = NULL;  

    Se a mensagem estiver no domínio MRM, o conteúdo do fluxo de bits de saída dependerá das definições das propriedades de tratamento de nulos de formato físico. Para obter detalhes adicionais, consulte Definindo Valores Nulos em uma Mensagem no Domínio MRM.

    Isso é chamado de processamento nulo explícito.

Se você definir um elemento complexo MRM ou um elemento pai XML, XMLNS ou JMS como NULL, sem utilizar a palavra-chave VALUE, esse elemento e todos os seus filhos serão excluídos da árvore lógica.

Conceitos relacionados
Visão Geral de Fluxos de Mensagens
Nomes de Correlação
Modelagem de Mensagens
Tarefas relacionadas
Projetando um Fluxo de Mensagens
Definindo o Conteúdo do Fluxo de Mensagens
Acessando Elementos em uma Mensagem no Domínio MRM
Referências relacionadas
Nó Compute
Nó Database
Nó Filter
Referência de ESQL
Instrução DECLARE
Instrução IF
Função FIELDVALUE
Função LASTMOVE
Função SELECT
Instrução SET
Referências de Campos ESQL
Palavras-chave Reservadas ESQL
Mensagem de Exemplo
Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback
Direitos Autorais IBM Corporation 1999, 2006 Última Atualização: 1 Sep 2006
ac06010_