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

Tablas: @Structure, @Fields, @Indexes

Una tabla .warp describe un físico DDS: sus columnas y sus accesos por clave. Se referencia desde un Program/Screen vía @References/Tables.

1. Archivo mínimo

@Properties {
    Type : "Table"
}
@Structure {
    Name        : "GRIDDEMO"
    Description : "Clientes de ejemplo"
    @Fields {
        CodCli   char(6)   Description("Código de Cliente")
        Nombre   char(20)  Description("Nombre")
        Ciudad   char(15)  Description("Ciudad")
    }
    @Indexes {
        PrimaryKey ( GRIDDEMOPK, [CodCli] )
        Index ( GRIDDMNOM, [Nombre] )
    }
}
  • @Fields: una línea Nombre tipo(...) por columna. Sólo char/number/date — ver Tipos de dato. Modificadores disponibles: Description(...), Default(...), AllowNull.
  • @Indexes: PrimaryKey (obligatoria, sus campos no pueden ser AllowNull), Unique, Index — cada uno como Kind(Nombre, [Campo, ...], "Descripción opcional").

2. Referenciarla desde un Program

@References {
    Tables = ["../tables/TLGRIDDEMO.warp"]
}

La ruta es relativa al archivo que la referencia. Una vez referenciada, sus campos quedan disponibles como identificadores sueltos dentro de un For Each/New (ver abajo), y como field(NombreCampo) en @Variables para heredar su tipo.

3. Leer filas: For Each In

@Source {
    For Each In GRIDDEMO Index GRIDDMNOM
    Where CodCli = &VCodCli
        &VNombre = Nombre
        &VCiudad = Ciudad
    When None
        Message("Cliente no encontrado", Error)
    EndFor
}

Index selecciona el acceso (por defecto el de acceso secuencial si se omite); Where filtra por igualdad; When None corre si no hubo ninguna fila.

Unir tablas: Join In

Para leer datos de una tabla relacionada, agregue Join In bajo el For Each. La tabla unida se lee por su PrimaryKey por cada fila recorrida:

For Each In Pedidos
Join In Clientes On CodCli = CodCli
    &VNombre = NomCli
EndFor

Sin On, las columnas de la llave de la tabla unida deben existir con el mismo nombre en la tabla recorrida. Si no hay pareja, la fila no se omite y los campos unidos quedan en blanco o cero. Son de sólo lectura. Detalle completo en @Source: sentencias de control.

4. Insertar filas: New

@Source {
    New In GRIDDEMO
        CodCli = &VCodCli
        Nombre = &VNombre
        Ciudad = &VCiudad
    When Duplicate
        Message("Ya existe ese código", Error)
    EndNew
}

When Duplicate corre si la fila ya existe: el New la busca por la PrimaryKey de la tabla (que debe estar en @Indexes) y, si la encuentra, ejecuta el bloque sobre esa fila y la actualiza si el bloque asignó campos. El bloque admite cualquier sentencia (If, While, Do Case, etc.). Detalle en @Source: sentencias de control.

5. Documentación extendida

Una tabla puede llevar además @Documentation (anidada dentro de @Structure, a diferencia de un Program donde va al nivel superior) con @Author, @Application, @Module, @Repository e @History (@Creation + @Change por cada entrada del changelog) — ver @Structure, @Fields, @Indexes para el detalle completo de cada sub-sección.

6. Ingeniería inversa desde un DDS existente

Si la tabla ya existe en el IBM i, no hace falta escribirla a mano: el comando WaRPGate: Reverse Engineer de la extensión de VSCode se conecta al IBM i, lee el DDS (y opcionalmente sus LF asociadas como @Indexes) y genera el .warp correspondiente. Si el formato de registro del DDS descargado difiere del nombre de la tabla, se escribe Record Format : "X"; si es igual, no se escribe.

Los comentarios del DDS (líneas con * en la columna 7) también se conservan: los del encabezado del archivo quedan como líneas // arriba de @Structure, y los que preceden a un grupo de campos quedan como líneas // justo antes del primer campo del grupo. Los bordes decorativos de asteriscos se omiten.