viernes, 1 de abril de 2016

Jcl: Generar un fichero para exportar a EXCEL

En ocasiones tenemos que generar por jcl un fichero para exportar posteriormente a Excel.

Podemos hacer dos cosas:

1º) Generar el fichero sin cabecera
2º) Generar el fichero con cabecera

Optar por el primer punto es lo más fácil porque sólo tendríamos que preparar un programa que generase un fichero de salida cuya copy o estructura sería algo como lo siguiente:

     01 W-REG-SALIDA.
          05 W-CAMPO1         PIC X(10).
          05 W-FILLER1          PIC X(01) VALUE ';'.
          05 W-CAMPO2         PIC X(10).
          05 W-FILLER2          PIC X(01) VALUE ';'.
           :
           :
          05 W-CAMPO9         PIC X(10).
          05 W-FILLER9          PIC X(01) VALUE ';'.

Cuando se ejecutase el programa en cuestión tendríamos un fichero del tipo:

     CAMPO1;CAMPO2;.....;CAMPO9;

De manera que podríamos descargar dicho fichero como un txt, y pasarlo a Excel de una vez que lo tuviéramos descargado en el equipo como txt.

Aunque optar por la segunda opción no significa mayor dificultad ni complejidad  pero sí habría que tener en cuenta alguna cosa. Veamos este caso en profundidad.

En este caso también tenemos que tener un programa que genere un fichero de salida con una estructura similar a la que acabamos de ver para la primera opción. Pero en este caso tenemos que tener en cuenta la longitud del fichero, y ¿por qué? Muy fácil, la respuesta está en relación al fichero que generemos con la cabecera. Es decir, tras ejecutar el programa que genere el fichero de salida con la estructura antes vista (contiene los datos separados por puntos y coma) se ejecutará el siguiente paso:

//PASOCAB     EXEC PGM=SORT
//SORTIN    DD *
//SORTOUT DD DSN=<<FICHERO-CABECERA>>,
//                DISP=(,CATLG,DELETE)
//                SPACE=(TKK,(10,1),RLSE),
//                DCB=(RECFM=FB,LRECL=621,BLKSIZE=27945)
//SYSOUT   DD SYSOUT=*
//SYSIN      DD *
   SORT FIELDS=COPY
   OUTREC FIELDS=(C'NOMB-COL1;',C'NOMB-COL2;',...C'NOMB-COLN;')



En el paso de SORT que acabamos de ver se genera un fichero con la cabecera que posteriormente tendrá la Excel. Cabe destacar lo siguiente: en el OUTREC FIELDS tenemos que, para incluir una nueva cabecera para encabezar una determinada columna, se debe poner

             C'NOMBRE-CABECERA;'

Y aquí viene lo importante: te tienes que fijar con qué longitud se genera este fichero. La longitud con la que se genere este fichero te la tienes que apuntar. Si has leído con atención, el fichero de salida generado en el programa ejecutado con anterioridad al paso antes mostrado debe tener la misma longitud que el fichero de cabecera generado en el paso de SORT que acabamos de ver.

Llegados a este punto tenemos dos ficheros:

  • Fichero de datos: generado por programa en el que tenemos la información requerida separada por puntos y comas, teniendo algo como lo siguiente CAMPO1;CAMPO2;.....;CAMPO9;
  • Fichero de cabecera: generado mediante un paso de SORT (ver el paso de SORT incluido), teniendo algo como lo siguiente CAB1;...;CAB9;

Lo último que tenemos que hacer es unir ambos ficheros en uno solo mediante un paso de SORT como el siguiente:


//PASOFEX     EXEC PGM=SORT
//SORTIN    DD DSN=<<FICHERO-CABECERA>>,DISP=SHR
//                 DD DSN=<<FICHERO-DATOS>>,DISP=SHR
//SORTOUT DD DSN=<<FICHERO-EXPORTAR-EXCEL>>,
//                 DISP=(,CATLG,DELETE)
//                 SPACE=(TKK,(10,1),RLSE),
//                 DCB=(RECFM=FB,LRECL=621,BLKSIZE=27945)
//SYSOUT   DD SYSOUT=*
//SYSIN      DD *
   SORT FIELDS=COPY

El resultado es un fichero en el que la primera línea es la cabecera (CAB1;...;CAB9;) y el resto de filas son los datos (CAMPO1;...;CAMPO9;). En este punto podríamos descargar el fichero resultante como un txt, y pasarlo a Excel de una vez que lo tuviéramos descargado en el equipo como txt.

En lugar de separar cada uno de los campos con el símbolo ; también existe otra variante que consiste en separar los campos mediante tabuladores. Para realizar esto tendríamos que definir el símbolo tabulador (X'05') de manera que en el programa cobol que generase el correspondiente fichero de datos tendríamos que tener una estructura como la siguiente:

     01 W-REG-SALIDA.
          05 W-CAMPO1         PIC X(10).
          05 W-FILLER1          PIC X(01) VALUE X'05'.
          05 W-CAMPO2         PIC X(10).
          05 W-FILLER2          PIC X(01) VALUE X'05'.
           :
           :
          05 W-CAMPO9         PIC X(10).

          05 W-FILLER9          PIC X(01) VALUE X'05'.

Esto ha sido todo por hoy. Espero que os haya resultado de utilidad.