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

Pantallas: @Layout y Screen

Un Screen es una pantalla interactiva 5250: define su distribución (@Layout) y reacciona a eventos del usuario (@Source).

1. Estructura mínima

@Properties {
    Type : Screen
    Name : SFORM01
    Description : "Pantalla de ejemplo"
    Path : Screens
}
@References {
    Tables = ["../tables/TLADD50.warp"]
}
@Variables {
    Global {
        Usuario  char(10)
        Fecha    Date
    }
}
@Parameters {
}
@Layout {
    @Label(1,2,&Usuario)
    @Label(1,70,&Fecha)
    @Input("txtNroSolicitud", 3, 1, "Nro. Solicitud: ", &NroSolicitud, true)
}
@Source {
    Event Init
        &Usuario = UserId()
        &Fecha   = Today()
    EndEvent
}

A diferencia de un Program, un Screen no tiene @Structure propia — sólo referencia tablas para leer/escribir.

Parámetros del Screen

El bloque @Parameters del ejemplo está vacío, pero un Screen (pantalla completa o Popup) puede declararlo igual que un Program: @Parameters { in:&X, inout:&Y, out:&Z }. Los valores están disponibles desde Event Init y se invoca con Call(Nombre, ...). En un Popup sirve para recibir datos y devolver la selección del usuario. Ver @Parameters.

2. Controles de @Layout

  • Label(x, y, texto): texto/variable estático. x,y = 1,1 (esquina exacta) está prohibido — DDS lo rechaza.

  • Input("Nombre", x, y, texto, &Variable, habilitado): campo editable. "Nombre" es lo que devuelve CurrentInput() cuando el cursor cae ahí. habilitado es opcional (default true): literal, &Variable, Funcion() de retorno number o una condición completa (Not &Bloqueado = 1 And &Estado <> "9").

    Si la variable es char/varchar, el campo admite minúsculas y el programa recibe lo tipeado tal cual (Lima, no LIMA); para ignorar la diferencia al comparar use Upper(&campo). Los Input numéricos, de fecha y de hora no cambian.

  • DataGridView("Nombre", x, y, filas)[...]: grilla — ver DataGridView.

Los nombres de control pueden prefijarse con @ (@Label, @Input) o no — es sólo estilo, mismo significado.

Ancho disponible y error E00353

Ningún elemento puede terminar más allá de la última columna de la pantalla: 80 por defecto, 132 si el proyecto declara ese tamaño, o el ancho de la ventana en un popup. Terminar justo en la última columna sí cabe. Si no cabe, el compilador reporta E00353 (IBM i rechazaría el campo o lo partiría en dos filas). El ancho de cada elemento se calcula así:

  • Label: el largo del texto.

  • Input: la etiqueta + 1 espacio + el ancho de la variable.

  • DataGridView: la suma de los anchos de sus columnas visibles, más la separación entre cada par de columnas contiguas. El ancho de una columna es el mayor entre el encabezado y el dato. La separación es el separador declarado o, si no hay separador o es más corto, al menos 1 posición (un espacio). Las columnas Hidden no cuentan: se declaran como campos ocultos del subfile, sin línea ni posición en pantalla.

    En 5250 cada campo lleva un byte de atributo justo antes de su primer carácter; sin ese espacio libre, el de una columna se solaparía con el último carácter de la anterior (CPD7866) y la columna no se mostraría. Por eso, sin separador, cada columna queda una posición más a la derecha que la anterior.

    Ejemplo: tres columnas de 6, 20 y 15 posiciones, sin separador, ocupan 6 + 1 + 20 + 1 + 15 = 43 posiciones; con una grilla en la columna 2 terminan en la 44.

La columna donde termina el elemento es x + ancho - 1; si supera el máximo, acorte el texto o los anchos, o mueva el elemento a la izquierda.

Color y atributos con Style

Label, Input y Column (de un DataGridView) aceptan al final uno o varios Style(...) con un color (Green, White, Red, Blue, Yellow, Pink, Turquoise) y atributos (Reverse, High, Underline, Blink, Hidden). Un Style puede llevar al final una condición, y entonces se aplica sólo mientras se cumpla:

Label(1,2,&Titulo,Style(Reverse,High))
Label(5,2,&Desc,Style(Red,&Estado = "9"),Style(Green))
Input("TxtOp",7,2,"Operacion:",&Op,Not &Bloqueado = 1,Style(Yellow,Underline))

Por elemento se admite a lo sumo un Style sin condición y hasta tres con condición. En una Column la condición se evalúa por fila, en el momento de LoadRow(), con los valores de las variables en ese instante (asígnalas antes de LoadRow()); el color queda guardado con la fila:

