Я хочу выполнить шаг JCL независимо от того, какой RC предыдущего шага?

В моем JCL есть 3 шага:

ШАГ 1: обработать ШАГ 2: NDM ШАГ 3: УДАЛИТЬ ВЫВОД после NDM

Чего я хочу добиться? Я хочу выполнить ШАГ 3 независимо от кода возврата шага 2.

Я пробовал это: COND=(16,GT) и COND=(16,ST,STEP 2), но это не то, что я хочу.


person Puneet Abichandani    schedule 10.08.2017    source источник


Ответы (2)


Попробуйте COND=EVEN в операторе EXEC вашего последнего шага.

Из документации:

COND=EVEN указывает MVS выполнять этот шаг задания, ДАЖЕ, ЕСЛИ предыдущий шаг того же задания прерывается, если только задание не отменено оператором MVS.

Также есть COND=ONLY:

COND=ONLY указывает MVS выполнять этот шаг задания, ТОЛЬКО ЕСЛИ предыдущий шаг в том же задании прерывается.

Объяснение УСЛОВИЯ:

COND довольно нелогичен. Описание:

Если ни один из этих тестов не удовлетворяется, система выполняет шаг задания; если какой-либо тест выполнен, система пропускает шаг задания, на котором закодирован параметр COND=.

Таким образом, ваш COND=(16,GT) означает «Если 16 больше, чем код возврата из любых предыдущих шагов, не выполняйте этот шаг». Таким образом, этот шаг будет выполняться только в том случае, если ВСЕ предыдущие шаги завершились с RC > 16.

COND=(16,ST,STEP 2) недопустимо - ST не является допустимым условием. Действительные тесты:

EQ - equal                    
LT - less than                
LE - less than or equal to    
NE - not equal                
GT - greater than             
GE - greater than or equal to 

Чтобы выполнить шаг, независимо от кодов условий из предыдущих шагов, вы можете указать COND=(0,GT), что означает «если 0 больше, чем любой предыдущий код возврата (который не будет), пропустить этот шаг.'.

Чтобы быть в безопасности, вы можете закодировать:

COND=((0,GT),EVEN)

поскольку EVEN приведет к выполнению этого шага, даже если предыдущий шаг ABEND.

person Steve Ives    schedule 10.08.2017
comment
Я использовал COND = EVEN, это решило мою проблему. Большое спасибо. Просто из любопытства, что не так в моем подходе? - person Puneet Abichandani; 10.08.2017

Использование COND=EVEN имеет потенциальную ловушку, заключающуюся в том, что STEP будет выполняться, даже если предыдущий шаг ОТМЕНЯЕТСЯ. Кодирование COND=(0,GT,STEP2) должно разрешать выполнение шага, но не при наличии ABEND.

В качестве альтернативы вы можете использовать кодирование IF/THEN/ELSE/ENDIF.

e.g.

//STEP2 EXEC PGM=NDM
//IF STEP2.RC >= 0 THEN
//STEP3 EXEC PGM=???
//ENDIF

or

//STEP2 EXEC PGM=NDM
//IF STEP2.RC GE 0 THEN
//STEP3 EXEC PGM=???
//ENDIF

то есть можно использовать либо >=, либо GE.

Вам может оказаться полезным Конструкция оператора IF/THEN/ELSE/ENDIF

или для параметра COND COND Параметр

person MikeT    schedule 10.08.2017
comment
Я бы последовал совету Майка и выбрал операторы IF/THEN/ELSE. Коды состояния — это анахронизм, который принадлежит добрым старым временам, и его следует избегать любой ценой. Во всяком случае это мое мнение ;) - person David Crayford; 11.08.2017
comment
Я присоединяюсь к вышеизложенному совету. - person zarchasmpgmr; 12.08.2017
comment
Я третий этот совет. IF/THEN/ELSE/ENDIF значительно проще в обслуживании и понимании. - person cschneid; 13.08.2017