Instrução SET

A instrução SET avalia sourceexpression e atribui o valor resultante à entidade identificada por target.

Sintaxe

O destino pode ser uma variável declarada ou um campo em uma árvore de mensagens que pode ser modificada, por exemplo Environment, InputLocalEnvironment, OutputLocalEnvironment, OutputRoot ou OutputExceptionList.

Se o destino for uma variável declarada, omita as cláusulas TYPE, NAME, NAMESPACE e VALUE. A expressão de origem deve retornar um valor escalar de um tipo igual ao tipo de dados declarado da variável ou que possa ser convertido nesse tipo. Os valores NULL são tratados exatamente da mesma maneira que qualquer outro valor.

Se o destino for um campo, ele será navegado (criando os campos, se necessário) e seu valor será definido de acordo com um conjunto de regras, que dependem da presença ou ausência das cláusulas TYPE, NAME, NAMESPACE ou VALUE e do tipo de dados retornados pela expressão de origem.

Se índices matriciais forem utilizados na referência de campo, somente uma instância de um campo particular pode ser criada. Se você gravar uma instrução SET que comece:
 SET OutputRoot.XML.Message.Structure[2].Field = ...  
pelo menos uma instância de Structure já deve existir na mensagem. Ou seja, os únicos campos na árvore que são criados são em um caminho direto da raiz para o campo identificado pela referência de campo.

Se uma cláusula TYPE estiver presente, o tipo do campo de destino será alterado para aquele retornado por sourceexpression. Uma exceção é lançada se o resultado não for escalar, não for do tipo INTEGER ou for NULL.

Se uma cláusula NAMESPACE estiver presente, o espaço de nomes do elemento será definido. Definir o espaço de nomes de um elemento define automaticamente seu sinalizador NAME.

Se uma cláusula NAME estiver presente, o nome do campo de destino será alterado para aquele retornado por sourceexpression. Uma exceção é lançada se o resultado não for escalar, não for do tipo CHARACTER ou for NULL.

Se uma cláusula VALUE estiver presente, o valor do campo de destino será alterado para aquele retornado por sourceexpression. Uma exceção é emitida se o resultado não for escalar.

Caso não utilize as cláusulas TYPE, NAME, ou VALUE (o caso mais comum) o comportamento irá depender se sourceexpression resultará em um escalar, referência a campo ou uma lista (de vários tipos) :
  • Se sourceexpression for um escalar, o valor do campo de destino será alterado para aquele retornado por sourceexpression. A exceção é que, quando o resultado for NULL, o campo de destino é destacado.
  • Se sourceexpression for uma referência de campo, o valor do campo de destino é tomado do campo de origem, todos os campos filhos são destacados e o novo campo recebe cópias dos campos filhos do campo de origem (e netos e assim por diante). Caso o campo indicado por sourceexpression não exista, o campo de destino será destacado.
  • Se sourceexpression for uma lista, todos os campos filho serão destacados, e um novo conjunto de campos filho serão adicionados, de acordo com o tipo e conteúdo da lista.
Instruções SET são particularmente úteis em nós Compute que modificam uma mensagem, seja alterando um campo ou incluindo um novo campo na mensagem original. As instruções SET também são úteis em nós Filter e Database, para definir variáveis declaradas ou os campos da árvore Environment ou das árvores Local Environment. Você pode utilizar instruções como estas em um nó Compute que modifica uma mensagem:
SET OutputRoot = InputRoot;
SET OutputRoot.XML.Order.Name = UPPER(InputRoot.XML.Order.Name);

Este exemplo põe um campo da mensagem em letras maiúsculas. A primeira instrução constrói uma mensagem de saída que é uma cópia completa da mensagem de entrada. A segunda instrução define o valor do campo Order.Name para um novo valor, conforme definido pela expressão à direita.

Caso o campo Order.Name não exista na mensagem de entrada original, ele não existirá na mensagem de saída gerada pela primeira instrução. A expressão da direita da segunda instrução retorna NULL (porque o campo mencionado dentro da chamada da função UPPER não existe). Designar o valor NULL a um campo tem o efeito de excluí-lo se ele já existir, portanto, a segunda instrução não terá efeito.

Se quiser designar um valor NULL a um campo sem excluí-lo, utilize uma instrução como esta:
SET OutputRoot.XML.Order.Name VALUE = NULL;

Conceitos relacionados
ESQL

Tarefas relacionadas
Desenvolvendo ESQL
Acessando Elementos no Corpo da Mensagem

Referências relacionadas
Preferência de Sintaxe
instruções ESQL