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.
Você deve utilizar esses diferentes nomes de correlação, porque existe apenas uma mensagem para a qual fazer referência em um nó Database ou Filter; não é possível criar uma nova mensagem de saída nesses nós. Utilize um nó Compute para criar uma nova 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ê 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:
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.
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.
SET OutputRoot.XML.Invoice.Customer.Title VALUE = NULL;
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.