JCL: trucos básicos de ordenación
A continuación se ilustran los requisitos de las aplicaciones diarias en un mundo empresarial que se pueden lograr mediante los programas de utilidades:
1. A file has 100 records. The first 10 records need to be written to output file.
//JSTEP020 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//IN1 DD DSN=MYDATA.URMI.STOPAFT,DISP=SHR
//OUT1 DD SYSOUT=*
//TOOLIN DD *
COPY FROM(IN1) TO(OUT1) USING(CTL1)
/*
//CTL1CNTL DD *
OPTION STOPAFT=10
/*
La opción STOPAFT dejará de leer el archivo de entrada después del décimo registro y terminará el programa. Por lo tanto, se escriben 10 registros en la salida.
2. Input file has one or more records for same employee number. Write unique records to output.
//STEP010 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=MYDATA.URMI.DUPIN,DISP=SHR
//SORTOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=(1,15,ZD,A)
SUM FIELDS=NONE
/*
SUM FIELDS = NONE elimina los duplicados en los campos especificados en SORT FIELDS. En el ejemplo anterior, el número de empleado está en el campo posición 1,15. El archivo de salida contendrá los números de empleados únicos ordenados en orden ascendente.
3. Overwrite input record content.
//JSTEP010 EXEC PGM=SORT
//SORTIN DD DSN= MYDATA.URMI.SAMPLE.MAIN,DISP=SHR
//SORTOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD *
OPTION COPY
INREC OVERLAY=(47:1,6)
/*
En el archivo de entrada, el contenido de la posición 1,6 se sobrescribe en la posición 47,6 y luego se copia en el archivo de salida. La operación INREC OVERLAY se utiliza para reescribir datos en el archivo de entrada antes de copiarlos a la salida.
4. Adding a sequence number to the output file.
//JSTEP010 EXEC PGM=SORT
//SORTIN DD *
data1
data2
data3
/*
//SORTOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD *
OPTION COPY
BUILD=(1:1,5,10:SEQNUM,4,ZD,START=1000,INCR=2)
/*
La salida será:
data1 1000
data2 1002
data3 1004
El número de secuencia de 4 dígitos se agrega en la salida en la posición 10, comenzando en 1000 y se incrementa en 2 para cada registro.
5. Adding Header/Trailer to output file.
//JSTEP010 EXEC PGM=SORT
//SORTIN DD *
data1
data2
data3
/*
//SORTOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
OUTFIL REMOVECC,
HEADER1=(1:C'HDR',10:X'020110131C'),
TRAILER1=(1:C'TRL',TOT=(10,9,PD,TO=PD,LENGTH=9))
/*
La salida será:
HDR 20110131
data1
data2
data3
TRL 000000003
TOT calcula el número de registros en el archivo de entrada. HDR y TRL se agregan como identificadores al encabezado / avance, que es definido por el usuario y se puede personalizar según las necesidades de los usuarios.
6. Conditional Processing
//JSTEP010 EXEC PGM=SORT
//SORTIN DD *
data1select
data2
data3select
/*
//SORTOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD *
INREC IFTHEN=(WHEN=(6,1,CH,NE,C' '),BUILD=(1:1,15),
IFTHEN=(WHEN=(6,1,CH,EQ,C' '),BUILD=(1:1,5,7:C'EMPTY ')
OPTION COPY
/*
La salida será:
data1select
data2 EMPTY
data3select
Según la sexta posición del archivo, la CONSTRUCCIÓN del archivo de salida varía. Si la sexta posición es ESPACIOS, entonces se agrega el texto "VACÍO" al registro de entrada. De lo contrario, el registro de entrada se escribe en la salida, tal cual.
7. Backing up a file
//JSTEP001 EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
//SYSOUT DD SYSOUT=*
//SORTOUT DD DUMMY
//SYSUT1 DD DSN=MYDATA.URMI.ORIG,DISP=SHR
//SYSUT2 DD DSN=MYDATA.URMI.BACKUP,DISP=(NEW,CATLG,DELETE),
// DCB=*.SYSUT1,SPACE=(CYL,(50,1),RLSE)
IEBGENER copia el archivo en SYSUT1 al archivo en SYSUT2. Tenga en cuenta que el archivo en SYSUT2 toma el mismo DCB que el de SYSUT1 en el ejemplo anterior.
8. File Comparison
//STEP010 EXEC PGM=SORT
//MAIN DD *
1000
1001
1003
1005
//LOOKUP DD *
1000
1002
1003
//MATCH DD DSN=MYDATA.URMI.SAMPLE.MATCH,DISP=OLD
//NOMATCH1 DD DSN=MYDATA.URMI.SAMPLE.NOMATCH1,DISP=OLD
//NOMATCH2 DD DSN=MYDATA.URMI.SAMPLE.NOMATCH2,DISP=OLD
//SYSOUT DD SYSOUT=*
//SYSIN DD *
JOINKEYS F1=MAIN,FIELDS=(1,4,A)
JOINKEYS F2=LOOKUP,FIELDS=(1,4,A)
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(?,F1:1,4,F2:1,4)
OPTION COPY
OUTFIL FNAMES=MATCH,INCLUDE=(1,1,CH,EQ,C'B'),BUILD=(1:2,4)
OUTFIL FNAMES=NOMATCH1,INCLUDE=(1,1,CH,EQ,C'1'),BUILD=(1:2,4)
OUTFIL FNAMES=NOMATCH2,INCLUDE=(1,1,CH,EQ,C'2'),BUILD=(1:2,4)
/*
JOINKEYS especifica el campo en el que se comparan los dos archivos.
CAMPOS DE REFORMA =? coloca 'B' (registros coincidentes), '1' (presente en el archivo1, pero no en el archivo2) o '2' (presente en el archivo2 pero no en el archivo1) en la primera posición de la salida BUILD.
JOIN UNPAIRED realiza una combinación externa completa en los dos archivos.
La salida será:
MATCH File
1000
1003
NOMATCH1 File
1001
1005
NOMATCH2 File
1002
La misma funcionalidad se puede lograr utilizando ICETOOL también.