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

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 varchar en @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 ADDPFM si 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 cualquier Export(...) 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 de If/While/For/Event/etc.).
  • En un Screen: sólo a nivel superior de Event Init (no anidado, y no en ningún otro Event) — Init corre una única vez, antes del loop principal de la pantalla, el mismo lugar donde iría el prólogo de un Program:
@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 cualquier For Each/New sobre Tabla en 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.