Desarrollando en Cobol y Natural sobre Plataforma Mainframe

viernes, 14 de agosto de 2015

ICETOOL: Como copiar ficheros en JCL (1)

Entre las muchas funciones de que dispone, la utilidad ICETOOL nos da la posibilidad de hacer copias de ficheros secuenciales en la operativa con JCL. Aunque existen otros servicios que realizan estas mismas operaciones, el rendimiento de ICETOOL es muy superior al de todos ellos.

Copiar Ficheros Secuenciales con ICETOOL


La utilidad ICETOOL nos permite aprovecharnos de las capacidades de la herramienta ICEMAN (DFSORT) para realizar copias de ficheros secuenciales de la manera más optimizada posible. Por tanto, aunque realiza la misma actividad que otros servicios tales como IEBGENER o ICEGENER, la ejecución será más eficiente.

A pesar de que la codificación con ICETOOL de ICEMAN es ligeramente diferente a la clásica (aquí os dejo un enlace a la Guía de Usuario ICETOOL de IBM), la realidad es que no es difícil acostumbrarse a ella. Yo llevo tiempo usándola para copias de ficheros con volúmenes de millones de registros y la verdad es que se agradece la mejora del rendimiento al realizar dicha operación.


Para ver cómo habría que implementar la copia de un fichero secuencial, vamos a usar como base un ejemplo real que estuvimos empleando en su día en uno de nuestros clientes. En primer lugar, muestro el código del paso JCL construido para tal fin.

//*        ****************************************************
//*        * EJECUCION ICETOOL                                *
//*        * COPIA FICHEROS IN1 / IN2 A FICHEROS OUT1 / OUT2  *
//*        ****************************************************
//JJ4605   EXEC PGM=ICETOOL                                          //TOOLMSG  DD  SYSOUT=*                                              //DFSMSG   DD  SYSOUT=*                                              //*        FICHEROS DE ENTRADA                   
//IN1      DD  DSN=&INDICE2..JJTV10K1.X0007X.DDD.F&FECHA..COMP3,     //             DISP=SHR                                             
//IN2      DD  DSN=&INDICE1..UNLOAD.X0005X.&DIA..&TABLA.,            //             DISP=SHR                                              //*        FICHEROS DE SALIDA REFORMATEADOS
//OUT1     DD  DSN=&INDICE1..JJ4605S1.X0060X.DDD.F&FECHA..&TAB..T1,
//             DISP=(NEW,CATLG,DELETE),
//             SPACE=(CYL,(00100,00100),RLSE),             //             UNIT=DISCO                                            //OUT2     DD  DSN=&INDICE1..JJ4605S2.X0060X.DDD.F&FECHA..&TAB..T2,

//             DISP=(NEW,CATLG,DELETE),              
//             SPACE=(CYL,(00100,00100),RLSE),                     //             UNIT=DISCO                                           //TOOLIN   DD  DSN=&INDICE..SYSIN(FITOOL),                        //             DISP=SHR                                            //CTL1CNTL DD  DSN=&INDICE..SYSIN(FICTL1),                        //             DISP=SHR                                             //CTL2CNTL DD  DSN=&INDICE..SYSIN(FICTL2),                        //             DISP=SHR                                             //JJ4605A  EXEC PGM=ABEN3333,                                       //             COND=(4,GE,JJ4605)                                   //CTRNORST DD  DUMMY                                                //*

A continuación, muestro el código de las tres fichas asociadas al paso JCL anterior. La primera de ellas es la ficha TOOLIN y las otras dos son fichas de CONTROL.

*-----------------------------------------------------------------*
* <<< FICHA TOOLIN FITOOL >>>     

* COPIA FICHERO KEYS REFORMATEADO AL FICHERO OUT1 
* COPIA FICHERO MASTER REFORMATEADO AL FICHERO OUT2     
*-----------------------------------------------------------------*
  COPY FROM(IN1)     TO(OUT1)    USING(CTL1)  

  COPY FROM(IN2)     TO(OUT2)    USING(CTL2)

*-------------------------------------------------------             
* <<< FICHA CONTROL FICTL1 >>>                      

