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.