Qué resuelve: Genera un reporte batch desde DB2 con datos agrupados, totales y promedios, usando lógica de doble corte de control.
Enfoque de solución: El problema se resuelve combinando tres capas:
-
Acceso a datos → SQL con CURSOR sobre DB2
-
Procesamiento en COBOL → lógica de doble corte de control → manejo de estados con niveles 88
-
Presentación → reporte paginado con LINAGE COUNTER
Algunos puntos de diseño en el código
- Estructura de INICIO-PROCESO-FINAL;
- Manejo de estados x medio de niveles 88;
- Paginado automático x medio de LINAGE COUNTER;
- Centrado dinámico de subtítulos mediante FUNCTION TRIM y FUNCTION LENGTH;
- Doble corte de control x medio de PERFORM-INLINE;
- Captura de fecha x medio de Función Intrínseca;
- Manejo de errores centralizado en un subprograma (rutina) reutilizable mediante código defensivo para evitar ABENDs — el programa intercepta errores en cada punto crítico (ON SIZE ERROR, DECLARATIVES, WHENEVER, variable indicadora de DB2, IS NUMERIC, ETC). Ante cualquier error: cierra lo que se pueda cerrar, emite un mensaje detallado por DISPLAY y termina con RC 12 para que el operador sepa exactamente qué pasó y dónde;
- Uso de CURSOR SQL;
- Optimización de performance en DB2 mediante la cláusula FOR FETCH ONLY;
- Integración con DSNTIAR — ante errores DB2, el programa pasa el SQLCA completo a la rutina (RUTERRBA), que internamente invoca la rutina IBM DSNTIAR para formatear el mensaje de error en texto legible por el operador en el spool, eliminando la necesidad de interpretar códigos numéricos.
---------------------------------------------------------------------------------------------------------------------------------- NOTA SOBRE EL USO DE GO TO: Su uso esta segmentado exclusivamente para manejar el flujo de ejecución dentro del estado de error. No interfiere en el flujo de la lógica de negocio, el cual respeta la programación estructurada y la ejecución TOP-DOWN. ---------------------------------------------------------------------------------------------------------------------------------- NOTA SOBRE FILE STATUS: se declara directamente sobre WS-ERR-FILE-STATUS (variable de la COPY de rutina de error), eliminando el MOVE intermedio y estandarizando el manejo de errores en todos los programas que adopten esta arquitectura. ----------------------------------------------------------------------------------------------------------------------------------
graph TD
%% Configuración de Colores Profesionales
classDef inicio_fin fill:#333,stroke:#000,color:#fff,stroke-width:2px;
classDef proceso fill:#f4f4f4,stroke:#666,color:#000;
classDef db2 fill:#d1e9ff,stroke:#005fb8,color:#000;
classDef error fill:#ffebee,stroke:#c62828,color:#c62828
Start((Inicio)) --> Init[1000-INICIO]
subgraph "Inicialización"
Init --> OpenFile[Abrir Archivo SALIDA]
OpenFile --> OpenCursor[EXEC SQL OPEN Cursor]
OpenCursor --> FirstRead[2100-LEER-CURSOR]
end
FirstRead --> Loop{¿PGM-FIN?}
subgraph "Corte de Control (2000-PROCESO)"
Loop -- No --> Title[Grabar Títulos]
Title --> DeptLoop{Mismo Depto?}
DeptLoop -- Sí --> SexLoop{Mismo Sexo?}
SexLoop -- Sí --> Detail[Grabar Detalle]
Detail --> NextRead[2100-LEER-CURSOR]
NextRead --> SexLoop
SexLoop -- No --> SubSex[Grabar Subtotal Sexo]
SubSex --> DeptLoop
DeptLoop -- No --> SubDept[Grabar Subtotal Depto]
SubDept --> Loop
end
Loop -- Sí --> Final[3000-FINAL]
subgraph "Cierre Ordenado"
Final --> CloseAll[Cerrar SALIDA y Cursor]
CloseAll --> Stop((GOBACK))
end
%% Flujo de Errores
OpenFile -. Error .-> ErrRoutine
OpenCursor -. Error .-> ErrRoutine
NextRead -. Error .-> ErrRoutine
Detail -. Error .-> ErrRoutine
subgraph "Manejo de Excepciones"
ErrRoutine[2300-INVOCAR-RUTINA-ERROR] --> CallErr[CALL PGMERROR]
CallErr --> SetFin[SET PGM-FIN TO TRUE]
SetFin --> Final
end
%% Asignación de estilos
class Start,Stop inicio_fin;
class ErrRoutine,CallErr error;
class OpenCursor,NextRead,FirstRead db2;
CAPTURA DE SALIDA: REPORTE FINAL GENERADO EN ARCHIVO FÍSICO
| EMULADOR WX3270 | VSCODE + ZOWE | INTERFAZ WEB Z/OSMF |
![]() |
![]() |
![]() |
CAPTURA DE SALIDA: REGISTRO DE ERROR EN SYSOUT (RUTINA 2300)
| CAPTURA DE SALIDA: Reporte de Error SQL | |
|---|---|
| EMULADOR WX3270 | VSCODE + ZOWE |
![]() |
![]() |
| CAPTURA DE SALIDA: Reporte File Status | |
| EMULADOR WX3270 | VSCODE + ZOWE |
![]() |
![]() |






