Asignaciones

Una asignación EGL puede tener cualquiera de estos efectos:

Diagrama de sintaxis para la sentencia assignment
destino
Un elemento, registro o variable de sistema
origen
Una expresión o registro. Una expresión puede estar formada por una serie compleja de símbolos (por ejemplo, a + b + c) o puede ser uno de los siguientes elementos:
  • Un elemento o variable de sistema
  • Una invocación de función
  • Un literal
Por omisión, un registro es equivalente a un elemento de tipo CHAR, con el número total de bytes igual a la suma de bytes de los elementos de estructura. Cuando el registro es de tipo CHAR, se aplican las siguientes excepciones:

A continuación se ofrecen ejemplos de asignaciones:

  z = a + b + c;
  myDate = VGVar.currentShortGregorianDate;
  myUser = sysVar.userID;
  myRecord01 = myRecord02;
  myRecord02 = "USER";

La tabla y las descripciones que siguen indican las normas de compatibilidad.

Tipo primitivo destino Tipos primitivos origen (o loose) válidos para el destino
BIN BIN, INT, BIGINT, SMALLINT, DECIMAL, NUM, NUMBER, NUMC, PACF, FLOAT, SMALLFLOAT, MONEY
CHAR CHAR, DATE, TIME, HEX, MBCHAR, NUM, NUMBER, TIMESTAMP
DATE DATE, CHAR, NUM, TIMESTAMP
DBCHAR DBCHAR
DECIMAL BIN, INT, BIGINT, SMALLINT, DECIMAL, NUM, NUMBER, NUMC, PACF
FLOAT BIN, INT, BIGINT, SMALLINT, DECIMAL, NUM, NUMBER, NUMC, PACF, FLOAT, SMALLFLOAT, MONEY
HEX CHAR, HEX
INTERVAL INTERVAL
MBCHAR CHAR, MBCHAR
MONEY BIN, INT, BIGINT, SMALLINT, DECIMAL, NUM, NUMBER, NUMC, PACF, FLOAT, SMALLFLOAT
NUM BIN, INT, DATE, TIME, BIGINT, SMALLINT, CHAR, NUM, NUMBER, NUMC, PACF, DECIMAL, FLOAT, SMALLFLOAT, MONEY
NUMC BIN, INT, BIGINT, SMALLINT, DECIMAL, NUM, NUMBER, NUMC, PACF, FLOAT, SMALLFLOAT
PACF BIN, INT, BIGINT, SMALLINT, DECIMAL, NUM, NUMBER, NUMC, PACF
SMALLFLOAT BIN, INT, BIGINT, SMALLINT, DECIMAL, NUM, NUMBER, NUMC, PACF, FLOAT, SMALLFLOAT, MONEY
TIME TIME, CHAR, NUM, TIMESTAMP
TIMESTAMP CHAR, DATE, TIME, TIMESTAMP
UNICODE UNICODE
Un caso especial es el siguiente: el valor numérico devuelto desde una palabra matemática del sistema puede asignarse a un elemento de tipo HEX; para obtener detalles, consulte el apartado Matemáticas (palabras del sistema).

El comportamiento de una sentencia assignment de EGL es distinto del de una sentencia move que se describe en un tema de consulta distinto.

Asignación en diversos tipos numéricos

Un valor de cualquiera de los tipos numéricos (BIN, DECIMAL, FLOAT, MONEY, NUM, NUMBER, NUMC, PACF, SMALLFLOAT) puede asignarse a un elemento de cualquier tipo numérico y tamaño, y EGL realizará las conversiones necesarias para conservar el valor en el formato destino.

Cuando el destino es un tipo de coma fija (no FLOAT ni SMALLFLOAT), se añaden ceros no significativos o se trunca según sea necesario. (Los ceros iniciales de la parte entera de un valor no son significativos, al igual que los ceros finales de la parte fraccionaria de un valor).

Para cualquiera de los tipos numéricos, puede utilizar la variable de sistema sysVar.overflowIndicator para comprobar si una asignación o un cálculo numérico han provocado un desbordamiento aritmético, y puede establecer la variable de sistema VGVar.handleOverflow para especificar la consecuencia de tal desbordamiento.

Si se produce un desbordamiento aritmético, el valor del elemento destino no cambia. Si no se produce un desbordamiento aritmético, el valor asignado al elemento destino se alinea de acuerdo con la declaración del elemento destino.

Supongamos que está copiando un elemento de tipo NUM en otro y que el valor de tiempo de ejecución del elemento origen es 108.314:
  • Si el elemento destino permite siete dígitos con una posición decimal, el elemento destino recibe el valor 000108.3, y no se detecta desbordamiento numérico. (Una perdida de precisión en un valor fraccionario no se considera desbordamiento).
  • Si el elemento destino permite cuatro dígitos con dos posiciones decimales, se detecta un desbordamiento numérico y el valor del elemento destino no cambia.

Cuando asigna un valor de coma flotante (tipo FLOAT o SMALLFLOAT) a un elemento de un tipo de coma fija, el valor destino se trunca si es necesario. Si un valor origen es 108.357 y el destino de coma fija tiene un decimal, por ejemplo, el destino recibe 108.3.

