move

La sentencia EGL move copia datos de tres maneras distintas. La primera opción copia datos byte a byte, la segunda (llamada por nombre) copia datos de los campos con nombre en una estructura a los campos con el mismo nombre en otra y la tercera (llamada por posición) copia datos de cada campo de una estructura al campo de la posición equivalente en otra.

Se aplican las reglas generales siguientes:
  • Si el valor origen es uno de estos, el valor predeterminado consiste en copiar datos byte a byte:
    • Una variable primitiva
    • Un campo que está en una estructura fija
    • Un literal
    • Una constante

    De lo contrario, el valor predeterminado consiste en copiar datos por nombre.

  • Se comprueba la compatibilidad campo a campo de cada movimiento. Las reglas de truncado, relleno y conversión de tipos son las mismas que las detalladas para la sentencia assignment, sin embargo, el comportamiento general de la sentencia move es diferente de la de la sentencia assignment.
  • Si trabaja con matrices dinámicas, el último elemento queda determinado por el tamaño actual de la matriz. La sentencia move nunca añade un elemento de una matriz; para ampliar una matriz dinámica, utilice las funciones específicas de matriz appendElement o appendAll, tal como se describe en la sección Matriz.

Diagrama de sintaxis para la sentencia move

La sentencia se entiende mejor en relación con las categorías siguientes:

byName
Cuando especifica byName, se transcriben los datos de cada campo del origen a un campo con el mismo nombre del destino. La operación se produce en el orden de los campos en el origen.

A continuación se proporcionan ejemplos de origen y destino:

origen
Uno de los siguientes:
  • Una matriz dinámica de registros fijos, pero la matriz solo es válida si el destino no es un registro
  • Un registro
  • Un registro fijo
  • Un campo de estructura con una subestructura
  • Una matriz de campo de estructura con una subestructura, pero esta matriz solo es válida si el destino no es un registro
  • Una dataTable
  • Un formulario

Un campo de estructura fija cuyo nombres sea un asterisco (*) no está disponible como campo origen, pero sí están disponibles los campos con nombre de una subestructura de ese campo.

destino
Uno de los siguientes:
  • Una matriz dinámica de registros fijos, pero esta matriz solo es válida si el origen no es un registro
  • Un registro
  • Un registro fijo
  • Un campo de estructura con una subestructura
  • Una matriz de campo de estructura con una subestructura, pero esta matriz solo es válida si el origen no es un registro
  • Una dataTable
  • Un formulario
Una sentencia de ejemplo es la siguiente:
  move myRecord01 to myRecord02 byName;
La operación no es válida en cualquiera de estos casos:
  • Hay dos o más campos en el origen con el mismo nombre
  • Hay dos o más campos en el destino con el mismo nombre
  • El campo origen es una matriz de campo de estructura multidimensional o una matriz de campo de estructura unidimensional cuyo contenedor es una matriz
  • El campo destino es una matriz de campo de estructura multidimensional o una matriz de campo de estructura unidimensional cuyo contenedor es una matriz
La operación funciona de la manera siguiente:
  • En un caso simple, el origen es una estructura fija pero no es un elemento de matriz y lo mismo vale para el destino. Se aplican las reglas siguientes:
    • Si no hay matrices implicadas, el valor de cada campo subordinado en la estructura de origen se copia en el campo del mismo nombre de la estructura destino.
    • Si una matriz de campos de estructura se copia en una matriz de campos de estructura, la operación se trata como una operación move for all:
      • Los elementos del campo origen se copian en elementos sucesivos del campo destino
      • Si la matriz origen tiene menos elementos que la matriz destino, el proceso se detiene cuando se copia el último elemento de la matriz origen
  • En otro caso, el origen o el destino es un registro. Los campos del origen se asigna a los campos del mismo nombre del destino.
  • La mejor manera de presentar un caso menos simples es mediante un ejemplo. El origen es una matriz de 10 registros fijos, cada una de la cuál incluye estos campos de estructura:
      10 empnum  CHAR(3);
      10 empname CHAR(20); 
    El destino es una estructura fija que incluye estos campos de estructura:
      10 empnum CHAR(3)[10];
      10 empname CHAR(20)[10];

    La operación copia el valor del campo empnum del primer registro fijo en el primer elemento de la matriz de campo de estructura empnum, copia el valor del campo empname del primer registro fijo en el primer elemento de la matriz de campo de estructura empname y realiza una operación similar para cada registro fijo de la matriz origen.

    La operación equivalente ocurre si el origen es un solo registro fijo que tiene una subestructura como esta:
      10 mySubStructure[10]
        15 empnum  CHAR(3);
        15 empname CHAR(20);    
  • Finalmente, observe el caso en el que el origen es un registro fijo que incluye estos campos de estructura:
      10 empnum  CHAR(3);
      10 empname CHAR(20)[10]; 
    El destino es un formulario, un registro fijo o un campo de estructura que tiene la subestructura siguiente:
      10 empnum char(3)[10];
      10 empname char(20);

    El valor del campo empnum se copia del origen al primer elemento de empnum en el destino y el valor del primer elemento de de empname se copia del origen al campo empname en el destino.

