Необходимо выполнить поиск члена в файле PDS с помощью JCL

Мне нужна помощь, чтобы создать JCL для поиска элемента текущего года (например, RPxxxx, где xxxx обозначает 2018 год) в файле PDS. Новый член создается каждый год в ходе ежегодного задания, в котором используется файл PDS. Следовательно, имя члена не фиксируется в файле PDS, т.е. суффикс менялся каждый год.

Нам нужно создать JCL, который проверяет, присутствует ли член текущего года в файле PDS. Таким образом, задание-преемник будет успешно выполнено.

Если элемент текущего года присутствует в файле PDS, то новое задание будет запущено с кодом RC 0000, что указывает на то, что последующее задание будет запущено автоматически.

Если элемент текущего года отсутствует в файле PDS, задание завершится ошибкой с кодом RC 0001, что указывает на то, что следующее последующее задание не будет запущено до тех пор, пока это задание не восстановится успешно.

Пожалуйста, помогите мне создать такой JCL.

Ваша помощь очень ценится.

Заранее спасибо.


person RAVI    schedule 19.07.2018    source источник
comment
Требуемый JCL будет зависеть от используемой вами утилиты. Сам по себе JCL не может этого сделать - он только сообщает ОС, что вы хотите запустить программу и необходимые ресурсы.   -  person NicC    schedule 19.07.2018
comment
что ты уже испробовал?   -  person Kevin McKenzie    schedule 19.07.2018


Ответы (3)


LISTDS, функция TSO, отображает атрибуты набора данных. Вы можете использовать утилиту IKJEFT01 (которая позволяет запускать функции TSO в пакетном режиме) и запускать эту функцию TSO. Однако коды возврата, выдаваемые LISTDS, не то, что вам нужно.

Итак, я бы предложил запустить сценарий REXX, как показано ниже, с помощью утилиты IKJEFT01, чтобы оценить наличие члена в PDS.

/* REXX */         
arg dsname         
address tso        
"listds ("dsname")"
if (rc \= 0) then  
exit 1              

Запуск JCL будет выглядеть так, как показано ниже.

//JOBNAME    JOB ('ACCOUNTING INFORMATION'),
//     CLASS=2,MSGCLASS=H,NOTIFY=&SYSUID    
//P1 EXEC PGM=IKJEFT01                      
//SYSPROC DD DSN=YOUR.REXX.LIB,DISP=SHR     
//SYSTSPRT DD SYSOUT=*                      
//SYSTSIN DD *                              
  %EMPTY7 'YOUR.PDS(RPXXXX)'                  
/*    

EMPTY7 в SYSTSIN DD — это имя сценария REXX. Библиотека, указанная в SYSPROC DD, — это место, где будет храниться ваш сценарий REXX.

Дайте мне знать, если вам нужна дополнительная информация.

person Srinivasan JV    schedule 19.07.2018
comment
Коды возврата не «выбрасываются», они выдаются. Брошенный - это C и родственные языки, термин для операционных систем, отличных от MVS. - person NicC; 19.07.2018

Нет необходимости в сценарии REXX. Просто запустите LISTDS через IKJEFT1A, и шаг завершится кодом возврата из команды LISTDS.

Обратите внимание, что в описании синтаксиса явно не упоминается спецификация члена, но это работает. Используйте его на свой страх и риск.

//STEP01   EXEC PGM=IKJEFT01
//SYSTSPRT DD SYSOUT=*
//SYSTSIN  DD *
  LISTDS ('your.data.set.name(yourmember)')
/*

Шаг завершится с RC=0, если член существует, в противном случае RC будет ненулевым.

person phunsoft    schedule 19.07.2018
comment
Я знаю об этом. Поскольку RC должен быть равен 1, когда ни одного члена не существует, я предпочел написать сценарий REXX. - person Srinivasan JV; 20.07.2018
comment
Я упустил момент, что RC должен быть равен 1. Я думал, что это будет планировщик, который решает на основе RC первого задания, следует ли суммировать второе задание. Если ноль, отправьте, иначе нет. - person phunsoft; 20.07.2018
comment
//ЕСЛИПЛОХО ЕСЛИ (ПРЕРЫВ | ШАГ1.RC › 0) ТО - person paulywill; 20.07.2018
comment
OP говорит о последующем задании, а не о последующем шаге. IF помогает только внутри работы. (Форматирование исправлено). - person phunsoft; 21.07.2018

Следующий код Rexx будет динамически создавать имя элемента на основе текущего года и не требует жесткого кодирования набора данных/имени элемента. Таким образом, вы можете запланировать задание для создания нового члена, не редактируя задание.

/* Rexx */                                
 arg dsname                               

 currDate = Date('S')                     
 currYear = substr( currDate, 1, 4 )      
 fqdsname = dsname||"(RP"||currYear||")"  
 "listds ("fqdsname")"                    
 if (rc \= 0) then                        
 exit 1                                   
person Hogstrom    schedule 23.07.2018