Otras asignaciones de tipos cruzados

A continuación se ofrecen detalles acerca de otras asignaciones de tipos cruzados:
  • La asignación de un valor de tipo NUM a un destino de tipo CHAR sólo es válida si la declaración origen no tiene posiciones decimales. Esta operación es equivalente a una asignación de CHAR a CHAR.
    Si la longitud origen es 4 y el valor es 21, por ejemplo, el contenido es equivalente a "0021", y una discrepancia de longitudes no provoca una condición de error:
    • Si la longitud del destino es 5, el valor se almacena como "0021 " (se añade un espacio de un solo byte a la derecha)
    • Si la longitud del destino es 3, el valor se almacena como "002 " (se trunca un dígito a la derecha)

    Si el valor de tipo NUM es negativo y se asigna a un valor de tipo CHAR, el último byte copiado en el elemento es un carácter no imprimible.

  • La asignación de un valor de tipo CHAR a un destino de tipo NUM sólo es válida en el caso siguiente:
    • El origen (un elemento o expresión de serie) contiene dígitos sin otros caracteres
    • La declaración destino no tiene posiciones decimales

    Esta operación es equivalente a una asignación de NUM a NUM.

    Si la longitud origen es 4 y el valor es "0021", por ejemplo, el contenido es equivalente a un 21 numérico; en los siguientes ejemplos se muestra el efecto de una discrepancia de longitudes:
    • Si la longitud del destino es 5, el valor se almacena como 0021 (se añade un cero numérico a la izquierda)
    • Si la longitud del destino es 3, el valor se almacena como 021 (se trunca un dígito no significativo)
    • Si la longitud del destino es 1, el valor se almacena como 1
  • La asignación de un valor de tipo NUMC a un destino de tipo CHAR es posible en dos pasos, lo que elimina el signo si el valor es positivo:
    1. Asigne el valor NUMC a un destino de tipo NUM
    2. Asigne el valor NUM a un destino de tipo CHAR

    Si el valor del destino de tipo NUMC es negativo, el último byte copiado en destino de tipo CHAR es un carácter no imprimible.

  • La asignación de un valor de tipo CHAR a un destino de tipo HEX sólo es válida si los caracteres del origen están dentro del rango de dígitos hexadecimales (0-9, A-F, a-f).
  • La asignación de un valor de tipo HEX a un destino de tipo CHAR almacena dígitos y letras mayúsculas (A-F) en el destino.
  • La asignación de un valor de tipo MONEY a un destino de tipo CHAR no es válida. El procedimiento recomendado para convertir de MONEY a CHAR consiste en utilizar la función del sistema formatNumber.
  • La asignación de un valor de tipo NUM o CHAR a un destino de tipo DATE solo es válida si el valor origen es una fecha válida de acuerdo con la máscara aaaaMMdd; para obtener detalles, consulte el tema DATE.
  • La asignación de un valor de tipo NUM o CHAR a un destino de tipo TIME solo es válida si el valor fuente es una hora válida de acuerdo con la máscara hhmmss; para obtener detalles, consulte el tema TIME.
  • La asignación de un valor de tipo CHAR a un destino de tipo TIMESTAMP solo es válida si el valor origen es una indicación de la hora válida de acuerdo con la máscara del elemento TIMESTAMP. A continuación se ofrece un ejemplo:
       // NO válido porque el 30 de febrero no es una fecha válida
       myTS timestamp("aaaaMMdd");
       myTS = "20050230";
    Si faltan los caracteres iniciales de una máscara completa (por ejemplo, si la máscara es "dd"), EGL supone que los caracteres de nivel superior ("aaaaMM", en este caso) representen el momento actual, de acuerdo con el reloj del sistema. Las sentencias siguientes originan un error de tiempo de ejecución en febrero:
       // NO válido si se ejecuta en febrero
       myTS timestamp("dd"); 
       myTS = "30";
  • La asignación de un valor de tipo TIME o DATE a un destino de tipo NUM es equivalente a una asignación NUM a NUM.
  • La asignación de un valor de tipo TIME, DATE o TIMESTAMP a un destino de tipo CHAR es equivalente a una asignación CHAR a CHAR.

Relleno y truncamiento en tipos de caracteres

Si el destino es de tipo carácter (CHAR, DBCHAR, HEX, MBCHAR, UNICODE) y tiene más espacio que el necesario para almacenar un valor origen, EGL lo rellena con datos por la derecha:
  • Utiliza blancos de un solo byte para rellenar un destino de tipo CHAR o MBCHAR
  • Utiliza blancos de doble byte para rellenar un destino de tipo DBCHAR
  • Utiliza blancos de doble byte Unicode para rellenar un destino de tipo UNICODE
  • Utiliza ceros binarios para rellenar un destino de tipo HEX, lo que significa (por ejemplo) que un valor origen "0A" se almacena en un destino de doble byte como "0A00" en lugar de "000A"