byPosition
El propósito de byPosition es copiar datos de cada campo en una estructura en el campo de la posición equivalente en otra.

A continuación se proporcionan ejemplos de origen y destino:

origen
Uno de los siguientes:
  • Una matriz dinámica de registros fijos, pero la matriz solo es válida si el destino no es un registro
  • Un registro
  • Un registro fijo
  • Un campo de estructura con una subestructura
  • Una matriz de campo de estructura con una subestructura, pero esta matriz solo es válida si el destino no es un registro
  • Una dataTable
  • Un formulario
destino
Uno de los siguientes:
  • Una matriz dinámica de registros fijos, pero esta matriz solo es válida si el origen no es un registro
  • Un registro
  • Un registro fijo
  • Un campo de estructura con una subestructura
  • Una matriz de campo de estructura con una subestructura, pero esta matriz solo es válida si el origen no es un registro
  • Una dataTable
  • Un formulario

Cuando mueve datos entre un registro y una estructura fija, solo se tienen en cuenta los campos de nivel superior de la estructura fija. Cuando mueve los datos entre dos estructuras fijas, solo se tienen en cuenta los campos de nivel inferior (hoja) de cada estructura.

La operación no es válida si el campo origen o destino es una matriz de campo de estructura multidimensional o una matriz de campo de estructura unidimensional cuyo contenedor sea una matriz.

La operación funciona de la manera siguiente:
  • En un caso simple, el origen es una estructura fija pero no es un elemento de matriz y lo mismo vale para el destino. Se aplican las reglas siguientes:
    • Si no hay matrices implicadas, el valor de cada campo de hoja de la estructura origen se copia en el campo de hoja de la estructura destino en la posición correspondiente.
    • Si una matriz de campos de estructura se copia en una matriz de campos de estructura, la operación se trata como una operación move for all:
      • Los elementos del campo origen se copian en elementos sucesivos del campo destino
      • Si la matriz origen tiene menos elementos que la matriz destino, el proceso se detiene cuando se copia el último elemento de la matriz origen
  • En otro caso, el origen o el destino es un registro. Los campos de nivel superior o campos de hoja del origen (dependiendo del tipo de origen) se asignan a los campos de nivel superior o campos de hoja del destino (dependiendo del tipo de destino).
  • La mejor manera de presentar un caso menos simples es mediante un ejemplo. El origen es una matriz de 10 registros fijos, cada una de la cuál incluye estos campos de estructura:
      10 empnum  CHAR(3);
      10 empname CHAR(20); 
    El destino es una estructura fija que incluye estos campos de estructura:
      10 empnum CHAR(3)[10];
      10 empname CHAR(20)[10];

    La operación copia el valor del campo empnum del primer registro fijo en el primer elemento de la matriz de campo de estructura empnum, copia el valor del campo empname del primer registro fijo en el primer elemento de la matriz de campo de estructura empname y realiza una operación similar para cada registro fijo de la matriz origen.

    La operación equivalente ocurre si el origen es un solo registro fijo que tiene una subestructura como esta:
      10 mySubStructure[10]
        15 empnum  CHAR(3);
        15 empname CHAR(20);    
  • Finalmente, observe el caso en el que el origen es un registro fijo que incluye estos campos de estructura:
      10 empnum  CHAR(3);
      10 empname CHAR(20)[10];
    El destino es un formulario, un registro fijo o un campo de estructura que tiene la subestructura siguiente:
      10 empnum char(3)[10];
      10 empname char(20);

    El valor del campo empnum se copia del origen al primer elemento de empnum en el destino y el valor del primer elemento de de empname se copia del origen al campo empname en el destino.

for all
El propósito de for all es asignar valores a todos los elementos de una matriz destino.

A continuación se proporcionan ejemplos de origen y destino:

