miércoles, 28 de enero de 2015

Ejemplo 8: ficheros VSAM.

En este ejemplo veremos el uso de los ficheros VSAM.
Un fichero VSAM es un fichero de tipo indexado, que tiene definido un índice, y sobre el que se pueden realizar accesos por índice.

Vamos a crear un programa que dé de alta registros, borre registros y actualice registros de un fichero VSAM.
Para ello usaremos el siguiente ejemplo:
Tenemos como entrada 2 versiones del fichero oficina (será un GDG), por un lado la versión actual (0), y por otro la versión anterior (-1). En estos ficheros tendremos la información de las oficinas de un banco con formato:
COPY COFICINA:
01 CSAM-COFICINA.
   05 CSAM-CLAVE.
      10 CSAM-COD-CODENT         PIC 9(4).
      10 CSAM-COD-CODOFI         PIC 9(4).
   05 CSAM-DES-NOMBRE            PIC X(20).
   05 CSAM-COD-CODPOS            PIC 9(5).
   05 CSAM-COD-TELEF1            PIC 9(9).
   05 CSAM-FEC-APERTU            PIC X(10).

La versión (0) será la que tenga los datos más actuales (del día). La versión (-1) será la del día anterior.
Los datos de las oficinas se guardan en un fichero VSAM con clave código de entidad (CSAM-COD-CODENT) y código de oficina (CSAM-COD-CODOFI).
Vamos a comparar las dos versiones para:
1. Si una oficina existe en el fichero de hoy y en la versión del día anterior, actualizamos esa clave en el fichero VSAM.
2. Si una oficina existe en el fichero de hoy pero no en el de ayer, la damos de alta en el fichero VSAM.
3. Si una oficina existe en el fichero de ayer pero no en el de hoy, la damos de baja del fichero VSAM.

JCL:

