Учебники

JCL — основные приемы сортировки

Ежедневные требования к приложениям в корпоративном мире, которые могут быть достигнуты с помощью служебных программ, показаны ниже:

1. Файл имеет 100 записей. Первые 10 записей должны быть записаны в выходной файл.

//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. Входной файл содержит одну или несколько записей для одного и того же номера сотрудника. Написать уникальные записи для вывода.

//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. Перезаписать содержимое входной записи.

//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. Добавление порядкового номера в выходной файл.

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

Четырехзначный порядковый номер добавляется в вывод в позиции 10, начиная с 1000 и увеличивается на 2 для каждой записи.

5. Добавление заголовка / трейлера к выходному файлу.

//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. Условная обработка

//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-ой позиции файла строение выходного файла варьируется. Если 6-я позиция — ПРОСТРАНСТВА, тогда текст «ПУСТО» добавляется к входной записи. В противном случае входная запись записывается на выход как есть.

7. Резервное копирование файла

//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 принимает тот же DCB, что и файл SYSUT1 в приведенном выше примере.

8. Сравнение файлов

//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 указывает поле, в котором сравниваются два файла.

  • РЕФОРМАТИЧЕСКИЕ ПОЛЯ =? помещает ‘B’ (сопоставленные записи), ‘1’ (присутствует в файле1, но не в файле2) или ‘2’ (присутствует в файле2, но не в файле1) в 1-ю позицию выходного BUILD.

  • JOIN UNPAIRED выполняет полное внешнее соединение двух файлов.

JOINKEYS указывает поле, в котором сравниваются два файла.

РЕФОРМАТИЧЕСКИЕ ПОЛЯ =? помещает ‘B’ (сопоставленные записи), ‘1’ (присутствует в файле1, но не в файле2) или ‘2’ (присутствует в файле2, но не в файле1) в 1-ю позицию выходного BUILD.

JOIN UNPAIRED выполняет полное внешнее соединение двух файлов.

Выход будет:

MATCH File
1000
1003

NOMATCH1 File
1001
1005

NOMATCH2 File
1002

Та же функциональность может быть достигнута и с помощью ICETOOL.