Mostrando entradas con la etiqueta ficheros. Mostrar todas las entradas
Mostrando entradas con la etiqueta ficheros. Mostrar todas las entradas

lunes, 12 de junio de 2017

Alocar ficheros dinámicamente con BPXWDYN

Hoy os traigo un ejemplo de cómo generar dinámicamente ficheros de salida a través de un programa cobol.
El BPXWDYN es una rutina del sistema, capaz de alocar/liberar/concatenar ficheros en una ejecución batch.

En este ejemplo, el programa lee de un fichero de entrada con N registros, y genera N ficheros de salida.
Para la nomenclatura, hemos utilizado un contador en uno de los delimitadores.

La utilidad? Imagina que tienes un fichero de entrada con 1 millón de registros, y tienes que generar un fichero de salida por cada uno de ellos (osea, 1 millón de ficheros). Vas a picarte el nombre de los ficheros a mano en el JCL? Además de que puede que no sepas el número exacto de registros que va a tener ese fichero, pues varíe cada día.
En fin, por si algún día os veis en la situación, aquí lo tenéis :-)

JCL:
//PASO01 EXEC PGM=PRUEBDYN
//ENTRADA   DD DSN=FICHERO.DE.ENTRADA,DISP=SHR
//SYSOUT   DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*

donde EXEC PGM= indica el programa SIN DB2 que vamos a ejecutar
SYSOUT DD SYSOUT=* indica que la información "displayada" se quedará en la cola del SYSOUT (no lo vamos a guardar en un fichero)
Para definir el fichero de entrada "ENTRADA" indicaremos que es un fichero ya existente y compartida al indicar DISP=SHR.

Fichero de entrada:
----+----1----+
REGISTRO1
REGISTRO2
REGISTRO3
REGISTRO4



PROGRAMA:

 IDENTIFICATION DIVISION.
 PROGRAM-ID. PRUEBDYN.
*==========================================================*
*     PROGRAMA QUE LEE DE FICHERO Y GENERA DINAMICAMENTE

*     VARIOS FICHEROS DE SALIDA
*==========================================================*

 ENVIRONMENT DIVISION.
*
 CONFIGURATION SECTION.
*
 SPECIAL-NAMES.
     DECIMAL-POINT IS COMMA.


 INPUT-OUTPUT SECTION.
*
 FILE-CONTROL.
 

*ENTRADA
 SELECT ENTRADA
 ASSIGN TO ENTRADA
 FILE STATUS IS FS-ENTRADA.
*SALIDA
 SELECT OTFILE ASSIGN TO OTFILE
 FILE STATUS FS.
*
 DATA DIVISION.
*
 FILE SECTION.
 

*ENTRADA
 FD ENTRADA
 LABEL RECORD STANDARD
 BLOCK CONTAINS 0 RECORDS
 RECORDING MODE IS F.
 01 REG-ENTRADA PIC X(80).

*SALIDA
 FD OTFILE.
 01 OT-REC PIC X(80).

*******************************************************

 WORKING-STORAGE SECTION.
 01 FS PIC X(02).
 01 FN PIC X(20).
 01 WS-ALLOC-STRING PIC X(100).
 01 PGM PIC X(08) VALUE 'BPXWDYN'.

 01 WS-VARIABLES.
    05 SW-FIN-ENTRADA PIC X(01) VALUE 'N'.
       88 FIN-ENTRADA VALUE 'S'.
       88 NO-FIN-ENTRADA VALUE 'N'.
    05 FS-ENTRADA PIC X(02).
    05 WS-ENTRADA PIC X(80).
    05 WS-NOMBRE-SALIDA.
       10 WS-PARTE-FIJA PIC X(13) VALUE
                                  'PARTE.COMUN.F'.
       10 WS-VARIABLE PIC 9(7).
    05 WS-LIBERAR PIC X(15) VALUE 'FREE FI(OTFILE)'.
******************************************************
 PROCEDURE DIVISION.
******************************************************

     PERFORM 100000-INICIO
     PERFORM 200000-PROCESO
       UNTIL FIN-ENTRADA
     PERFORM 300000-FIN

     .

*TRATO FICHERO DE ENTRADA
 100000-INICIO.
     OPEN INPUT ENTRADA

     IF FS-ENTRADA NOT EQUAL '00'
        DISPLAY 'ERROR AL LEER'
        PERFORM 300000-FIN
     END-IF

     PERFORM 110000-LEER
     .
*LEER FICHERO
 110000-LEER.
     READ ENTRADA INTO WS-ENTRADA

     EVALUATE FS-ENTRADA
         WHEN CTA-FS-CORRECTO

*Añadimos 1 a WS-VARIABLE para generar los diferentes
*nombres del fichero de salida
              ADD 1 TO WS-VARIABLE
          WHEN CTA-FS-FIN-FICHERO
              SET FIN-ENTRADA TO TRUE
          WHEN OTHER
              DISPLAY 'ERROR AL LEER'
              PERFORM 300000-FIN
    END-EVALUATE
    .

