Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Tipos de dato

TipoSintaxisDóndeDescripción
charchar(longitud)@Fields, @VariablesCadena de longitud fija. longitud requerida (1-32.766 en @Fields; 1-16.773.104 en @Variables).
varcharvarchar(longitud)sólo @VariablesCadena de longitud variable. longitud requerida (1-16.773.100). Length(...) devuelve el contenido real en tiempo de ejecución, a diferencia de char.
numbernumber(precisión, escala)@Fields, @VariablesNumérico. precisión requerida (1-30 en @Fields; 1-63 en @Variables); escala opcional, default 0.
datedate@Fields, @VariablesFecha, sin parámetros. En @Fields no puede llevar Default(...).
timetime@Fields, @VariablesHora (hora/minuto/segundo), sin parámetros. En @Fields no puede llevar Default(...).
timestamptimestamp@Fields, @VariablesFecha y hora combinadas (con microsegundos), sin parámetros. En @Fields no puede llevar Default(...).
fieldfield(NombreCampo)sólo @VariablesHereda el tipo de un campo NombreCampo de @Structure de alguna tabla referenciada.
listlist(tipo)sólo @VariablesLista 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).
matrixmatrix(filas, cols, tipo)sólo @VariablesGrilla 2D de tamaño fijo filas x cols de tipo. Se lee/escribe un elemento con &Variable[fila, col].
structstruct(NombreTemplate)sólo @VariablesInstancia 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étodoUsoDescripción
Add(valor)sentenciaAgrega 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()sentenciaVacía la lista (la cuenta de elementos vuelve a 0).
Remove(indice)sentenciaQuita el elemento en la posición indice (1-based, tipo number) y recorre los siguientes una posición hacia atrás.
Count()expresiónDevuelve 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 otro struct, ni usar list/matrix como miembro.

  • Se accede/asigna un miembro con &Variable.Miembro (lectura y escritura).

  • Se puede pasar como parámetro y devolver desde una Procedure/Function propia — ver Procedure / Function.

  • Un arreglo de struct se declara con list(struct(NombreTemplate)) — ver List: métodos.

  • El indexado &Lista[i] de una list(struct(Template)) es válido, pero sólo en dos formas exactas: como lectura, el valor completo de una asignación a otra &Variable que sea struct(...) del mismo template (&otraVariable = &Lista[i]); como escritura, &Lista[i] = &otraVariable (otra &Variable struct(...) 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 reporta E00241; si el template no coincide exactamente con el de la lista, se reporta E00242. Los chequeos de índice (cantidad, tipo number, rango 1..9999) aplican igual que para cualquier otra list:

    &otroRegistro = &Lista[1]
    &Lista[1] = &otroRegistro
    For &i = 1 To &Lista.Count()
        &actual = &Lista[&i]
    EndFor
    
  • No soportado todavía: struct anidado dentro de otro struct, ni struct como parámetro de un programa externo (@Parameters/Call) — sólo como parámetro de una Procedure/Function interna.