Quando desejar acessar o conteúdo de uma mensagem, para leitura ou gravação, utilize a estrutura e organização dos elementos na árvore 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.
Você deve usar esses nomes diferentes de correlação, porque há apenas uma mensagem à qual fazer referência em um nó Banco de Dados ou Filter; não é possível criar uma mensagem de saída nesses nós. Use um nó Compute para criar uma mensagem de saída.
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ê quiser interrogar o elemento CardType de dentro de um nó Compute, use 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ó Banco de Dados ou Filter (onde a referência seja 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 em uma mensagem de saída no nó Compute sem alterá-lo, use o seguinte ESQL:
SET OutputRoot.XMLNS.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.XMLNS.Invoice.Customer.FirstName =
UPPER(InputBody.Invoice.Customer.FirstName);
SET OutputRoot.XMLNS.Invoice.InvoiceNo = InputBody.Invoice.InvoiceNo + 1000;
Se você deseja definir um elemento STRING como um valor constante, codifique:
SET OutputRoot.XMLNS.Invoice.Customer.Title = 'Mr';
Você também pode utilizar a instrução equivalente:
SET OutputRoot.XMLNS.Invoice.Customer.Title VALUE = 'Mr';
Se desejar atualizar um INTEGER ou DECIMAL, por exemplo o elemento TillNumber, com o valor 26, use a seguinte designação (válida no nó Compute apenas):
SET OutputRoot.MRM.Invoice.TillNumber=26;
O tipo de dados inteiro armazena os números utilizando o formato de complemento duplo de 64 bits, permitindo 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 de A a F podem ser gravadas em letras maiúsculas ou minúsculas, assim como pode-se gravar o X após o zero inicial, que é necessário. O exemplo a seguir produz o mesmo resultado que o exemplo mostrado anteriormente:
SET OutputRoot.MRM.Invoice.TillNumber= 0x1A;
Os exemplos a seguir mostram instruções SET para tipos de elementos que não aparecem no Mensagem de Exemplo.
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, você deve usar um caractere X inicial (maiúsculo ou minúsculo) e colocar os caracteres hexadecimais (também maiúsculos ou minúsculos) entre aspas únicas, 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.XMLNS.Invoice[] =
(SELECT I FROM InputRoot.XMLNS.Invoice[] AS I
WHERE I.Customer.LastName = CurrentCustomer
);
Este código grava todos os registros da mensagem de entrada para a mensagem de saída se a condição WHERE (LastName = Smith) for atendida. Todos os registros que não atenderem à condição não serão copiados da mensagem de entrada para a mensagem de saída. I é utilizado como um alias para o nome de correlação InputRoot.XMLNS.Invoice[].
A variável declarada CurrentCustomer é inicializada na instrução DECLARE: essa opção é 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 e criar um registro adicional:
-- Loop da mensagem de entrada
SET OutputRoot.XMLNS.Invoice[] =
(SELECT I, 'Customer' || I.Customer.LastName AS ExtraField
FROM InputRoot.XMLNS.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.XMLNS.Invoice[] =
(SELECT I AS Order
FROM InputRoot.XMLNS.Invoice[] AS I
);
Se estiver consultando ou definindo elementos que contêm ou podem conter valores nulos, esteja ciente das seguintes considerações:
Por exemplo, você pode verificar se um número de fatura está incluído na mensagem de fatura atual com a seguinte instrução:
IF InputRoot.XMLNS.Invoice.InvoiceNo IS NULL THEN
DO;
-- mais ESQL --
END IF;
Também é possível usar uma referência ESQL, conforme exibido no exemplo a seguir:
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.
SET OutputRoot.XMLNS.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.
Essa técnica é chamada de processamento nulo implícito.
SET OutputRoot.XMLNS.Invoice.Customer.Title VALUE = NULL;
SET OutputRoot.XMLNS.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.
Essa técnica é chamada 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.