EGL trunca los valores por la derecha si el destino de un tipo de carácter no tiene espacio suficiente para almacenar el valor origen. No se indica ningún error. La siguiente situación representa un caso especial:
  • La plataforma de entorno de ejecución da soporte al juego de caracteres EBCDIC
  • La sentencia de asignación copia un literal de tipo MBCHAR o un elemento de tipo MBCHAR en un elemento más corto de tipo MBCHAR
  • Un truncamiento byte por byte eliminaría un carácter de desplazamiento a teclado estándar final o dividiría un carácter DBCHAR

En esta situación, EGL trunca los caracteres según sea necesario para asegurarse de que el elemento destino contiene una serie válida de tipo MBCHAR y, a continuación, añade (si es necesario) blancos de un solo byte al final.

Asignación entre indicaciones de la hora

Si asigna un elemento de tipo TIMESTAMP a otro elemento de tipo TIMESTAMP, se aplican las reglas siguientes:
  • Si a la máscara del elemento origen le faltan entradas de un nivel relativamente alto necesarias para el elemento destino, las entradas de destino correspondientes se asignan de acuerdo con el reloj del sistema en el momento de la asignación, tal como se muestra en estos ejemplos:
    •   sourceTimeStamp timestamp ("MMdd");
      	 targetTimeStamp timestamp ("aaaaMMdd");
      	
      	 sourceTimeStamp = "1201";
      
        // si este código se ejecuta en 2004, la sentencia siguiente
        // asigna 20041201 a targetTimeStamp
      	 targetTimeStamp = sourceTimeStamp; 
    •   sourceTimeStamp02 timestamp ("ssff");
        targetTimeStamp02 timestamp ("mmssff");
      	
      	 sourceTimeStamp02 = "3201";
      
        // la asignación siguiente incluye el minuto
        // en el que se ejecuta la sentencia de asignación
        targetTimeStamp02 = sourceTimeStamp02;
    • Si a la máscara del elemento origen le falta entradas de nivel relativamente bajo necesarias para el elemento destino, a las entradas de destino correspondientes se les asignan los valores válidos más bajos, tal como muestran estos ejemplos:
      • sourceTimeStamp timestamp ("aaaaMM");
        targetTimeStamp timestamp ("aaaaMMdd");
        
        sourceTimeStamp = "200412";
        
        // independientemente del día, la sentencia siguiente
        // asigna 20041201 a targetTimeStamp
        targetTimeStamp = sourceTimeStamp; 
      • sourceTimeStamp02 timestamp ("hh");
        targetTimeStamp02 timestamp ("hhmm");
        
        sourceTimeStamp02 = "11";
        
        // independientemente del minuto, la sentencia siguiente
        // asigna 1100 a targetTimeStamp02
        targetTimeStamp02 = sourceTimeStamp02;

Asignación hacia o desde elementos subestructurados

Puede asignar un elemento subestructurado a un elemento no subestructurado o a la inversa, y puede asignar valores entre dos elementos subestructurados. Supongamos, por ejemplo, que las variables denominadas myNum y myRecord se basan en los siguientes componentes:

  DataItem myNumPart
    NUM(12)
  end

  Record myRecordPart type basicRecord
    10 topMost CHAR(4);
      20 next01 HEX(4);
      20 next02 HEX(4);
  end

La asignación de un valor de tipo HEX a un elemento de tipo NUM no es válida fuera de las palabras matemáticas del sistema; pero una asignación en el formato myNum = topMost es válida, debido a que topMost es de tipo CHAR. En términos generales, los tipos primitivos de los elementos de una sentencia de asignación guían la asignación, y los tipos primitivos de los elementos subordinados no se tienen en cuenta.

El tipo primitivo de un elemento subestructurado es de tipo CHAR por omisión. Si asigna datos hacia o desde un elemento subestructurado y no especifica un tipo primitivo diferente durante la declaración, las normas descritas anteriormente para los elementos de tipo CHAR estarán en vigor durante la asignación.

Asignación de un registro

La asignación de un registro a otro es equivalente a la asignación de un elemento subestructurado de tipo CHAR a otro. Una discrepancia de longitudes añade blancos de un solo byte a la derecha del valor recibido o elimina caracteres de un solo byte a la derecha del valor recibido. La asignación no tiene en cuenta los tipos primitivos de los elementos de estructura subordinados.

Como se ha indicado anteriormente, se aplican las siguientes excepciones:
  • El contenido de un registro puede asignarse a un registro o a un elemento de tipo CHAR, HEX o MBCHAR, pero no a un elemento de ningún otro tipo
  • Un registro puede recibir datos de un registro, de un literal de serie o de un elemento de tipo CHAR, HEX o MBCHAR, pero no de un literal numérico ni de un elemento de un tipo que no sea CHAR, HEX o MBCHAR

Finalmente, si asigna un registro SQL hacia o desde un registro de un tipo diferente, debe asegurarse de que el registro no SQL tenga espacio suficiente para el área de cuatro bytes que precede a cada elemento de estructura.

Conceptos relacionados
Diagrama de sintaxis

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