origen
Uno de los siguientes:
  • Una matriz dinámica de registros, registros fijos o variables primitivas
  • Un registro
  • Un registro fijo
  • Un campo de estructura con o sin subestructura
  • Una matriz de campo de estructura con o sin subestructura
  • Una variable primitiva
  • Un literal o constante
destino
Uno de los siguientes:
  • Una matriz dinámica de registros, registros fijos o variables primitivas
  • Una matriz de campo de estructura con o sin subestructura
  • Un elemento de una matriz dinámica o de campo de estructura

La sentencia move en este caso es equivalente a varias sentencias assignment, una por elemento de matriz destino y se produce un error si una asignación intentada no es válida. Para obtener detalles sobre la validez, consulte la sección Asignaciones.

Si un elemento origen o destino tiene una estructura fija, la sentencia move trata esa estructura como un campo de tipo CHAR a menos que el nivel superior de la estructura especifique un tipo primitivo distinto. Cuando se esté utilizando for all, la sentencia move no tiene en cuenta la subestructura.

Si el origen es un elemento de una matriz, el origen se trata como una matriz en la que el elemento especificado es el primer elemento y se ignoran los elementos anteriores.

Si el origen es una matriz o un elemento de una matriz, cada elemento sucesivo de la matriz origen se copia en el elemento siguiente según la secuencia de la matriz destino. La matriz destino o la matriz origen pueden ser una mayor que la otra y la operación finaliza cuando se copian datos del último elemento con un elemento coincidente en la otra matriz.

Si el origen no es una matriz ni un elemento de una matriz, la operación utiliza el valor origen para inicializar cada elemento de la matriz destino.

for cuenta
El propósito de for cuenta es asignar valores a un subconjunto secuencial de elementos de una matriz destino. Ejemplos:
  • La sentencia siguiente mueve "abc" a los elementos 7, 8 y 9 en el destino:
      move "abc" to target[7] for 3
  • La sentencia siguiente mueve los elementos 2, 3 y 4 del origen a los elementos 7, 8 y 9 del destino:
      move source[2] to target[7] for 3

La operación funciona de la manera siguiente:

  • Si el origen no es una matriz ni un elemento de una matriz, la operación utiliza el valor origen para inicializar elementos de la matriz destino.
  • Si el origen es una matriz, el primer elemento de esa matriz es el primero de un conjunto de elementos a copiar. Si el origen es un elemento de una matriz, ese elemento es el primero de un conjunto de elementos a copiar.
  • Si el destino es una matriz, el primer elemento de esa matriz es el primero de un conjunto de elementos en recibir datos. Si el destino es un elemento de una matriz, ese elemento es el primero de un conjunto de elementos que recibe datos.
El valor cuenta indica cuántos elementos destino deben recibir datos. El valor puede ser cualquiera de estos:
  • Un literal entero
  • Una variable que se resuelve en un entero
  • Un expresión numérica, pero no una invocación de función

La sentencia move es equivalente a varias sentencias assignment, una por elemento de matriz destino y se produce un error si una asignación intentada no es válida. Para obtener detalles sobre la validez, consulte la sección Asignaciones.

Si un elemento origen o destino tiene una estructura interna, la sentencia move trata esa estructura como un campo de tipo CHAR a menos que el nivel superior de esa estructura especifique un tipo primitivo distinto. Cuando se está utilizando for cuenta, la sentencia move no tiene en cuenta la subestructura.

Cuando el origen y el destino son matrices, la matriz destino o la matriz origen pueden ser una mayor que la otra y la operación finaliza cuando tiene lugar el primero de dos sucesos:
  • Se copian datos entre los últimos elementos para los que se ha solicitado la operación
  • Se copian datos desde el último elemento con un elemento coincidente en la otra matriz.
Cuando el origen no es una matriz, la operación finaliza cuando tienen lugar el primero de dos sucesos:
  • Se copian datos en el último elemento para el que se ha solicitado la operación
  • Se copian datos en el último elemento de la matriz.

Si un registro es una matriz de registros (o un elemento de uno), el destino debe ser una matriz de registros. Si el origen es una matriz de variable primitiva (o un elemento de una), el destino debe ser una matriz de variable primitiva o una matriz de campo de estructura. Si el origen es una matriz de campo de estructura (o un elemento de una), el destino debe ser una matriz de variable primitiva o una matriz de campo de estructura.

Consulta relacionada
Matrices
Asignaciones

Condiciones de uso | Comentarios
(C) Copyright IBM Corporation 2000, 2005. Reservados todos los derechos.