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.
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.
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.
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.
Esta operación es equivalente a una asignación de NUM a NUM.
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.
// NO válido porque el 30 de febrero no es una fecha válida myTS timestamp("aaaaMMdd"); myTS = "20050230";
// NO válido si se ejecuta en febrero myTS timestamp("dd"); myTS = "30";
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.
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;
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;
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.
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.
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
Consulta relacionada
DATE
Sentencias EGL
move
Tipos primitivos
strLib.formatNumber
VGVar.handleOverflow
sysVar.overflowIndicator
TIME