BlogCOBOLPL/1

EXEC CICS – Lectura secuencial de un fichero

La sentencia EXEC CICS de IBM es fundamental en el entorno CICS para la manipulación eficiente de archivos. Entre ellas, las sentencias START, READNEXT y ENDBR son vitales para la lectura secuencial de archivos. START posiciona el cursor, READNEXT recupera registros y ENDBR marca el final. En este artículo, exploraremos cómo estos parámetros facilitan la lectura secuencial de archivos en aplicaciones empresariales.

EXEC CICS STARTBR

La sentencia STARTBR en IBM CICS Transaction Server (TS) especifica el punto de inicio para la búsqueda en un archivo o tabla de datos. Esta búsqueda puede ser directa, utilizando claves primarias o secundarias, o por dirección de byte relativa. Las opciones definidas en STARTBR permanecen durante toda la operación de búsqueda.

Es importante tener en cuenta que si se especifica una clave precisa y esta es eliminada antes de ejecutar un comando READNEXT o READPREV, el registro devuelto puede no coincidir con la clave inicialmente especificada. La búsqueda puede finalizar con comandos como ENDBR, SYNCPOINT o SYNCPOINT ROLLBACK, o al finalizar la tarea.

Diagrama STARTBR

Ejemplo de sentencia STARTBR

A continuación se muestra un ejemplo de sentencia EXEC CICS STARTBR, con la definición del fichero, DATASET, el área de dates que se envía, RIDFLD, y la respuesta de la llamado con, RESP.

EXEC CICS STARTBR DATASET(filename)
                  RIDLFD (data-area)
                  RESP   (respuesta de la llamada) 

EXEC CICS READNEXT

La sentencia READNEXT en IBM CICS Transaction Server (TS) se utiliza para recuperar el siguiente registro disponible después de la posición actual del cursor en un archivo o tabla de datos durante una operación de lectura secuencial.

Esta sentencia es fundamental para avanzar a través de los registros en un archivo de manera secuencial, facilitando así la recuperación de datos en aplicaciones mainframe. Al ejecutar la sentencia READNEXT, el cursor avanza al siguiente registro y devuelve los datos asociados, lo que permite a los programadores acceder de manera efectiva a la información necesaria para el procesamiento de datos dentro del entorno CICS.

Sentencia READNEXT de IBM
Diagrama READNEXT

Ejemplo de sentencia READNEXT

A continuación se muestra el ejemplo de una sentencia READNEXT.

EXEC CICS READNEXT DATASET (filename)
                   INTO    (data-area)
                   RIDFILD (data-area)
                   RESP    (respuesta de la llamada)

EXEC CICS ENDBR

La sentencia ENDBR en IBM CICS Transaction Server (TS) se utiliza para finalizar una operación de navegación en un archivo o tabla de datos que se ha iniciado previamente con la sentencia STARTBR.

Esta sentencia es crucial para asegurar una terminación adecuada y ordenada de la búsqueda de registros, liberando recursos y completando la operación de manera controlada. Al utilizar la sentencia ENDBR, los programadores pueden garantizar que la navegación a través de los registros en el archivo se detenga correctamente una vez que se hayan recuperado todos los datos necesarios, evitando así problemas de recursos y asegurando la integridad de la operación dentro del entorno CICS.

Diagrama ENDBR

Ejemplo de sentencia ENDBR

A continuación se muestra un ejemplo de como cerrar un BROWSE de una lectura secuencial de un fichero en CICS.

EXEC CICS ENDBR DATASET (filename)
                RESP    (respuesta de la llamada)

Programa de ejemplo PL/1 con las sentencias EXEC CICS

El siguiente programa es un ejemplo de como se podrían usar estas sentencias para hacer una lectura secuencial, con las sentencias EXEC CICS.

/* Declaración de variables */
DCL FILENAME CHAR(100) INIT('nombre_del_archivo'); /* Nombre del archivo */
DCL RESP PIC 9(4) BIN; /* Variable para el código de respuesta */
DCL DATA_AREA CHAR(100); /* Área de datos para almacenar los registros */

/* Iniciar la lectura secuencial */
EXEC CICS STARTBR DATASET(FILENAME)
                  RIDFLD(DATA_AREA)
                  RESP(RESP);
             
