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íneaNombre tipo(...)por columna. Sólochar/number/date— ver Tipos de dato. Modificadores disponibles:Description(...),Default(...),AllowNull.@Indexes:PrimaryKey(obligatoria, sus campos no pueden serAllowNull),Unique,Index— cada uno comoKind(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.