COBOL Mainframe: Dominando las Divisiones y Secciones – Una Guía Práctica para Estudiantes
- Estructura Fundamental de un Programa COBOL: Un programa COBOL tiene una jerarquía que hay que conocer y dominar. Esta guía nos muestra toda esta jerarquía de forma resumida.
- La jerarquía: Programa -> Divisiones -> Secciones -> Párrafos -> Sentencias.
Capítulo 1: La IDENTIFICATION DIVISION – La Identidad del Programa
- Propósito: Identificar el programa y proporcionar metadatos.
- Estructura:
- IDENTIFICATION DIVISION. (Cabecera obligatoria)
- Párrafos Principales:
- PROGRAM-ID. (Obligatorio): Nombre del programa. Reglas de nomenclatura.
- AUTHOR. (Opcional, Obsoleto pero común): Nombre del programador.
- INSTALLATION. (Opcional): Lugar donde se instala/usa.
- DATE-WRITTEN. (Opcional): Fecha de creación.
- DATE-COMPILED. (Opcional): El compilador inserta la fecha aquí (a menudo se deja como comentario).
- SECURITY. (Opcional): Nivel de seguridad o clasificación.
- Buenas Prácticas: Mantener PROGRAM-ID significativo. Uso de comentarios para información adicional.
- Ejemplo Práctico 1.1:
COBOL
IDENTIFICATION DIVISION.
PROGRAM-ID. PROGLECTURA.
AUTHOR. Alumno Estudioso.
INSTALLATION. Universidad Ejemplo.
DATE-WRITTEN. 04/05/2025.
* DATE-COMPILED. (Se llenará automáticamente)
SECURITY. Uso Académico.
Capítulo 2: La ENVIRONMENT DIVISION – Conectando con el Exterior
- Propósito: Definir el entorno de hardware y los archivos externos que usará el programa. Es la división más dependiente del sistema operativo (mainframe Z/OS en este caso).
- Estructura:
- ENVIRONMENT DIVISION. (Cabecera obligatoria)
- Secciones Principales:
- CONFIGURATION SECTION.
- SOURCE-COMPUTER. (Describe la máquina donde se compila).
- OBJECT-COMPUTER. (Describe la máquina donde se ejecuta).
- SPECIAL-NAMES. (Asigna nombres a características específicas, como el símbolo de moneda, punto decimal, nombres de impresora, etc.).
- INPUT-OUTPUT SECTION. (Crucial para el manejo de archivos)
- FILE-CONTROL. (El corazón de la E/S)
- SELECT nombre-logico-archivo: Asocia un nombre interno del programa…
- ASSIGN TO nombre-externo: …con el nombre externo (DD Name en JCL para mainframe).
- ORGANIZATION IS {SEQUENTIAL | INDEXED | RELATIVE}: Define el tipo de archivo (VSAM, QSAM).
- ACCESS MODE IS {SEQUENTIAL | RANDOM | DYNAMIC}: Cómo se accederá al archivo.
- RECORD KEY IS nombre-campo (Para INDEXED/RELATIVE): Clave principal.
- ALTERNATE RECORD KEY IS nombre-campo WITH DUPLICATES (Para INDEXED): Claves secundarias.
- FILE STATUS IS nombre-variable-status: Variable para verificar el resultado de operaciones de E/S (¡Fundamental!).
- I-O-CONTROL. (Menos común, para optimizaciones como SAME RECORD AREA).
- Buenas Prácticas: Usar FILE STATUS siempre. Nombres lógicos claros. Entender la conexión ASSIGN TO con JCL DD.
- Ejemplo Práctico 2.1 (Archivo Secuencial):
COBOL
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-MAINFRAME.
OBJECT-COMPUTER. IBM-MAINFRAME.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA. *> Para usar coma decimal en España
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FICHERO-ENTRADA ASSIGN TO DDENTRADA
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS FS-ENTRADA.
SELECT FICHERO-SALIDA ASSIGN TO DDSALIDA
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS FS-SALIDA.
- Ejemplo Práctico 2.2 (Archivo Indexado VSAM KSDS):
COBOL
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
* … (Igual que antes)
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CLIENTES-MAESTRO ASSIGN TO DDCLIENT
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC *> Permite lectura secuencial y aleatoria
RECORD KEY IS CL-CODIGO-CLIENTE
ALTERNATE RECORD KEY IS CL-NIF WITH DUPLICATES
FILE STATUS IS FS-CLIENTES.
* … (Otros SELECT si los hubiera)
Capítulo 3: La DATA DIVISION – Definiendo los Datos
- Propósito: Describir toda la información que el programa manipulará: datos de archivos, variables temporales, constantes, estructuras de datos.
- Estructura:
- DATA DIVISION. (Cabecera obligatoria)
- Secciones Principales:
- FILE SECTION.
- Define la estructura detallada (campos, tipos, longitudes) de los registros de cada archivo declarado en FILE-CONTROL.
- FD nombre-logico-archivo: Entrada de descripción de archivo (File Description).
- Cláusulas: RECORD CONTAINS integer CHARACTERS, BLOCK CONTAINS integer RECORDS (optimización), LABEL RECORDS ARE {STANDARD | OMITTED}, DATA RECORD IS nombre-registro-01.
- Descripciones de Registro (Niveles 01, 02-49):
- 01 nombre-registro. (Nivel más alto, representa el registro completo).
- 05 nombre-campo PIC X(10). (Niveles inferiores para campos individuales).
- PIC (Picture Clause): ¡Fundamental! Define el tipo y tamaño (X=Alfanumérico, 9=Numérico, S=Signo, V=Decimal implícito, Z=Supresión de ceros, ., ,).
- VALUE: Para inicializar campos (¡ojo! No suele usarse en FD, sí en WORKING-STORAGE).
- USAGE: Cómo se almacena internamente (DISPLAY=Texto, COMP=Binario, COMP-3=Empaquetado Decimal – muy común en mainframe).
- OCCURS: Para definir tablas/arrays.
- REDEFINES: Para dar diferentes estructuras a la misma área de memoria.
- WORKING-STORAGE SECTION.
- Define variables, contadores, indicadores (flags), constantes, áreas de trabajo temporal que no forman parte de los archivos de entrada/salida.
- Se usan los mismos niveles (01, 02-49) y cláusulas (PIC, VALUE, USAGE, OCCURS, REDEFINES).
- Nivel 77: Para ítems elementales independientes (menos usado en programación moderna estructurada, preferible agrupar bajo un 01).
- Nivel 88: Nombres de Condición (muy útiles para legibilidad).
- LINKAGE SECTION.
- Define la estructura de los datos que se reciben de otro programa (cuando este programa es llamado) o que se pasan a un subprograma llamado. Crucial para la programación modular (CALL…USING).
- Buenas Prácticas: Usar nombres descriptivos. Indentar correctamente para mostrar jerarquía. Elegir el USAGE adecuado (COMP-3 para cálculos, DISPLAY para E/S). Inicializar variables en WORKING-STORAGE con VALUE o INITIALIZE. Usar niveles 88.
- Ejemplo Práctico 3.1 (FD y Registro Simple):
DATA DIVISION.
FILE SECTION.
FD FICHERO-ENTRADA
RECORD CONTAINS 80 CHARACTERS
LABEL RECORDS ARE STANDARD
DATA RECORD IS REG-ENTRADA.
01 REG-ENTRADA.
05 RE-TIPO-REG PIC X(01).
05 RE-CODIGO-PROD PIC 9(05).
05 RE-DESCRIPCION PIC X(30).
05 RE-PRECIO PIC 9(05)V99. *> 5 enteros, 2 decimales
05 FILLER PIC X(37). *> Relleno hasta 80
FD FICHERO-SALIDA
RECORD CONTAINS 50 CHARACTERS
LABEL RECORDS ARE STANDARD
DATA RECORD IS REG-SALIDA.
01 REG-SALIDA PIC X(50). *> Registro opaco para salida simple
- Ejemplo Práctico 3.2 (WORKING-STORAGE):
WORKING-STORAGE SECTION.
01 WS-VARIABLES-TRABAJO.
05 WS-CONTADOR-REGS PIC 9(07) VALUE ZERO.
05 WS-ACUM-TOTALES PIC S9(09)V99 COMP-3 VALUE ZERO. *> Numérico con signo, empaquetado
05 WS-FIN-FICHERO PIC X(01) VALUE 'N'.
88 FIN-FICHERO VALUE 'S'. *> Nombre de condición
05 WS-INDICE-TABLA PIC 9(03) VALUE 1.
05 WS-MENSAJE-ERROR PIC X(50) VALUE SPACES.
01 WS-CONSTANTES.
05 WS-PORC-IVA PIC 9V99 VALUE 0.21.
77 WS-VARIABLE-SUELTA PIC 99 VALUE 0. *> Ejemplo nivel 77 (menos recomendado)
01 WS-TABLA-MESES.
05 WS-MES OCCURS 12 TIMES INDEXED BY INDX-MES.
10 WS-NOMBRE-MES PIC X(10).
10 WS-DIAS-MES PIC 99.
- Ejemplo Práctico 3.3 (LINKAGE SECTION):
LINKAGE SECTION.
01 LK-PARAMETROS-ENTRADA.
05 LK-CODIGO-BUSQUEDA PIC 9(08).
05 LK-FECHA-PROCESO PIC 9(08). *> Formato AAAAMMDD
01 LK-RESULTADO-SALIDA.
05 LK-ESTADO-OP PIC X(02).
05 LK-MENSAJE-OP PIC X(80).
Capítulo 4: La PROCEDURE DIVISION – La Lógica del Programa
- Propósito: Contiene las instrucciones ejecutables, la lógica de negocio, los algoritmos. Es donde el programa «hace cosas».
- Estructura:
- PROCEDURE DIVISION. (Cabecera obligatoria)
- PROCEDURE DIVISION USING nombre-item-linkage … (Si recibe datos, ver LINKAGE SECTION).
- Organización:
- Párrafos: Etiquetas seguidas de un punto (1000-INICIO.). El flujo puede saltar entre ellos (usando PERFORM).
- Secciones: nombre-seccion SECTION. Contienen párrafos. Permiten agrupar lógica relacionada y son la base de la programación estructurada (PERFORM nombre-seccion).
Ejemplo Práctico 4.1 (Esqueleto Programa Secuencial):
COBOL
PROCEDURE DIVISION.
0000-MAIN-LOGIC SECTION.
PERFORM 1000-INICIALIZAR.
PERFORM 2000-PROCESO-PRINCIPAL UNTIL FIN-FICHERO.
PERFORM 3000-FINALIZAR.
STOP RUN.
1000-INICIALIZAR SECTION.
OPEN INPUT FICHERO-ENTRADA.
IF FS-ENTRADA NOT = «00»
DISPLAY «ERROR ABRIENDO FICHERO ENTRADA: » FS-ENTRADA
MOVE ‘S’ TO WS-FIN-FICHERO *> Forzar fin si hay error
ELSE
OPEN OUTPUT FICHERO-SALIDA
IF FS-SALIDA NOT = «00»
DISPLAY «ERROR ABRIENDO FICHERO SALIDA: » FS-SALIDA
MOVE ‘S’ TO WS-FIN-FICHERO
CLOSE FICHERO-ENTRADA *> Cerrar el que sí abrió
ELSE
PERFORM 2100-LEER-ENTRADA *> Lectura inicial
END-IF
END-IF.
EXIT. *> Sale de la sección 1000
2000-PROCESO-PRINCIPAL SECTION.
IF RE-TIPO-REG = ‘D’ *> Ejemplo: procesar solo registros tipo ‘D’
PERFORM 2200-PROCESAR-REGISTRO
END-IF.
PERFORM 2100-LEER-ENTRADA.
EXIT.
2100-LEER-ENTRADA SECTION.
READ FICHERO-ENTRADA
AT END MOVE ‘S’ TO WS-FIN-FICHERO
NOT AT END ADD 1 TO WS-CONTADOR-REGS
END-READ.
IF FS-ENTRADA NOT = «00» AND FS-ENTRADA NOT = «10» *> «10» es fin de fichero
DISPLAY «ERROR LEYENDO FICHERO ENTRADA: » FS-ENTRADA
MOVE ‘S’ TO WS-FIN-FICHERO *> Forzar fin
END-IF.
EXIT.
2200-PROCESAR-REGISTRO SECTION.
* … Lógica para procesar REG-ENTRADA …
* Mover datos a REG-SALIDA, hacer cálculos, etc.
MOVE REG-ENTRADA TO REG-SALIDA. *> Ejemplo simple
WRITE REG-SALIDA.
IF FS-SALIDA NOT = «00»
DISPLAY «ERROR ESCRIBIENDO FICHERO SALIDA: » FS-SALIDA
MOVE ‘S’ TO WS-FIN-FICHERO *> Forzar fin
END-IF.
EXIT.
3000-FINALIZAR SECTION.
CLOSE FICHERO-ENTRADA FICHERO-SALIDA.
DISPLAY «PROCESO FINALIZADO. REGISTROS LEIDOS: » WS-CONTADOR-REGS.