Si queremos montar un JCL que cruce ficheros mediante SORT, sin utilizar un programa adicional, tenemos varios opciones. Una de ellas es emplear el operador SPLICE del ICETOOL, disponible desde la actualización de DFSORT de 2003.
Veamos un ejemplo extraído del manual Smart DFSORT Tricks de IBM.
Tenemos dos ficheros con dos listas de nombres:
Fichero1
Vicky
Frank
Carrie
Holly
David
Fichero2
Karen
Holly
Carrie
Vicky
Mary
Y queremos crear ficheros de salida que contengan:
– Los nombres que aparecen en Fichero1 y Fichero2
– Los nombres que aparecen solo en Fichero1
– Los nombres que aparecen solo en Fichero2
Podemos hacerlo mediante el SPLICE, utilizando el truco de añadir el literal ‘11’ a los registros del primer fichero y el literal ‘22’ a los del segundo:
//S1 EXECPGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//IN1 DD DSN=… Fichero1
//IN2 DD DSN=… Fichero2
//T1 DD DSN=&&T1,UNIT=SYSDA,SPACE=(TRK,(5,5)),DISP=(MOD,PASS)
//OUT12 DD SYSOUT=*
//OUT1 DD SYSOUT=*
//OUT2 DD SYSOUT=*
//TOOLIN DD *
//* Copiamos Fichero1 a un fichero temporal
COPY FROM(IN1) TO(T1) USING(CTL1)
//* Copiamos Fichero2 a un fichero temporal
COPY FROM(IN2) TO(T1) USING(CTL2)
SPLICE FROM(T1) TO(OUT12) ON(1,10,CH) WITH(13,1) –
USING(CTL3) KEEPNODUPS
//CTL1CNTL DD *
//* Marcar los registros de Fichero1 con ‘11’
INREC OVERLAY=(12:C’11’)
//CTL2CNTL DD *
//* Marcar los registros de Fichero2 con ‘22’
INREC OVERLAY=(12:C’22’)
//CTL3CNTL DD *
//* Registros que están en los dos ficheros
OUTFIL FNAMES=OUT12,INCLUDE=(12,2,CH,EQ,C’12’),BUILD=(1,10)
//* Registros que solo estan en Fichero1
OUTFIL FNAMES=OUT1,INCLUDE=(12,2,CH,EQ,C’11’),BUILD=(1,10)
//* Registros que solo estan en Fichero2
OUTFIL FNAMES=OUT2,INCLUDE=(12,2,CH,EQ,C’22’),BUILD=(1,10)
El operador SPLICE ordena los registros del fichero temporal por los campos del ON. Al generar la salida, si hay duplicados se coloca en primer lugar el registro del primer fichero (registro base) y a continuación el que corresponde al segundo fichero (registro duplicado), que es igual al registro base salvo en las posiciones indicadas en el WITH, que se toman del segundo fichero.
Contenido de los ficheros de salida:
OUT12
Carrie
Holly
Vicky
OUT1
David
Frank
OUT2
Karen
Mary
De un archivo digamos principal, necesito encontrar de otro archivo todas las transacciones pertenecientes al primero y ademas colocando a las transacciones un dato que tiene el primero. ¿Alguien sabe como hacerlo?
Puedes hacerlo con la utilidad SPLICE, de la que trata este artículo, pero hay otra utilidad para cruzar ficheros llamada JOINKEYS, que es mucho más fácil de usar. Está explicada en otros dos artículos de este blog: Cruce de ficheros en un JCL II y III.