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):
  • Ejemplo Práctico 3.2 (WORKING-STORAGE):
  • Ejemplo Práctico 3.3 (LINKAGE SECTION):

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.