Транспонирование записи JCL для мейнфреймов с использованием SORT

Я хочу сделать следующее перемещение записей в столбец с помощью SORT (snycsort или DFSORT). Он должен масштабироваться до любого количества записей. Возможно ли это?

DE001XYX   A 
CD100000 B
CD200000 C
DE001KKK A
CD100000 B
DE003ZZZ A
DE001XYX A
CD100000 B
CD200000 C
DE001KKK A
CD100000 B
........

Транспонировать

DE001XYX   CD100000   CD200000   
DE001KKK   CD100000   
DE003ZZZ   
DE001XYX   CD100000   CD200000   
DE001KKK   CD100000   
.....

person Kevin    schedule 29.07.2015    source источник
comment
Сообщите нам, какой продукт SORT вы используете: DFSORT, Syncsort и т. д., и добавьте эти теги к своему вопросу.   -  person cschneid    schedule 30.07.2015
comment
Как он может масштабироваться до любого количества записей? У вас есть только 26 букв алфавита, и у вас есть максимумы для длин записей. Важен ли порядок вывода (поскольку данные уже должны быть отсортированы хотя бы один раз)?   -  person Bill Woodger    schedule 30.07.2015
comment
Там только три ключа, а именно A B C. A идет с записью, которая начинается с DE, B идет с записью, которая начинается с CD1, а C идет с записью, которая начинается с CD2. Каждая запись DE связана с записью под ней, то есть с записями CD1 и CD2.   -  person Kevin    schedule 30.07.2015
comment
Если вы все еще решаете эту проблему, почему бы не использовать REXX?   -  person paulywill    schedule 23.01.2017


Ответы (1)


Это один из вопросов, который я любил и давно хотел решить сам. После некоторых исследований и проб я только что придумал решение.


ОБНОВЛЕНИЕ: Импровизированный подход приведен ниже. Он решает проблему за 1 проход, тогда как первоначальный подход требовал 3 проходов.

Импровизированный подход: нет необходимости в 3 проходах.

***************************** Top of Data ******************************
//JOBNAME JOB ('ACCOUNT INFORMATION'),'TRANSPOSE',                      
//     CLASS=2,MSGCLASS=H,NOTIFY=&SYSUID                                
//STEP1   EXEC PGM=SORT                                                 
//SORTIN  DD *                                                          
DE001XYX   A                                                            
CD100000   B                                                            
CD200000   C                                                            
DE001KKK   A                                                            
CD100000   B                                                            
DE003ZZZ   A                                                            
DE001XYX   A                                                            
CD100000   B                                                            
CD200000   C                                                            
DE001KKK   A                                                            
CD100000   B                                                            
//SORTOUT DD SYSOUT=*                                                   
//SYSOUT  DD SYSOUT=*                                                   
//SYSIN   DD *                                                          
 SORT FIELDS=(30,1,CH,A)                                                
 INREC IFTHEN=(WHEN=GROUP,BEGIN=(12,1,CH,EQ,C'A'),                      
              END=(12,1,CH,EQ,C'C'),PUSH=(14:ID=1)),                    
       IFTHEN=(WHEN=(12,1,CH,EQ,C'A'),BUILD=(1:1,8,19Z,28:12,1,         
              30:14,1)),                                                
       IFTHEN=(WHEN=(12,1,CH,EQ,C'B'),                                  
              BUILD=(1:9Z,10:1,8,18:10Z,28:12,1,30:14,1)),              
       IFTHEN=(WHEN=(12,1,CH,EQ,C'C'),                                  
              BUILD=(1:18Z,19:1,8,28:12,1,30:14,1))                     
 SUM FIELDS=(1,8,10,8,19,8),FORMAT=BI                                   
 OUTREC FIELDS=(1:1,8,9:X,10:10,8,18:X,19:19,8)                         
**************************** Bottom of Data ****************************

Приводит к тому же результату, который OP показал в своем вопросе.


Первоначальный подход:

Шаг 1: я использовал WHEN=GROUP с параметрами BEGIN, END и PUSH.

