Это один из вопросов, который я любил и давно хотел решить сам. После некоторых исследований и проб я только что придумал решение.
ОБНОВЛЕНИЕ: Импровизированный подход приведен ниже. Он решает проблему за 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