JCL - Grundlegende Sortier-Tricks
Die täglichen Anwendungsanforderungen in einer Unternehmenswelt, die mit Hilfsprogrammen erreicht werden können, sind nachstehend dargestellt:
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
/*
Die Option STOPAFT beendet das Lesen der Eingabedatei nach dem 10. Datensatz und beendet das Programm. Daher werden 10 Datensätze zur Ausgabe geschrieben.
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 entfernt Duplikate in Feldern, die in SORT FIELDS angegeben sind. Im obigen Beispiel befindet sich die Mitarbeiternummer in der Feldposition 1,15. Die Ausgabedatei enthält die eindeutigen Mitarbeiternummern, die in aufsteigender Reihenfolge sortiert sind.
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)
/*
In der Eingabedatei wird der Inhalt an Position 1,6 an Position 47,6 überschrieben und dann in die Ausgabedatei kopiert. Die INREC OVERLAY-Operation wird verwendet, um Daten in der Eingabedatei vor dem Kopieren in die Ausgabe neu zu schreiben.
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)
/*
Die Ausgabe wird sein:
data1 1000
data2 1002
data3 1004
Die 4-stellige Sequenznummer wird in der Ausgabe an Position 10 hinzugefügt, beginnend bei 1000 und für jeden Datensatz um 2 erhöht.
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))
/*
Die Ausgabe wird sein:
HDR 20110131
data1
data2
data3
TRL 000000003
TOT berechnet die Anzahl der Datensätze in der Eingabedatei. HDR und TRL werden als Bezeichner zu Header / Trailer hinzugefügt, der benutzerdefiniert ist und an die Bedürfnisse der Benutzer angepasst werden kann.
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
/*
Die Ausgabe wird sein:
data1select
data2 EMPTY
data3select
Basierend auf der 6. Position der Datei variiert das BUILD der Ausgabedatei. Wenn die 6. Position SPACES ist, wird der Text "EMPTY" an den Eingabedatensatz angehängt. Andernfalls wird der Eingabedatensatz unverändert in die Ausgabe geschrieben.
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 kopiert die Datei in SYSUT1 in die Datei in SYSUT2. Bitte beachten Sie, dass die Datei in SYSUT2 dieselbe DCB wie die von SYSUT1 im obigen Beispiel verwendet.
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 gibt das Feld an, in dem die beiden Dateien verglichen werden.
REFORMAT FIELDS =? Platziert 'B' (übereinstimmende Datensätze), '1' (vorhanden in Datei1, aber nicht in Datei2) oder '2' (vorhanden in Datei2, aber nicht in Datei1) an der 1. Position des Ausgabe-BUILD.
JOIN UNPAIRED führt einen vollständigen Outer Join für die beiden Dateien durch.
Die Ausgabe wird sein:
MATCH File
1000
1003
NOMATCH1 File
1001
1005
NOMATCH2 File
1002
Die gleiche Funktionalität kann auch mit ICETOOL erreicht werden.