//JOBNAME JOB ('ACCOUNT NAME'),'TRANSPOSE',          
//     CLASS=2,MSGCLASS=H,NOTIFY=&SYSUID             
//STEP1   EXEC PGM=SORT                              
//SORTIN  DD *                                       
DE001XYX   A                                         
CD100000   B                                         
CD200000   C                                         
DE001KKK   A                                         
CD100000   B                                         
DE003ZZZ   A                                         
DE001XYX   A                                         
CD100000   B                                         
CD200000   C                                         
DE001KKK   A                                         
CD100000   B                                         
//SORTOUT DD SYSOUT=*                                
//SYSOUT  DD SYSOUT=*                                
//SYSIN   DD *                                       
 SORT FIELDS=COPY                                    
 OUTREC IFTHEN=(WHEN=GROUP,BEGIN=(12,1,CH,EQ,C'A'),  
               END=(12,1,CH,EQ,C'C'),PUSH=(14:ID=1))

PUSH=(14:ID=1) означает, что позиция 14 для 1 является идентификатором, который увеличивается для каждой группы. Каждый A указывает на новую группу независимо от того, была ли предыдущая группа завершена с помощью C. Идентификатор +1, когда начинается новая группа.

Примечание. Поскольку мы допускаем использование только одного символа для идентификатора, когда счетчик идентификатора достигает 10, в позиции 14 появится "0". Вы также можете назначить более 1 байта для идентификатора.

Выход из шага 1:

********************************* TOP OF DATA **********************************
DE001XYX   A 1                                                                  
CD100000   B 1                                                                  
CD200000   C 1                                                                  
DE001KKK   A 2                                                                  
CD100000   B 2                                                                  
DE003ZZZ   A 3                                                                  
DE001XYX   A 4                                                                  
CD100000   B 4                                                                  
CD200000   C 4                                                                  
DE001KKK   A 5                                                                  
CD100000   B 5                                                                  
******************************** BOTTOM OF DATA ********************************

Шаг 2. Возьмите результат шага 1. Измените положение записей DE, CD1 и CD2 на основе трех ключей A, B и C соответственно.

//JOBNAME JOB ('ACCOUNT NAME'),'TRANSPOSE',                     
//     CLASS=2,MSGCLASS=H,NOTIFY=&SYSUID                        
//STEP1   EXEC PGM=SORT                                         
//SORTIN  DD *                                                  
DE001XYX   A 1                                                  
CD100000   B 1                                                  
CD200000   C 1                                                  
DE001KKK   A 2                                                  
CD100000   B 2                                                  
DE003ZZZ   A 3                                                  
DE001XYX   A 4                                                  
CD100000   B 4                                                  
CD200000   C 4                                                  
DE001KKK   A 5                                                  
CD100000   B 5                                                  
//SORTOUT DD SYSOUT=*                                           
//SYSOUT  DD SYSOUT=*                                           
//SYSIN   DD *                                                  
 SORT FIELDS=COPY                                               
 OUTREC IFTHEN=(WHEN=(12,1,CH,EQ,C'A'),BUILD=(1:1,8,19Z,28:12,1,
               30:14,1)),                                       
        IFTHEN=(WHEN=(12,1,CH,EQ,C'B'),                         
               BUILD=(1:9Z,10:1,8,18:10Z,28:12,1,30:14,1)),     
        IFTHEN=(WHEN=(12,1,CH,EQ,C'C'),                         
               BUILD=(1:18Z,19:1,8,28:12,1,30:14,1))            