* SE INDICA COMO SE DEBE REFORMATEAR EL FICHERO IN1              *-------------------------------------------------------             
  SORT FIELDS=(1,4,PD,A,5,2,PD,A)                                   

  OUTREC FIELDS=(1,21,193X,215:C'D',9,6)                            

*-----------------------------------------------------------------*
* <<< FICHA CONTROL FICTL2 >>>

* SE INDICA COMO SE DEBE REFORMATEAR EL FICHERO IN2          *-----------------------------------------------------------------*
  INREC FIELDS=(1,6,1,208)                                          

  SORT FIELDS=(1,4,PD,A,5,2,PD,A)                                   
  OUTREC FIELDS=(1,214,215:C' ',6X)

Detalle de Fichas del operador COPY de ICETOOL


Una vez mostrado el código estándar de un paso JCL que utiliza ICETOOL para copiar ficheros secuenciales, vamos a ver con un poco más de detalle en qué consisten cada una de las fichas requeridas por este proceso.


1º) Invocación a ICETOOL: La primera ficha es simplemente la invocación a la herramienta ICETOOL mediante el comando estándar EXEC PGM.

//JJ4605   EXEC PGM=ICETOOL

2º) Fichas IN1 e IN2: Se trata de las fichas en las que vamos a declarar el nombre de los ficheros de entrada que van a ser empleados por la utilidad. En nuestro ejemplo, hablamos de los ficheros &INDICE2..JJTV10K1.X0007X.DDD.F&FECHA..COMP3 y &INDICE1..UNLOAD.X0005X.&DIA..&TABLA.

//*        FICHEROS DE ENTRADA                   
//IN1      DD  DSN=&INDICE2..JJTV10K1.X0007X.DDD.F&FECHA..COMP3,     //             DISP=SHR                                             
//IN2      DD  DSN=&INDICE1..UNLOAD.X0005X.&DIA..&TABLA.,            //             DISP=SHR

3º) Fichas OUT1 y OUT2: En este caso, hablamos de las fichas empleadas para indicar los nombres de los ficheros de salida de la utilidad. En el ejemplo, son los ficheros &INDICE1..JJ4605S1.X0060X.DDD.F&FECHA..&TAB..T1 y &INDICE1..JJ4605S2.X0060X.DDD.F&FECHA..&TAB..T2.

//*        FICHEROS DE SALIDA REFORMATEADOS
//OUT1     DD  DSN=&INDICE1..JJ4605S1.X0060X.DDD.F&FECHA..&TAB..T1,
//             DISP=(NEW,CATLG,DELETE),
//             SPACE=(CYL,(00100,00100),RLSE),             //             UNIT=DISCO                                            //OUT2     DD  DSN=&INDICE1..JJ4605S2.X0060X.DDD.F&FECHA..&TAB..T2,

//             DISP=(NEW,CATLG,DELETE),              
//             SPACE=(CYL,(00100,00100),RLSE),                     //             UNIT=DISCO  

Tal y como se puede apreciar, al tratarse de ficheros nuevos, en la declaración estamos definiendo la estructura con la que tienen que crearse ambos datasets. En este caso, se darán de alta con memoria principal y memoria secundaria de 100 cilindros.


4º) Ficha TOOLIN: Llegamos a la ficha en la que tenemos que indicar cuál es el operador que tiene que ejecutar la utilidad ICETOOL (en particular, aquí se apunta al objeto FITOOL). Como queremos realizar una copia de ficheros secuenciales, tendremos que incluir el comando COPY (uno para cada fichero a copiar).

* <<< FICHA TOOLIN FITOOL >>>    
  COPY FROM(IN1)     TO(OUT1)    USING(CTL1)  
  COPY FROM(IN2)     TO(OUT2)    USING(CTL2)
 
El próximo día, en la segunda parte, continuaremos viendo cuáles son las fichas necesarias para que nuestro JCL ejecute una copia de ficheros mediante ICETOOL. Entre ambos post ya nos debería quedar una idea bastante clara de cómo hay que implementar el proceso.

Pues nada, eso es todo por hoy. Creo que no hace falta que insista: estáis invitados a la segunda parte del artículo. Espero veros por aquí para completar la revisión del COPY ICETOOL.

Saludos.

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...