Sentencia MOVE

La sentencia MOVE cambia el campo al que apunta una variable de referencia identificada por el destino.

Sintaxis

Notas:
  1. La RepeatClause sólo se puede utilizar con los calificadores PREVIOUSSIBLING y NEXTSIBLING.

Si incluye una cláusula TO, cambia la referencia de destino para que apunte a la misma entidad que a la que apunta el origen. Puede ser un campo de mensaje o una variable declarada.

Si incluye una cláusula PARENT, PREVIOUSSIBLING, NEXTSIBLING, FIRSTCHILD o LASTCHILD, la sentencia MOVE intenta mover la variable de referencia de destino en la dirección especificada de forma relativa a su posición actual. Si cualquier campo existe en la dirección indicada, la operación de mover se ejecuta correctamente. Si no hay un campo de esta clase, la operación de mover no se ejecuta correctamente; es decir, la variable de referencia sigue apuntando al mismo campo o variable que antes y la función LASTMOVE devuelve el valor falso. Puede utilizar la función LASTMOVE para determinar el resultado satisfactorio o erróneo de una operación de mover.

Si está presente una cláusula TYPE, NAME o ambas, el destino se vuelve a mover en la dirección especificada (PREVIOUSSIBLING o NEXTSIBLING, o FIRSTCHILD o LASTCHILD) pero a un campo con el tipo o nombre dados, o ambos. Esto es particularmente útil cuando se conoce el nombre o tipo (o ambos) del campo de destino, porque reduce el número de sentencias MOVE necesarias para navegar hasta un campo. Esto se debe a que los campos que no coinciden con los criterios se saltan; también puede incluir campos de árbol de mensajes inesperados, por ejemplo, los que representan un espacio en blanco.

Si no se puede realizar la operación de mover especificada (es decir, un campo con el tipo o nombre dado no existe), el destino permanece invariable y la función LASTMOVE devuelve el valor falso. La cláusula TYPE, NAME o ambas, pueden contener cualquier expresión que devuelva un valor de un tipo de datos adecuado (INTEGER para tipo y CHARACTER para nombre). Se emite una excepción si el valor suministrado es NULL.

Dos cláusulas adicionales, NAMESPACE e IDENTITY, aumentan la funcionalidad de la cláusula NAME.

La cláusula NAMESPACE acepta cualquier expresión que devuelva un valor no nulo de tipo carácter. También toma un *, que indica cualquier espacio de nombres. Observe que no se puede confundir con una expresión porque * no es un operador unario en ESQL.

El significado depende de la presencia de las cláusulas NAME y NAMESPACE como se indica a continuación:
NAMESPACE NAME Elemento ubicado por...
No No Tipo e índice, o sólo índice
No Nombre y espacio de nombres (seleccionado de la vía de acceso)
* Nombre
No espacio de nombres
Nombre y espacio de nombres

La cláusula IDENTITY toma un único elemento de vía de acceso en lugar de las cláusulas TYPE y NAME y sigue todas las normas descritas en el tema de referencias de campo (consulte el apartado Referencias de campo ESQL).

Cuando se utiliza MOVE con PREVIOUSSIBLING o NEXTSIBLING, puede especificar las palabras clave REPEAT, TYPE y NAME que mueven el destino al campo anterior o siguiente con el mismo tipo y nombre que el campo actual. La palabra clave REPEAT es particularmente útil cuando se mueve a un igual de la misma clase, porque no tiene que escribir expresiones para definir el tipo y el nombre.

Ejemplo

MOVE cursor FIRSTCHILD TYPE 0x01000000 NAME 'Field1';

Este ejemplo mueve el cursor de variable de referencia al primer campo dependiente del campo al que apunta actualmente el cursor y que tiene el tipo 0x01000000 y el nombre Field1.

La sentencia MOVE no crea nunca campos nuevos.

Un uso común de la sentencia MOVE es pasar de una instancia de una estructura repetida a la siguiente. Se puede acceder a los campos que hay dentro de la estructura mediante una referencia de campo relativo. Por ejemplo:
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 obtener más información sobre variables de referencia y un ejemplo de cómo mover una variable de referencia, consulte el apartado Creación de referencias de campo dinámico.

Conceptos relacionados
ESQL

Tareas relacionadas
Desarrollo de ESQL
Creación de referencias de campo dinámico

Referencia relacionada
Preferencia de sintaxis
Sentencias ESQL
Función LASTMOVE