********************************************************

* PROCESO DEL PROGRAMA
* 1-MONTAMOS EL NOMBRE DEL FICHERO DE SALIDA
* 2-LLAMAMOS A BPXWDYN PARA ALOCAR
* 3-ESCRIBIMOS EN EL FICHERO DE SALIDA Y LO CERRAMOS
* 4-LLAMAMOS A BPXWDYN PARA LIBERAR EL FICHERO DE SALIDA
********************************************************
 200000-PROCESO.

    MOVE WS-NOMBRE-SALIDA TO FN

    STRING 'ALLOC DD(OTFILE) DSN(' FN ') NEW '
             'CATALOG ' 'LRECL(80) RECFM(FB)'
    DELIMITED BY SIZE
    INTO WS-ALLOC-STRING

*LLAMO AL PROGRAMA RARO
    CALL PGM USING WS-ALLOC-STRING

    DISPLAY 'SALIDA PGM:' RETURN-CODE
*ABRO FICHERO SALIDA
    OPEN OUTPUT OTFILE

    IF FS NOT EQUAL '00'
       DISPLAY 'ERROR AL ABRIR SALIDA:' FS
    END-IF

*ESCRIBO EN EL FICHERO
    MOVE WS-ENTRADA TO OT-REC

    WRITE OT-REC

    IF FS NOT EQUAL '00'
       DISPLAY 'ERROR AL ESCRIBIR SALIDA:' FS
    END-IF

*CIERRO EL FICHERO DE SALIDA
    CLOSE OTFILE

    IF FS NOT EQUAL '00'
       DISPLAY 'ERROR AL CERRAR SALIDA:' FS
    END-IF

    CALL PGM USING WS-LIBERAR

    PERFORM 110000-LEER
    .
*FIN
 300000-FIN.
    CLOSE ENTRADA

    IF FS-ENTRADA NOT EQUAL '00'
       DISPLAY 'ERROR AL CERRAR'
    END-IF

    STOP RUN

    .

La primera vez que llamamos al programa BPXWDYN, lo hacemos con la opción "alocar", ALLOC.
Le indicamos el nombre del fichero, lo que iría en la DSN, con una variable "FN" que contiene el nombre PARTE.COMUN.F0000001.
Además le indicamos las opciones que irían en el DISP: NEW, CATALOG. La longitud LRECL(80) y que es un fichero de longitud fija RECFM(FB).
Estas opciones podemos modificarlas en función de nuestras necesidades.

La segunda vez que llamamos al programa BPXWDYN es necesaria para que OTFILE coja el siguiente nombre que le asignemos. Si no lo hiciésemos, el primer nombre (PARTE.COMUN.F0000001) se quedaría alocado y no se generaría ningún otro.

El resultado son 4 ficheros de salida:
PARTE.COMUN.F0000001 --> contiene REGISTRO1
PARTE.COMUN.F0000002 --> contiene REGISTRO2
PARTE.COMUN.F0000003 --> contiene REGISTRO3
PARTE.COMUN.F0000004 --> contiene REGISTRO4

lunes, 28 de noviembre de 2016

¿Tipos de Archivos Secuenciales? Bah!

¡¡Hola coboleros!! Ya vimos en un artículo anterior la diferencia entre los archivos secuenciales y VSAM, pero en este artículo nos ocuparemos de distinguir los distintos tipos de organización de estos archivos secuenciales.
Primero debemos de indicar qué entendemos por “organización del archivo”. Esto indica como los registros se organizan en un archivo, y cuya finalidad es aumentar su eficiencia de acceso a los registros.

Se muestra a continuación los tipos de “organización” que existen:

  • Organización del archivo secuencial
  • Organización del archivo secuencial indexado
  • Organización de archivo relativa

Empezando…. Organización del Archivo Secuencial…


Un archivo secuencial consta de registros almacenados en el archivo y cuyo acceso a ellos es meramente secuencial. Esto quiere decir que el primero que entra es el último en salir y que no se puede acceder a un registro que está en medio del archivo, si no se recorre esa primera mitad del archivo.
Muchas de las características que se requieren saber sobre los archivos secuenciales se mencionaron en el artículo Ficheros Secuenciales vs Ficheros VSAM ¿Cuál es el mejor?”, sin embargo vamos a rememorar algunas de las principales características que se tienen de los archivos secuenciales.

·         Se pueden leer los archivos en orden secuencial, esto quiere decir que si tienes un registro en medio del archivo, tienes que leer los archivos anteriores a este para que puedas leer el registro que te interesa.
·        Los registros se escriben en orden secuencial, el último registro en ser insertado, es el primer registro en ser leído.
·        Después de insertar un registro en un archivo secuencial, no es posible eliminar, reducir o alargar un registro.
·        Orden de los registros, una vez insertados, no se puede cambiar.
·        Actualización de registro es posible. El registro se puede sobrescribir, si la nueva longitud de registro es el mismo que el de longitud de registro.