Column("Cantidad",&VCant,Style(Red,High,&VCant > 100),Style(Green))

La habilitación dinámica por fila (Column(..., Input) condicionado) aún no existe. Detalle completo en @Layout: Style.

3. Eventos estándar

EventoCuándo dispara
InitUna sola vez, antes del primer despliegue.
LoadUna sola vez, antes del primer despliegue — típicamente llena el DataGridView con LoadRow() (la grilla se reinicia al entrar).
EnterAl presionar Enter (sin tecla de función activa).
RefreshAl presionar F5, si está declarada en @FunctionKeys del proyecto. Después recarga el DataGridView, si lo hay.
CloseFijo a F3 — siempre corre y cierra la pantalla, sin declaración necesaria.
@Source {
    Event Init
        &Usuario = UserId()
    EndEvent

    Event Load
        For Each In LADD50 Index LADD5010
        Where SPT25PAIS = &nPais
            &cEstado = ADSTS50
            LoadRow()
        EndFor
    EndEvent

    Event Enter
        &Control = CurrentInput()
        Message("Control activo: " + &Control, Info)
    EndEvent
}

Dos sentencias ayudan a controlar la pantalla desde cualquier evento: &Variable.SetFocus() ubica el cursor en un Input, y Refresh / Refresh Keep recargan el DataGridView. Ver @Source: Event y Screen.

4. Teclas de función personalizadas

Además de los eventos estándar, se puede atar un evento a cualquier tecla F1-F24 (F13-F24 vía Shift):

@Source {
    Event 'BuscarCliente' 4
        Message("Se presionó F4", Info)
    EndEvent
}

Por defecto, la fila de teclas de función muestra el nombre del evento (F4=BuscarCliente). Para mostrar otro texto, agrégalo entre comillas después de la tecla (máximo 20 caracteres):

Event 'BuscarCliente' 4 "Buscar"

El nombre del evento ('BuscarCliente') se convierte en el nombre de un subprocedimiento RPG, por eso debe ser un identificador: letras, dígitos y _, empezando por letra (E00357). El texto con espacios va como tercer valor: Event 'Borrar' 7 "Borrar fila".

Este texto tiene prioridad sobre el declarado en @FunctionKeys del .warpcfg del proyecto — ver Proyecto.

Posición y color de la fila de teclas

Por defecto la fila se dibuja en Rows - 1 (la fila 23 en una pantalla de 24x80; en un popup, la última fila de la ventana menos una). Con Function Keys Row se elige otra fila, y con Function Keys Color se colorea toda la fila. Ambas propiedades se declaran en @GeneratorConfig/@Screen (para todo el proyecto) o en el @Properties de un Screen (solo ese objeto, y manda sobre el proyecto):

@Properties {
    Type               : Screen
    Name               : SCLIENTES
    Function Keys Row  : 22
    Function Keys Color: Blue
}

La fila debe estar entre 1 y Rows - 1 (la última queda para los mensajes); si no, se reporta E00346. El compilador no avisa si la fila invade el @Layout: déjala libre. Un color inválido da E00347.

Cada Event puede llevar su propio color al final, que manda sobre el de la fila:

Event 'Borrar' 7 "Borrar" Red

Los colores son Green, White, Red, Blue, Yellow, Pink y Turquoise.

Rotación de teclas con F24

Si F24 está declarada en @FunctionKeys (por ejemplo F24 : "Mas teclas") y ningún Event la usa, las teclas que no caben en una fila se reparten en juegos rotativos. Con F3 : "Salir", F5 : "Refrescar" y los eventos Event 'Inicio' 6, Event 'Salida' 7, Event 'Cursor' 8 y Event 'Despues' 9 "Tras Refresh":

Juego 1: F3=Salir  F5=Refrescar  F6=Inicio  F7=Salida  F8=Cursor  F24=Mas teclas
Juego 2: F9=Tras Refresh  F24=Mas teclas

Cada juego cabe en una sola fila (ancho de la pantalla menos 2 columnas; el de la ventana en un popup), las teclas van ordenadas por número y cada juego termina con F24. Al pulsar F24 se muestra el juego siguiente y tras el último se vuelve al primero; la pulsación solo cambia la fila de teclas y no ejecuta ningún evento. Si todas las teclas caben en una fila no hay rotación. Si no se declara F24, o si un Event la usa, la fila muestra todas las teclas, en una o dos filas.

5. Mensajes al usuario

Message("Filas encontradas: " + String(&nFilas, 5), Info)

Error (rojo), Warning (amarillo), Info (color normal). Se muestra en el siguiente refresco y se limpia después de un ciclo.

6. Siguiente paso

Si la pantalla necesita mostrar una lista de filas con selección/paginación, ver DataGridView.