Reportes con Member() / Export()
Patrón para generar un reporte: acumular filas en una tabla física (un miembro de datos exclusivo del usuario/ejecución) y, al terminar, volcarlo a un archivo de texto en el IFS.
Esta funcionalidad usa
varcharen@Variables— ver Tipos de dato.
1. Ejemplo completo
@Properties {
Type : Program
Name : PTESTME
}
@References {
Tables = ["../tables/TLT3D01.warp"]
}
@Variables {
global {
Usuario char(10)
Destino varchar(200)
T301TIPLOT char(1)
T301NROTAR char(19)
}
}
@Source {
&Usuario = USERID()
&Destino = "/tmp/reporte.txt"
Member(LT3D01, &Usuario)
For Each In LT3D01 Index LT3D0101
Where T301TIPLOT = &T301TIPLOT
Where T301NROTAR = &T301NROTAR
// ... acumula filas en LT3D01, p.ej. con New In LT3D01 ...
EndFor
Export(LT3D01, &Destino)
}
2. Member(Tabla, expr): un miembro por usuario/ejecución
Member(LT3D01, &Usuario)
Liga un miembro de datos (parametrizado por expr, típicamente &Usuario para que cada usuario tenga el suyo) a Tabla para todo el programa:
- Lo crea con
ADDPFMsi no existe todavía (tolera el error si ya existe). - Lo deja activo con
OVRDBF— efectivo para el resto del programa, incluida cualquier apertura de esa tabla y cualquierExport(...)posterior sobre la misma.
Reglas de posición (a lo sumo una vez por tabla, en cualquier caso):
- En un
Program: sólo a nivel superior de@Source(no anidado dentro deIf/While/For/Event/etc.). - En un
Screen: sólo a nivel superior deEvent Init(no anidado, y no en ningún otroEvent) —Initcorre una única vez, antes del loop principal de la pantalla, el mismo lugar donde iría el prólogo de unProgram:
@Properties {
Type : Screen
Name : SGRIDDEMO
}
@Source {
Event Init
Member(LT3D01, &Usuario)
EndEvent
Event Load
For Each In LT3D01 Index LT3D0101
// ... llena el DataGridView, o lee/escribe filas ...
EndFor
EndEvent
}
Export(...) sigue sin estar permitido en Screen — no hay caso de uso para exportar un reporte desde una pantalla interactiva.
Importante:
Member(Tabla, expr)debe aparecer antes de cualquierFor Each/NewsobreTablaen el mismo cuerpo — usarlo después de haber leído/escrito la tabla es un error en tiempo de ejecución, no de compilación.
3. Export(Tabla, destino): volcar a IFS
Export(LT3D01, &Destino)
Copia el miembro activo de Tabla (el que dejó Member(...), si hay uno) a un stream file del IFS con CPYTOIMPF, formato delimitado por coma (RCDDLM(*CRLF) STRDLM(*NONE) FLDDLM(',')), reemplazando el destino si ya existe (MBROPT(*REPLACE)).
Reglas: sólo válido en Program; a diferencia de Member, sin restricción de posición — se usa donde convenga, típicamente después del For Each/New que llenó la tabla de reporte.