JCL-기본 정렬 트릭

유틸리티 프로그램을 사용하여 달성 할 수있는 기업 세계의 일상적인 응용 프로그램 요구 사항은 다음과 같습니다.

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               
/*

STOPAFT 옵션은 10 번째 레코드 이후 입력 파일 읽기를 중지하고 프로그램을 종료합니다. 따라서 10 개의 레코드가 출력에 기록됩니다.

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은 SORT FIELDS에 지정된 필드의 중복을 제거합니다. 위의 예에서 직원 번호는 필드 위치 1,15에 있습니다. 출력 파일에는 오름차순으로 정렬 된 고유 한 직원 번호가 포함됩니다.

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)                      
/*

입력 파일에서 위치 1,6의 내용은 위치 47,6으로 덮어 쓴 다음 출력 파일에 복사됩니다. INREC OVERLAY 연산은 출력으로 복사하기 전에 입력 파일의 데이터를 다시 쓰기 위해 사용됩니다.

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)                      
/*

출력은 다음과 같습니다.

data1    1000
data2    1002
data3    1004

1000에서 시작하여 모든 레코드에 대해 2 씩 증가하는 위치 10의 출력에 4 자리 시퀀스 번호가 추가됩니다.

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)) 
/*

출력은 다음과 같습니다.

HDR       20110131
data1    
data2    
data3 
TRL       000000003

TOT는 입력 파일의 레코드 수를 계산합니다. HDR 및 TRL은 헤더 / 트레일러에 식별자로 추가되며 사용자가 정의하고 사용자의 필요에 따라 사용자 지정할 수 있습니다.

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                                                     
/*

출력은 다음과 같습니다.

data1select   
data2 EMPTY  
data3select

파일의 6 번째 위치에 따라 출력 파일의 BUILD가 달라집니다. 6 번째 위치가 공백이면 "EMPTY"텍스트가 입력 레코드에 추가됩니다. 그렇지 않으면 입력 레코드가있는 그대로 출력에 기록됩니다.

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는 SYSUT1의 파일을 SYSUT2의 파일로 복사합니다. SYSUT2의 파일은 위 예제의 SYSUT1과 동일한 DCB를 사용합니다.

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는 두 파일이 비교되는 필드를 지정합니다.

  • REFORMAT FIELDS =? 출력 BUILD의 첫 번째 위치에 'B'(일치하는 레코드), '1'(file1에는 있지만 file2에는 없음) 또는 '2'(file2에는 있지만 file1에는 없음)를 배치합니다.

  • JOIN UNPAIRED는 두 파일에 대해 완전한 외부 결합을 수행합니다.

출력은 다음과 같습니다.

MATCH File
1000
1003

NOMATCH1 File
1001
1005

NOMATCH2 File
1002

ICETOOL을 사용하여 동일한 기능을 얻을 수도 있습니다.