Если вы можете гарантировать наличие прицепа, проблема становится управляемой. Так давайте сделаем этот первый, и новый, очень быстрый, шаг:
OPTION COPY,STOPAFT=1
INREC OVERLAY=(X'FF')
Для SORTIN использовать входной набор данных, для SORTOUT создания/записи в наборе данных, который будет содержать одну запись. Преимущество чтения ввода (только первая запись) заключается в том, что вы получите бесплатные RECFM и LRECL бесплатно.
Тогда для основного шага у вас есть SORTIN с вашим набором данных и набором данных, соединенным с ним. Кроме того, включают следующее:
//TESTDMY DD DSN=NULLFILE
или это:
//TESTDMY DD DUMMY
Код:
//SYSIN DD *
OPTION COPY
INREC IFTHEN=(WHEN=GROUP,
BEGIN=(1,1,CH,EQ,C'1'),
PUSH=(81:1,1,SEQ=7)),
IFTHEN=(WHEN=INIT,
OVERLAY=(82:82,7,ZD,SUB,+2,TO=ZD,LENGTH=7)),
IFTHEN=(WHEN=GROUP,
BEGIN=(1,1,CH,EQ,C'3'),
PUSH=(91:1,1)),
IFTHEN=(WHEN=GROUP,
BEGIN=(1,1,CH,EQ,C'3',
AND,
2,7,CH,NE,82,7,CH),
PUSH=(91:81,1))
OUTFIL OMIT=(1,1,CH,GT,C'2'),
REMOVECC,
TRAILER1=(C'3',COUNT-1=(M11,LENGTH=7),80:X,
/,
C'9',80:X),
BUILD=(1,80)
OUTFIL FNAMES=TESTDMY,
INCLUDE=(1,1,CH,EQ,X'FF',
AND,
(91,1,CH,EQ,C' ',
OR,
91,1,CH,EQ,C'3')),
NULLOFL=RC4
Точный код зависит от RECFM и LRECL, но выше будет работать на F/FB и 80.
Первый WHEN = GROUP помещает значение типа записи («1») в позицию 81 записи (т.е. exte записи 80 байтов) и следует за ним семизначным порядковым номером.
WHEN = INIT изменяет порядковый номер на каждой записи, вычитая два (так что heade и трейлер с общей суммой не учитываются).
Вторая WHEN = GROUP сохраняет свой тип записи («3») в позиции 91 для выбора, чтобы указать, что файл в порядке.
Третья WHEN = GROUP проверяет счетчик на первом трейлере при вычислении записей данных (WHEN = INIT), и если они не совпадают, перезаписывает тип записи «3» в расширении с помощью этого первой (предполагаемой заголовка) записи в файле.
2 OUTFILs. Первый сбрасывает все записи трейлеров (включая фиктивный) и использует TRAILER1 и slash-operator (/) для создания двух новых записей трейлера с правильным счетом. BUILD предназначен для обеспечения использования исходной длины записи.
Второй OUTFIL используется для «проверки». Если трейлер типа 3 присутствует, он был протестирован в третьем WHEN = GROUP. Два правильных сценария представляют собой тип 3 с правильным значением, позиция 91 расширенной записи будет «3» или без записи типа 3, когда позиция 91 будет пустой.Любая из этих записей записывается в фиктивный выходной набор данных. Если записи не записываются (т. Е. Тип-3 с неправильным подсчетом находится в наборе данных), то RC устанавливается на четыре с использованием NULLOFL.
Возможна большая проверка, а записи переменной длины возможны, но для этого потребуется другой код. Вы не указали ясность по этим вопросам.
Недостаточно информации для кодового ответа, но посмотрите, дает ли это начало.
СОРТ не является языком общего назначения. Есть причины, обратная совместимость и целостность данных, производительность, надежность, но это означает, что вам нужно делать все по-другому.
В СОРТЕ трудно сказать «если эта запись существует, обновите ее, если она этого не сделает, создайте ее».
Однако, если нет данных о двух трейлерах, которые не могут быть воспроизведены из содержимого файла, никаких проблем.
Вы удаляете прицепы, если они есть. Затем добавьте их.
В двух местах вы можете выбрать данные для обработки. Это с INCLUDE/OMIT COND=
, который работает до любой другой обработки или с OUTFIL INCLUDE=/OMIT=
, который является окончательной обработкой.
Если вы хотите проверить наличие прицепов, используйте OUTFIL INCLUDE =/OMIT = и проверьте в INREC
или OUTREC
.
Чтобы получить что-то, чтобы подтвердить снова, добавьте/предварительно отложите поле SEQNUM
к вашим данным, когда запись не является заголовком. Затем IFTHEN=(WHEN=(logical-expression)
, чтобы идентифицировать трейлер (ы) и сравнить счетчики.
Чтобы добавить трейлеры, используйте функции отчетности OUTFIL с REMOVECC
и TRAILER2
, в котором есть COUNT
, которые могут быть изменены.
RECFM, LRECL и лучшее объяснение записи TRAILER1 и что вы хотите сделать. Пожалуйста, напишите код DFSORT, который у вас уже есть. –
Я отредактировал вопрос, пожалуйста, посмотрите один раз .... –
Обновленный ответ. –