2015-05-13 2 views
0

Моего след файл (FB, LRECL = 274) оказывает запись, как,кода для добавления прицепа, если нет и проверить, если присутствует

ВИД:

HEADER 1 1 A VALUE '1' 

DATA 2 263 A VALUE '2' 

TRAILER-1-REC-TYPE 1 1 A VALUE '3' 

TRAILER-1-COUNT 2 11 A 

TRAILER-2 1 1 A VALUE '9' 


HEADER1.... 
HEADER2.... 
B>>DATA<< 
B>>DATA<< 
30000000X <- TRAILER1, here 3 is constant and X is the rec-count excluding HEADERS AND TRAILERS 
9<-TRAILER2 

Таким образом, требование, чтобы добавить прицепа1 и TRAILER2 в файле, если они отсутствуют, и проверьте (X и 9), если они есть. Я сделал это с помощью easytrieve, но не смог использовать DFSORT.

При использовании DFSORT, я просто в состоянии реализовать X (количество) и 9 (TRAILER2), но не в проверить X и 9.

МОЙ КОД ::

//TRLRCHK EXEC PGM=ICETOOL         
//SYSOUT DD SYSOUT=*          
//SIN1  DD DSN=MY-PS-FILE,DISP=SHR  
//TOOLMSG DD SYSOUT=*          
//DFSMSG DD SYSOUT=*          
//TOOLIN DD *            
    COUNT FROM(SIN1) EMPTY USING(CTL1)       
//CTL1CNTL DD *            
    SORT FIELDS=COPY           
    INCLUDE COND=(1,2,CH,EQ,C'9')        
// IF (TRLRCHK.RC=12) THEN         
//STEP0100 EXEC PGM=SORT          
//SYSOUT DD SYSOUT=*          
//SORTIN DD DSN=MY-PS-FILE,DISP=SHR  
//SORTOUT DD DSN=MY-PS-FILE,DISP=SHR  
//SYSIN DD *            
    OPTION COPY             
    OUTFIL FILES=OUT,REMOVECC,         
    TRAILER1=(C'9'),           
    TRAILER2=(C'3',COUNT-2=(M11,LENGTH=11))      
// ENDIF 
+0

RECFM, LRECL и лучшее объяснение записи TRAILER1 и что вы хотите сделать. Пожалуйста, напишите код DFSORT, который у вас уже есть. –

+0

Я отредактировал вопрос, пожалуйста, посмотрите один раз .... –

+0

Обновленный ответ. –

ответ

0

Если вы можете гарантировать наличие прицепа, проблема становится управляемой. Так давайте сделаем этот первый, и новый, очень быстрый, шаг:

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, которые могут быть изменены.

+0

Спасибо за ответ, а также Что такое '// CTL1CNTL DD *?' –

+0

Вы можете задать это как отдельный вопрос. Если у нас есть два (или более) вопроса на вопрос, более запутанным и трудным для будущих поисковиков найти то, что им нужно. –

+0

Я так и думал, но его значение для этого вопроса ... так что, пожалуйста ... –

Смежные вопросы