Dentro del programa siempre se podrá especificar la sintaxis de la organización del archivo secuencial:
       FILE-CONTROL                                           
       SELECT ENTRADA ASSIGN TO ENTRADA                
                       ORGANIZATION IS SEQUENTIAL       
                       ACCESS MODE  IS SEQUENTIAL       
                       FILE STATUS IS WS-FS-ENTRADA.
  

Donde

ASSIGN TO: Asigna el archivo de entrada “ENTRADA” al nombre de la tarjeta del sistema también llamado “ENTRADA”
ORGANIZATION: Se especifica que su organización es secuencial
ACCESS MODE: Tipo de acceso, el cual se especifica que es secuencial
FILE STATUS: El estatus del archivo el cual deberá de comenzar con 00.

Mientras que en el JCL nosotros podemos encontrarlo como se muestra en el ejemplo de a continuación:

//ENTRADA  DD  DSN=MOVDELL.R08.I1OUP10.SORTINYU,
//             DISP=(OLD,KEEP,KEEP)                

ENTRADA: Archivo que se va a mandar a llamar para entrada del proceso.


Organización del archivo secuencial indexado


Un archivo secuencial indexado consiste de registros que pueden tener acceso a los datos de forma secuencial. Consta de dos partes:

  • Archivo de Datos contiene registros en orden secuencial.
  • Archivo de índice contiene la clave principal y su dirección en el archivo de datos.

Por Archivo de datos nos referimos a los registros escritos en orden secuencial, del tamaño que requiera la información, y también de la estructura que requiera la información.

Por Archivo de Índice nos referimos a la clave principal que rige a cada uno de los registros, y su dirección pero de memoria dentro del archivo de datos. Esta dirección de memoria por lo general suele ser hexadecimal.

A continuación se muestran las ventajas y desventajas más importantes que tienen estos archivos:

Ventaja:

·         Es rápida si se cuenta con los datos llave con los que se quiere encontrar un dato.
·         Permite el acceso secuencial
·         Permite el acceso directo de los registros
·         Se pueden actualizar los registros en el mismo fichero sin necesidad de crear un fichero nuevo de copia en el proceso de actualización

Desventaja:

·         Requiere implementar índices que ocupan recursos como espacio en disco y algoritmos diversos para optimizar búsquedas (aunque de eso ya se ocupan los manejadores de bases de datos)
·         Ocupa más espacio en el disco que los ficheros secuenciales, debido al uso del área de índices
·         Tiene tendencia a que aumente el tiempo medio de acceso a los registros, cuando se producen muchas altas nuevas con claves que hay que intercalar entre las existentes.

Se mencionan algunas de las principales características que tienen este tipo de archivos:

·         El índice nos proporciona una capacidad de búsqueda para llegar rápidamente al registro deseado
·         El “archivo de datos”  es similar al archivo secuencial, pero está integrado de forma que los registros se ubiquen siguiendo un puntero o dirección de memoria desde su registro predecesor.
·         Cuando se añade un nuevo registro, al archivo principal que sigue al nuevo registro y  según la secuencia lógica, se actualiza con el puntero del registro nuevo en el archivo de datos.
·         El diseño del registro tiene que tener un campo o combinación de campos, que permita identificar cada registro de forma única. Este campo que hará esa distinción será campo clave, y es el que va a servir de índice.
·          Un mismo fichero puede tener más de un campo clave, pero al menos uno de ellos no admitirá valores duplicados y se les llama clave primaria.
·        Se pueden leer los registros en orden secuencial, como en organización de archivos secuenciales.
·        Los registros se pueden acceder aleatoriamente si la clave principal es conocida.
·        El archivo índice se utiliza para obtener la dirección de un registro (hexadecimal) y, a continuación, se obtiene el registro del archivo de datos, ya con la dirección de memoria.


Sintaxis

FILE-CONTROL.                                                 
    SELECT ARCH-VSAMDIR   ASSIGN TO VSAMDIR                   
                          ORGANIZATION IS INDEXED             
                          ACCESS IS DYNAMIC                   
                          RECORD KEY IS KEY-VSAMDIR           
                          FILE STATUS IS FS-VSAMDIR.          
Donde

ASSIGN TO: Se le asigna ARCH-VSAMDIR a VSAMDIR
ORGANIZACIÓN IS De tipo indexada
ACCESS IS El acceso es dinámico
RECORD KEY IS El archivo se está recorriendo por la llave KEY-VSAMDIR
FILE STATUS IS El estatus del archivo, al inicio el cual deberá de ser 00.

Espero que el articulo te haya gustado y te haya sido de utilidad. :-)