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!
2 comentarios:
definitivamente hay errores
estoy tratando de identificarlos para ponerlos...
ME SIRVIO Y ENCANTO SU PAGINA