Tipos de dato
| Tipo | Sintaxis | Dónde | Descripción |
|---|---|---|---|
char | char(longitud) | @Fields, @Variables | Cadena de longitud fija. longitud requerida (1-32.766 en @Fields; 1-16.773.104 en @Variables). |
varchar | varchar(longitud) | sólo @Variables | Cadena de longitud variable. longitud requerida (1-16.773.100). Length(...) devuelve el contenido real en tiempo de ejecución, a diferencia de char. |
number | number(precisión, escala) | @Fields, @Variables | Numérico. precisión requerida (1-30 en @Fields; 1-63 en @Variables); escala opcional, default 0. |
date | date | @Fields, @Variables | Fecha, sin parámetros. En @Fields no puede llevar Default(...). |
time | time | @Fields, @Variables | Hora (hora/minuto/segundo), sin parámetros. En @Fields no puede llevar Default(...). |
timestamp | timestamp | @Fields, @Variables | Fecha y hora combinadas (con microsegundos), sin parámetros. En @Fields no puede llevar Default(...). |
field | field(NombreCampo) | sólo @Variables | Hereda el tipo de un campo NombreCampo de @Structure de alguna tabla referenciada. |
list | list(tipo) | sólo @Variables | Lista dinámica de tipo (escalar, struct(Template) o field(...); no admite otro list ni matrix anidado, ver E00283). Sin tamaño en la declaración — la capacidad interna máxima es fija (9999 elementos) y no configurable. Se lee/escribe un elemento con &Variable[índice]; se agrega/quita/consulta con métodos (ver List: métodos). |
matrix | matrix(filas, cols, tipo) | sólo @Variables | Grilla 2D de tamaño fijo filas x cols de tipo. Se lee/escribe un elemento con &Variable[fila, col]. |
struct | struct(NombreTemplate) | sólo @Variables | Instancia de un template struct NombreTemplate [ ... ] definido inline en el ámbito global (ver Struct: templates y acceso a miembro). Se accede a un miembro con &Variable.Miembro. |
Ejemplos
@Variables {
global {
Usuario char(10)
Destino varchar(200)
Saldo number(9,2)
FechaAlta date
HoraAlta time
FechaHoraAlta timestamp
Estado field(ADSTS50)
Lista1 list(number(5))
Tablero matrix(8, 8, char(1))
}
}
Interoperabilidad char/varchar
char y varchar interoperan en asignaciones — la regla es sólo de longitud (el origen debe entrar en el destino), sin importar cuál de los dos es fijo o variable:
&VarcharDestino = &CharOrigen // válido si longitud(CharOrigen) <= longitud(VarcharDestino)
&CharDestino = &VarcharOrigen
List/Matrix: indexación
&Lista1[1] = 100
&Tablero[3, 5] = "X"
El índice es 1-based. List/Matrix sólo son válidos en @Variables, nunca en @Fields.
List: métodos
list no lleva tamaño en la declaración (list(tipo), sin parámetro de capacidad): la capacidad interna máxima es fija en 9999 elementos, definida por el compilador y no configurable desde el lenguaje. En vez de fijar el tamaño de antemano, se administra el contenido con métodos, con sintaxis de miembro (&Variable.Metodo(...)):
| Método | Uso | Descripción |
|---|---|---|
Add(valor) | sentencia | Agrega valor al final de la lista. valor debe ser compatible en tipo con el elemento de la lista (si el elemento es struct(Template), valor debe ser una &Variable de ese mismo template exacto). |
Clear() | sentencia | Vacía la lista (la cuenta de elementos vuelve a 0). |
Remove(indice) | sentencia | Quita el elemento en la posición indice (1-based, tipo number) y recorre los siguientes una posición hacia atrás. |
Count() | expresión | Devuelve la cantidad actual de elementos (tipo number). Sólo se puede usar dentro de una expresión, nunca como sentencia suelta. |
&Lista1.Add(10)
&Lista1.Add(20)
&Lista1.Add(30)
For &i = 1 To &Lista1.Count()
// ... &Lista1[&i] ...
EndFor
&Lista1.Remove(2)
&Lista1.Clear()
No existe un For Each sobre una lista en memoria — el recorrido se hace con el For clásico por contador (For &i = 1 To &Lista.Count()) más el indexado &Variable[&i] (For Each In sigue siendo exclusivo de tablas de base de datos, ver @Source: sentencias de control).
Si Add(valor) se llama cuando la lista ya está en su capacidad máxima (9999 elementos), el programa emite un dsply visible con el mensaje Lista {nombre} alcanzó su capacidad máxima (9999) y no agrega el elemento — no aborta el programa completo.
list(struct(Template)) es válido (una lista de instancias de un mismo struct). Anidar list/matrix entre sí no lo es, en ninguna combinación: list(list(...)), list(matrix(...)), matrix(list(...)) y matrix(matrix(...)) reportan el error de compilación E00283 (“‘&{variable}’ es un {list/matrix} cuyo elemento no puede ser {list/matrix} (sin equivalente RPG generable): use un tipo escalar, struct(…) o field(…).”), detectado en el análisis semántico — no es posible declarar un arreglo cuyo elemento sea a su vez otro arreglo.
Struct: templates y acceso a miembro
Un template con nombre y miembros, definido inline dentro del ámbito global de @Variables:
@Variables {
global {
struct Person [
Id number(10, 0)
Nombre varchar(50)
Email varchar(100)
Edad number(3, 0)
]
personaGlobal struct(Person)
Nombre varchar(50)
}
ImprimirPersona {
persona struct(Person)
}
}
&personaGlobal.Nombre = "Su Nombre"
&Nombre = &personaGlobal.Nombre
Do ImprimirPersona(&personaGlobal)
-
Los miembros del template admiten
char/varchar/number/date/time/timestamp/field(NombreCampo)— no se puede anidar otrostruct, ni usarlist/matrixcomo miembro. -
Se accede/asigna un miembro con
&Variable.Miembro(lectura y escritura). -
Se puede pasar como parámetro y devolver desde una
Procedure/Functionpropia — ver Procedure / Function. -
Un arreglo de
structse declara conlist(struct(NombreTemplate))— ver List: métodos. -
El indexado
&Lista[i]de unalist(struct(Template))es válido, pero sólo en dos formas exactas: como lectura, el valor completo de una asignación a otra&Variableque seastruct(...)del mismo template (&otraVariable = &Lista[i]); como escritura,&Lista[i] = &otraVariable(otra&Variablestruct(...)del mismo template, nunca una expresión o un literal). Si el lado de la asignación que debería ser la variable struct no es sintácticamente una&Variable, se reportaE00241; si el template no coincide exactamente con el de la lista, se reportaE00242. Los chequeos de índice (cantidad, tiponumber, rango 1..9999) aplican igual que para cualquier otralist:&otroRegistro = &Lista[1] &Lista[1] = &otroRegistro For &i = 1 To &Lista.Count() &actual = &Lista[&i] EndFor -
No soportado todavía:
structanidado dentro de otrostruct, nistructcomo parámetro de un programa externo (@Parameters/Call) — sólo como parámetro de unaProcedure/Functioninterna.