//** *****************************************************
//** ** ACTUALIZAMOS FICHERO DE OFICINAS VSAM ** **
//** ***************************************************
//PGMVSAM EXEC PGM=PGMVSAM
//ENTRADA1 DD DSN=NOMBRE.FICHERO.OFICINA(0),DISP=SHR
//ENTRADA2 DD DSN=NOMBRE.FICHERO.OFICINA(-1),DISP=SHR
//SALIDA   DD DSN=FICHERO.SALIDA.VSAM,DISP=SHR
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=4,DEST=JESTC3
//SYSDBOUT DD SYSOUT=4,DEST=JESTC3
//CEEDUMP  DD SYSOUT=4,DEST=JESTC3
/*



PROGRAMA:

 IDENTIFICATION DIVISION.
 PROGRAM-ID. PGMVSAM.
 AUTHOR. CONSULTORIO COBOL. 

*============================================*
* PROGRAMA DE MANTENIMIENTO DE FICHERO VSAM  *
*============================================*
*
*

 ENVIRONMENT DIVISION.
*
 CONFIGURATION SECTION.
 SPECIAL-NAMES.
    DECIMAL-POINT IS COMMA.
*
 INPUT-OUTPUT SECTION.
 FILE-CONTROL.
     SELECT
ENTRADA0 ASSIGN TO ENTRADA0
     FILE STATUS IS FS-ENTRADA0.
 

     SELECT ENTRADA1 ASSIGN TO ENTRADA1 
     FILE STATUS IS FS-ENTRADA1.

     SELECT
SALIDA ASSIGN TO SALIDA
     ORGANIZATION IS INDEXED
     ACCESS MODE IS RANDOM
     RECORD KEY IS CLAVE-OFICVSM
     FILE STATUS IS FS-SALIDA.
*
 DATA DIVISION.
*
 FILE SECTION.
*
**** FICHEROS DE ENTRADA ****
*
**--> OFICINAS VERSION 0 (FICHERO SECUENCIAL)
 FD
ENTRADA0
     LABEL RECORD STANDARD
     RECORDING MODE IS F
     BLOCK CONTAINS 0 RECORDS.
 01 REG-ENTRADA0             PIC X(52).
*
*--> OFICINAS VERSION -1 (FICHERO SECUENCIAL)
 FD
ENTRADA1
     LABEL RECORD STANDARD
     RECORDING MODE IS F
     BLOCK CONTAINS 0 RECORDS.
 01 REG-ENTRADA1             PIC X(52).

**** FICHERO DE ENTRADA - SALIDA ****
*
*--> OFICINAS (FICHERO VSAM)
 FD SALIDA.
 01 REG-VSAM.
     03 CLAVE-OFICVSM          PIC X(08).
     03 RESTO-OFICVSM          PIC X(44).
*
*
**********************************************
*
 WORKING-STORAGE SECTION.
*
*--------------------------------------------
*--- AREA DE COPYS ---*
*---------------------------------------------
*
*--------------- COPY FICHERO OFICINAS ------------
 COPY COFICINA REPLACING CSAM-COFICINA BY ==ENT-V0==.
*
 COPY COFICINA REPLACING CSAM-COFICINA BY ==ENT-V1==.
*
*--------------------------------------------------
* AREA DE SWITCHES
*-------------------------------------------------
*--> Final fichero OFICINAS VERSION 0
 01 WB-FIN-ENTRADA0            PIC X(1) VALUE 'N'.
     88 FIN-ENTRADA0                    VALUE 'S'.

*--> Final fichero OFICINAS VERSION 1
 01 WB-FIN-ENTRADA1            PIC X(1) VALUE 'N'.
     88 FIN-ENTRADA1                    VALUE 'S'.
*
*------------------------------------------------
* CODIGOS DE ESTADO DE FICHEROS
*-------------------------------------------------
* FILE STATUS
 01 FS-STATUS.
    05 FS-ENTRADA0               PIC X(2).
       88 FS-ENTRADA0-OK                 VALUE '00'.
       88 FS-ENTRADA0-EOF                VALUE '10'.
    05 FS-ENTRADA1               PIC X(2).
       88 FS-ENTRADA1-OK                 VALUE '00'.
       88 FS-ENTRADA1-EOF                VALUE '10'.

    05 FS-SALIDA                 PIC X(2).
       88 FS-SALIDA-OK                   VALUE '00'.


*----------------------------------------------------
* REGISTROS LEIDOS - GRABADOS - BORRADOS - MODIFICADOS
*----------------------------------------------------
 01 WC-PROCESADOS.
    03 REG-LEIDOS-EN0          PIC 9(09) VALUE ZEROS.
    03 REG-LEIDOS-EN1          PIC 9(09) VALUE ZEROS.
    03 REG-GRABADOS-VSAM       PIC 9(09) VALUE ZEROS.
    03 REG-BORRADOS-VSAM       PIC 9(09) VALUE ZEROS.
    03 REG-MODIF-VSAM          PIC 9(09) VALUE ZEROS.
*
 PROCEDURE DIVISION.
*
************************************************************
* | 0000 - PRINCIPAL
*--|------------------+----------><----------+-------------* 

* 1| EJECUTA EL INICIO DEL PROGRAMA 
* 2| EJECUTA EL PROCESO DEL PROGRAMA 
* 3| EJECUTA EL FINAL DEL PROGRAMA ************************************************************ 
* 00000-PRINCIPAL. 

      PERFORM 1000-INICIO 
      PERFORM 2000-PROCESO 
        UNTIL FIN-ENTRADA0 AND FIN-ENTRADA1
      PERFORM 3000-FINAL 


*----------- 
 1000-INICIO. 
*----------- 
      PERFORM 1100-ABRIR-FICHEROS 

*--> LEEMOS PRIMERA OFICINA 
      PERFORM LEER-ENTRADA0
      PERFORM LEER-ENTRADA1


*--------------- 
 2000-PROCESO. 
*--------------- 

      EVALUATE TRUE 
         WHEN CSAM-CLAVE OF ENT-V0  
              EQUAL CSAM-CLAVE OF ENT-V1

              IF ENT-V0 NOT EQUAL ENT-V1
*---------> ACTUALIZAR CLAVE EN FICHERO VSAM
                 MOVE ENT-V0 TO REG-VSAM

                 PERFORM 2100-MODIFICAR-VSAM 
              END-IF 

              PERFORM LEER-ENTRADA0
              PERFORM LEER-ENTRADA1
         WHEN CSAM-CLAVE OF ENT-V0 GREATER THAN 
              CSAM-CLAVE OF ENT-V1
*---------> DAR DE BAJA CLAVE DE V1 EN FICHERO VSAM 
              MOVE CSAM-CLAVE OF ENT-V1 
                TO CLAVE-OFICVSM 

              PERFORM 2200-BAJA-VSAM 
              PERFORM LEER-ENTRADA1
         WHEN CSAM-CLAVE OF ENT-V0 LESS THAN 
              CSAM-CLAVE OF ENT-V1
*---------> DAR DE ALTA LA CLAVE DE V0 EN FICHERO VSAM 
              MOVE ENT-V0 TO REG-VSAM

              PERFORM 2300-ALTA-VSAM 
              PERFORM LEER-ENTRADA0
      END-EVALUATE 
      . 

*----------- 
 3000-FINAL. 
*----------- 
      PERFORM CERRAR-FICHEROS 

      PERFORM ESTADISTICAS 

      STOP RUN 
      . 

*-----------------------  
 1100-ABRIR-FICHEROS. 
*----------------------- 
      OPEN INPUT ENTRADA0
                 ENTRADA1
             I-O SALIDA 

      IF NOT FS-ENTRADA0-OK 
         DISPLAY 'ERROR EN ABRIR-ENTRADA1' 
         DISPLAY 'FILE-STATUS = 'FS-ENTRADA0
      END-IF 

      IF NOT FS-ENTRADA1-OK 
         DISPLAY 'ERROR EN ABRIR-ENTRADA2' 
         DISPLAY 'FILE-STATUS = 'FS-ENTRADA1
      END-IF 

      IF NOT FS-SALIDA-OK 
         DISPLAY 'ERROR EN ABRIR-FVSAM' 
         DISPLAY 'FILE-STATUS = ' FS-SALIDA
      END-IF 
      . 

*---------------------- 
 LEER-ENTRADA0. 
*---------------------- 
      READ ENTRADA0 INTO ENT-V0

      EVALUATE TRUE 
         WHEN FS-ENTRADA0-OK 
              ADD 1 TO REG-LEIDOS-EN0
         WHEN FS-ENTRADA0-EOF 
              SET FIN-ENTRADA0 TO TRUE 
         WHEN OTHER 
              DISPLAY 'ERROR EN LEER-ENTRADA0' 
              DISPLAY 'FILE-STATUS = ' FS-ENTRADA0
              PERFORM ESTADISTICAS 
      END-EVALUATE 
     

*------------------------ 
 CERRAR-FICHEROS. 
*------------------------ 
      CLOSE ENTRADA0
            ENTRADA1
            SALIDA 

      IF NOT FS-ENTRADA0-OK 
         DISPLAY 'ERROR EN CERRAR-ENTRADA0' 
         DISPLAY 'FILE-STATUS = ' FS-ENTRADA0
         PERFORM ESTADISTICAS 
      END-IF 

      IF NOT FS-ENTRADA1-OK 
         DISPLAY 'ERROR EN CERRAR-ENTRADA1' 
         DISPLAY 'FILE-STATUS = 'FS-ENTRADA1
         PERFORM ESTADISTICAS 
      END-IF 

      IF NOT FS-SALIDA-OK 
         DISPLAY 'ERROR EN CERRAR-FVSAM' 
         DISPLAY 'FILE-STATUS = ' FS-SALIDA
         PERFORM ESTADISTICAS 
      END-IF 
      . 

*---------------------- 
 LEER-ENTRADA1. 
*---------------------- 
      READ ENTRADA1 INTO REG-ENTRADA1 

      EVALUATE TRUE 
         WHEN FS-ENTRADA1-OK 
              ADD 1 TO REG-LEIDOS-EN1
         WHEN FS-ENTRADA1-EOF 
              SET FIN-ENTRADA1 TO TRUE 
         WHEN OTHER 
              DISPLAY 'ERROR EN LEER-ENTRADA1' 
              DISPLAY 'FILE-STATUS = ' FS-ENTRADA1
              PERFORM ESTADISTICAS 
      END-EVALUATE 
      . 

*------------------ 
 2100-MODIFICAR-VSAM. 
*------------------ 
      REWRITE REG-VSAM 
      INVALID KEY 
         DISPLAY 'ERROR EN MODIFICAR-VSAM' 
         DISPLAY 'FILE-STATUS = ' FS-SALIDA
         PERFORM ESTADISTICAS 
         ADD 1 TO REG-MODIF-VSAM
      . 
*------------- 
 2200-BAJA-VSAM. 
*------------- 
      DELETE REG-VSAM
      INVALID KEY 
         DISPLAY 'ERROR EN BAJA-VSAM' 
         DISPLAY 'FILE-STATUS = ' FS-SALIDA
         PERFORM ESTADISTICAS 
         
      ADD 1 TO REG-BORRADOS-VSAM
      . 
*------------- 
 2300-ALTA-VSAM. 
*------------- 
      WRITE REG-VSAM  
      INVALID KEY 
         DISPLAY 'ERROR EN ALTA-VSAM' 
         DISPLAY 'FILE-STATUS = ' FS-SALIDA
         PERFORM ESTADISTICAS 
      
      ADD 1 TO REG-GRABADOS-VSAM
      . 

*-------------------------------------------- 
* ESTADISTICAS 
*------------------------------------------- 
 ESTADISTICAS. 
*------------- 
      DISPLAY '******************************************' 
      DISPLAY '* E S T A D I S T I C A S *' 
      DISPLAY '******************************************' 
      DISPLAY ' PROGRAMA PGMVSAM' 
      DISPLAY '******************************************' 
      DISPLAY 'REG. LEIDOS OFI V0 ........ ' REG-LEIDOS-EN0
      DISPLAY 'REG. LEIDOS OFI V-1 ....... ' REG-LEIDOS-EN1
      DISPLAY 'REG. GRABADOS OFI VSAM .... ' REG-GRABADOS-VSAM
      DISPLAY 'REG. BORRADOS OFI VSAM .... ' REG-BORRADOS-VSAM
      DISPLAY 'REG. MODIFIC EN OFI VSAM .. ' REG-MODIF-VSAM
      DISPLAY '******************************************'
      . 
********************************************* 

Este ejemplo os lo dejo sin probar, así que puede haber algún error en el código.
Cualquier duda la vemos!

No hay comentarios: