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.