/* Verificar si ocurrió algún error al iniciar la lectura */
IF RESP NOT = DFHRESP(NORMAL) THEN DO;
    PUT SKIP LIST('Error al iniciar la lectura secuencial:', RESP);
    RETURN;
END;

/* Leer registros hasta el final del archivo */
DO FOREVER;
    /* Leer el siguiente registro */
    EXEC CICS READNEXT DATASET(FILENAME)
                       INTO(DATA_AREA)
                       RIDFLD(DATA_AREA)
                       RESP(RESP);
                 
    /* Verificar si ocurrió algún error durante la lectura */
    IF RESP = DFHRESP(ENDFILE) THEN LEAVE; /* Si se llega al final del archivo, salir del bucle */
    ELSE IF RESP NOT = DFHRESP(NORMAL) THEN DO;
        PUT SKIP LIST('Error al leer el siguiente registro:', RESP);
        EXEC CICS ENDBR DATASET(FILENAME)
                        RESP(RESP); /* Finalizar la lectura */
        RETURN;
    END;
    
    /* Procesar el registro */
    PUT SKIP LIST('Registro leído:', DATA_AREA);
END;

/* Finalizar la lectura */
EXEC CICS ENDBR DATASET(FILENAME)
                RESP(RESP);

/* Verificar si ocurrió algún error al finalizar la lectura */
IF RESP NOT = DFHRESP(NORMAL) THEN DO;
    PUT SKIP LIST('Error al finalizar la lectura secuencial:', RESP);
    RETURN;
END;

Este programa PL/1 utiliza las llamadas CICS STARTBR, READNEXT y ENDBR para realizar una lectura secuencial de un archivo. Además, incluye un control de error para cada llamada, verificando el código de respuesta y manejando los casos de error apropiadamente.

Programa de ejemplo COBOL con las sentencias EXEC CICS

Aquí se muestra un ejemplo de cómo se podría usar esas llamadas CICS en un programa COBOL para realizar una lectura secuencial de un archivo, con manejo de errores para cada llamada.

IDENTIFICATION DIVISION.
PROGRAM-ID. LECTURA-SECUENCIAL.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 FILENAME           PIC X(100) VALUE 'nombre_del_archivo'.
01 RESP               PIC S9(4) COMP.
01 DATA-AREA          PIC X(100).

PROCEDURE DIVISION.
    /* Iniciar la lectura secuencial */
    EXEC CICS STARTBR DATASET(FILENAME)
                      RIDFLD(DATA-AREA)
                      RESP(RESP)
    END-EXEC.

    /* Verificar si ocurrió algún error al iniciar la lectura */
    IF RESP NOT = DFHRESP(NORMAL)
        DISPLAY 'Error al iniciar la lectura secuencial:' RESP
        GOBACK
    END-IF.

    /* Leer registros hasta el final del archivo */
    PERFORM UNTIL RESP = DFHRESP(ENDFILE)
        /* Leer el siguiente registro */
        EXEC CICS READNEXT DATASET(FILENAME)
                           INTO(DATA-AREA)
                           RIDFLD(DATA-AREA)
                           RESP(RESP)
        END-EXEC.

        /* Verificar si ocurrió algún error durante la lectura */
        IF RESP NOT = DFHRESP(NORMAL)
            DISPLAY 'Error al leer el siguiente registro:' RESP
            EXEC CICS ENDBR DATASET(FILENAME)
                            RESP(RESP) /* Finalizar la lectura */
            GOBACK
        END-IF.

        /* Procesar el registro */
        DISPLAY 'Registro leído:' DATA-AREA
    END-PERFORM.

    /* Finalizar la lectura */
    EXEC CICS ENDBR DATASET(FILENAME)
                    RESP(RESP)
    END-EXEC.

    /* Verificar si ocurrió algún error al finalizar la lectura */
    IF RESP NOT = DFHRESP(NORMAL)
        DISPLAY 'Error al finalizar la lectura secuencial:' RESP
        GOBACK
    END-IF.

GOBACK.

Este programa COBOL utiliza las llamadas CICS STARTBR, READNEXT y ENDBR para realizar una lectura secuencial de un archivo. Además, incluye un control de error para cada llamada, verificando el código de respuesta y manejando los casos de error apropiadamente.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *