JCL - Trucchi di ordinamento di base
Di seguito sono illustrati i requisiti delle applicazioni quotidiane in un mondo aziendale che possono essere raggiunti utilizzando i programmi di utilità:
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
/*
L'opzione STOPAFT interromperà la lettura del file di input dopo il decimo record e terminerà il programma. Quindi, vengono scritti 10 record nell'output.
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 rimuove i duplicati sui campi specificati in SORT FIELDS. Nell'esempio precedente, il numero del dipendente è nella posizione del campo 1,15. Il file di output conterrà i numeri univoci dei dipendenti ordinati in ordine crescente.
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)
/*
Nel file di input, il contenuto nella posizione 1,6 viene sovrascritto nella posizione 47,6 e quindi copiato nel file di output. L'operazione INREC OVERLAY viene utilizzata per riscrivere i dati nel file di input prima di copiarli nell'output.
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)
/*
L'output sarà:
data1 1000
data2 1002
data3 1004
Il numero di sequenza a 4 cifre viene aggiunto nell'output alla posizione 10, a partire da 1000 e incrementato di 2 per ogni record.
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))
/*
L'output sarà:
HDR 20110131
data1
data2
data3
TRL 000000003
TOT calcola il numero di record nel file di input. HDR e TRL vengono aggiunti come identificatori all'intestazione / trailer, che è definito dall'utente e può essere personalizzato secondo le esigenze degli utenti.
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
/*
L'output sarà:
data1select
data2 EMPTY
data3select
In base alla 6a posizione del file, la COSTRUZIONE del file di output varia. Se la sesta posizione è SPACES, il testo "EMPTY" viene aggiunto al record di input. Altrimenti, il record di input viene scritto nell'output, così com'è.
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 il file in SYSUT1 nel file in SYSUT2. Si noti che il file in SYSUT2 accetta lo stesso DCB di quello di SYSUT1 nell'esempio precedente.
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 specifica il campo su cui vengono confrontati i due file.
CAMPI DI RIFORMATURA =? inserisce "B" (record corrispondenti), "1" (presente in file1, ma non in file2) o "2" (presente in file2 ma non in file1) nella prima posizione dell'output BUILD.
JOIN UNPAIRED esegue un outer join completo sui due file.
L'output sarà:
MATCH File
1000
1003
NOMATCH1 File
1001
1005
NOMATCH2 File
1002
La stessa funzionalità può essere ottenuta anche utilizzando ICETOOL.