/*      

Примечание. Двоичные нули вставляются между ними в качестве заполнителей, чтобы их можно было заполнить данными на шаге 3.

Результаты шага 2:

********************************* TOP OF DATA **********************************
DE001XYX                   A 1                                                  
         CD100000          B 1                                                  
                  CD200000 C 1                                                  
DE001KKK                   A 2                                                  
         CD100000          B 2                                                  
DE003ZZZ                   A 3                                                  
DE001XYX                   A 4                                                  
         CD100000          B 4                                                  
                  CD200000 C 4                                                  
DE001KKK                   A 5                                                  
         CD100000          B 5                                                  
******************************** BOTTOM OF DATA ********************************

При включенном шестнадцатеричном режиме вы сможете увидеть двоичные нули (X'00).

***************************** Top of Data ******************************
DE001XYX                   A 1                                          
CCFFFEEE0000000000000000000C4F444444444444444444444444444444444444444444
450017870000000000000000000101000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
         CD100000          B 1                                          
000000000CCFFFFFF0000000000C4F444444444444444444444444444444444444444444
000000000341000000000000000201000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
                  CD200000 C 1                                          
000000000000000000CCFFFFFF4C4F444444444444444444444444444444444444444444
000000000000000000342000000301000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
DE001KKK                   A 2                                          
CCFFFDDD0000000000000000000C4F444444444444444444444444444444444444444444
450012220000000000000000000102000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
         CD100000          B 2                                          
000000000CCFFFFFF0000000000C4F444444444444444444444444444444444444444444
000000000341000000000000000202000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
DE003ZZZ                   A 3                                          
CCFFFEEE0000000000000000000C4F444444444444444444444444444444444444444444
450039990000000000000000000103000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
DE001XYX                   A 4                                          
CCFFFEEE0000000000000000000C4F444444444444444444444444444444444444444444
450017870000000000000000000104000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
         CD100000          B 4                                          
000000000CCFFFFFF0000000000C4F444444444444444444444444444444444444444444
000000000341000000000000000204000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
                  CD200000 C 4                                          
000000000000000000CCFFFFFF4C4F444444444444444444444444444444444444444444
000000000000000000342000000304000000000000000000000000000000000000000000
DE001KKK                   A 5                                          
CCFFFDDD0000000000000000000C4F444444444444444444444444444444444444444444
450012220000000000000000000105000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
         CD100000          B 5                                          
000000000CCFFFFFF0000000000C4F444444444444444444444444444444444444444444
000000000341000000000000000205000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
**************************** Bottom of Data ****************************

Шаг 3. Используя выходные данные шага 2 в качестве входных данных, используйте SUM FIELDS для объединения записей DE, CD1 и CD2 группы с SORT FIELDS в поле ID на 30-й позиции.

//JOBNAME JOB ('ACCOUNT NAME'),'TRANSPOSE',                     
//     CLASS=2,MSGCLASS=H,NOTIFY=&SYSUID                        
//STEP1   EXEC PGM=SORT                                         
//SORTIN  DD *                                                  
DE001XYX                   A 1                                                  
         CD100000          B 1                                                  
                  CD200000 C 1                                                  
DE001KKK                   A 2                                                  
         CD100000          B 2                                                  
DE003ZZZ                   A 3                                                  
DE001XYX                   A 4                                                  
         CD100000          B 4                                                  
                  CD200000 C 4                                                  
DE001KKK                   A 5                                                  
         CD100000          B 5                                                  
//SORTOUT DD SYSOUT=*                                           
//SYSOUT  DD SYSOUT=*                                           
//SYSIN   DD *
  SORT FIELDS=(30,1,CH,A)                       
  SUM FIELDS=(1,8,10,8,19,8),FORMAT=BI          
  OUTREC FIELDS=(1:1,8,9:X,10:10,8,18:X,19:19,8)
/* 

С помощью OUTREC FIELDS=(1:1,8,9:X,10:10,8,18:X,19:19,8) замените двоичные нули между полями DE, CD1 и CD2 пробелами.

Выход из шага 3: Вот и все!

***************************** Top of Data ******************************
DE001XYX CD100000 CD200000                                              
DE001KKK CD100000                                                       
DE003ZZZ                                                                
DE001XYX CD100000 CD200000                                              
DE001KKK CD100000                                                       
**************************** Bottom of Data ****************************

Подробнее о SUM FIELDS с двоичными нулями:

Двоичное сложение работает с двумя битовыми шаблонами. Давайте рассмотрим следующие записи (включен шестнадцатеричный режим, так как я хотел бы показать, как выполняется двоичное сложение шестнадцатеричных значений).

****** ********
000001 DE001XYX
       CCFFFEEE
       45001787
---------------
000002         
       00000000
       00000000

Шестнадцатеричное значение первого байта, X'C4', добавляется к двоичным нулям в 1-м байте 2-й записи.

 C4
+00
 --
 C4

X'C4' обозначает букву 'D' в EBCDIC

Если мы изменим двоичный ноль в первом байте на двоичную единицу (X'01'), результаты будут другими.

 C4
+01
 --
 C5

X'C5' обозначает букву "E" в EBCDIC.

С помощью двоичных нулей мы можем выполнить SUM FIELDS над буквенно-цифровыми элементами данных (символы EBCDIC az, AZ, 0-9), чтобы сгруппировать их в одну запись.


person Srinivasan JV    schedule 05.09.2018
comment
Большое спасибо за ваши усилия. Infact, Inposted это и забыл. Я нашел решение этой проблемы. Но я добился этого с помощью запросов terdata JCL и BTEQ. - person Kevin; 06.09.2018
comment
Привет @ user2959433 Приятно знать, что вы нашли решение. Поскольку Syncsort был помечен вопросом, я решил использовать его для поиска решения. Это было довольно сложно и открыло новые возможности. - person Srinivasan JV; 06.09.2018