A instrução MOVE altera o campo para o qual uma variável de referência identificada por destino aponta.
Se uma cláusula TO for incluída, ela altera a referência de destino para apontar na mesma identidade que a apontada por origem. Este pode ser um campo de mensagem ou uma variável declarada.
Se uma cláusula PARENT, PREVIOUSSIBLING, NEXTSIBLING, FIRSTCHILD ou LASTCHILD for incluída, a instrução MOVE tenta mover a variável de referência de destino na direção especificada com relação à sua posição atual. Se existir qualquer campo na direção determinada, a movimentação será bem-sucedida. Se não houver tal campo, ele falhará; ou seja, a variável de referência continuará apontando para o mesmo campo ou variável anterior e a função LASTMOVE retorna false. Você pode utilizar a função LASTMOVE para determinar o êxito ou defeito de um movimento.
Se uma cláusula TYPE, uma cláusula NAME ou ambas estiverem presentes, o destino será novamente movido na direção especificada (PREVIOUSSIBLING ou NEXTSIBLING, ou FIRSTCHILD ou LASTCHILD), exceto para um campo com o tipo, nome especificados, ou ambos. Isto é muito útil quando o nome ou tipo (ou ambos) do campo de destino for conhecido, porque isto reduz o número de instruções MOVE requeridas para navegar para um campo. Isto ocorre porque os campos que não correspondem aos critérios são ignorados e também pode incluir campos da árvore de mensagens não esperados, por exemplo, os que representam espaços em branco.
Se o movimento especificado não puder ser feito (ou seja, se não existir um campo com o tipo ou nome especificado), o destino permanecerá inalterado e a função LASTMOVE retornará false. A cláusula TYPE, a cláusula NAME ou ambas as cláusulas podem conter qualquer expressão que retorne um valor de um tipo de dados adequado (INTEGER para tipo e CHARACTER para nome). Será emitida uma exceção se o valor fornecido for NULL.
Duas cláusulas adicionais, NAMESPACE e IDENTITY, aumentam a funcionalidade da cláusula NAME.
A cláusula NAMESPACE utiliza qualquer expressão que retorna um valor não nulo de tipo character. Também utiliza um * indicando qualquer espaço de nomes. Observe que isto não pode ser confundido com uma expressão, porque * não é um operador unary no ESQL.
NAMESPACE | NAME | Elemento Localizado por... |
---|---|---|
Não | Não | Tipo, índice ou ambos |
Não | Sim | Nome no espaço de nomes padrão |
* | Sim | Name |
Sim | Não | Namespace |
Sim | Sim | Nome e espaço de nomes |
A cláusula IDENTITY assume um único elemento de caminho no lugar das cláusulas TYPE, NAMESPACE e NAME e segue todas as regras descritas no tópico para referências de campo (consulte Referências de Campos ESQL).
Ao utilizar MOVE com PREVIOUSSIBLING ou NEXTSIBLING, você poderá especificar as palavras-chave REPEAT, TYPE e NAME que movem o destino para o campo anterior ou para o próximo campo com o mesmo tipo e nome que o campo atual. A palavra-chave REPEAT é muito útil ao mover para um irmão de mesmo tipo, porque não é necessário gravar expressões para definir o tipo e nome.
MOVE cursor FIRSTCHILD TYPE 0x01000000 NAME 'Field1';
Este exemplo move a variável de referência cursor para o primeiro campo filho do campo para o qual cursor está apontando atualmente e que tem o tipo 0x01000000 e o nome Field1.
A instrução MOVE nunca cria novos campos.
WHILE LASTMOVE(sourceCursor) DO SET targetCursor.ItemNumber = sourceCursor.item; SET targetCursor.Description = sourceCursor.name; SET targetCursor.Price = sourceCursor.prc; SET targetCursor.Tax = sourceCursor.prc * 0.175; SET targetCursor.quantity = 1; CREATE NEXTSIBLING OF targetCursor AS targetCursor REPEAT; MOVE sourceCursor NEXTSIBLING REPEAT TYPE NAME; END WHILE;
Para informações adicionais sobre variáveis de referência e um exemplo de como mover uma variável de referência, consulte Criando Referências de Campos Dinâmicos.