Проверка JCL с помощью условной логики
Обычно, когда я смотрю на JCL, я набираю команду JEM в командной строке ISPF, и она быстро сканирует и сообщает обо всех ошибках, таких как не выделенные файлы.
Единственная проблема заключается в том, что когда у нас есть операторы IF в JCL, JEM пропустит эти разделы. Так что, хотя JCL JEM-ed чист, я все равно могу получить ошибки JCL. В любом случае я могу проверить JCL, кроме проверки того, что каждый отдельный файл выделен?
2 ответа
Что вы можете сделать, это проверить логику обработки кода условия с помощью программ, которые могут выдавать коды условий для замены реальных программ.
Для программы, которая выдает код 0 Cond, просто замените jcl для шага на шаг, который вызывает IEFBR14
программы.
например, заменить шаг на
//STEP010 EXEC PGM=IEFBR14
(включая любую проверку кода условия с исходного шага)
Для программы, которая выдает код условия (например, 8), вы можете использовать IDCAMS
с этим имеет SET MAXCC=8
например
//STEP010 EXEC PGM=IDCAMS
//SYSIN DD *
MAXCC = 8
//SYSPRINT DD SYSOUT=*
Вы могли бы довольно легко написать программу Rexx, Cobol PL1, которая могла бы принимать параметр в качестве кода.
У меня лично была программа на ассемблере CCFIN (она также могла выпускать пользовательские абенды), которая была:
TITLE 'ISSUE COND CODE OR ABEND' 00001000
PRINT NOGEN 00001100
INIT REGNUM=1 STANDARD INITIALISATION 00001200
*-------------------------------------------------------------------- 00001301
* GET PARAMETER INFORMATION 00001401
*-------------------------------------------------------------------- 00001501
L 2,0(1) AD OF PARAMETER 00001601
SR 3,3 00001701
LH 3,0(2) GET LENGTH OF PARAMETER 00001801
CH 3,=H'0' CHECK IF ANY PARAMETER 00001901
BH CCFIN001 OK SO FAR 00002001
TO_SHORT WTO 'CCFIN01 - NO PARAMETER GIVEN',ROUTCDE=(2),DESC=(1) 00002101
ERR_END L 13,4(13) 00002203
RETURN (14,12),RC=1 00002301
CCFIN001 CH 3,=H'6' MAX LENGTH OF 6 00002401
BH CCERET01 ERROR > 6 00002502
*-------------------------------------------------------------------- 00002601
* CHECK TO SEE IF USER ABEND IS REQUIRED (UA????) 00002701
*-------------------------------------------------------------------- 00002801
MVC UFLAG(1),=C'N' DEFAULT NO 00002901
CH 3,=H'3' IS PARAMETER < 3 00003001
BL CCFIN030 YES THEN CANT BE USER ABEND 00003101
CLC 2(2,2),=C'UA' CHECK FOR USER ABEND 00003201
BE CCFIN020 00003301
CH 3,=H'4' NOT USER ABEND SO MAX LEN IS 4 00003401
BH CCERET02 ERROR 00003502
B CCFIN030 NOT USER ABEND BUT LEN OK 00003601
CCFIN020 MVC UFLAG(1),=C'Y' SET USER ABEND REQUIRED 00003701
LA 5,1(0,0) 00003801
B CCFIN031 00003901
*-------------------------------------------------------------------- 00004001
* CONVERT PARAMETER TO COMPLETEION CODE 00004101
*-------------------------------------------------------------------- 00004201
CCFIN030 LA 5,1(0,0) 00004301
CCFIN031 LA 4,NSTR 00004401
LA 2,1(2) SKIP PARAMETER LENGTH 00004501
MVC 0(4,4),=C'0000' ENSURE LEFT PAD WITH 0 00004601
LA 4,3(4) END OF AREA 00004701
AR 2,3 END OF PARAMETER LIST 00004801
CLC UFLAG(1),=C'Y' USER ABEND 00004901
BNE CCFIN032 00005001
SR 3,5 00005101
SR 3,5 00005201
CCFIN032 MVC 0(1,4),0(2) 00005301
SR 2,5 00005401
SR 4,5 00005501
BCT 3,CCFIN032 00005601
*-------------------------------------------------------------------- 00005701
* NUMERICS ONLY 00005801
*-------------------------------------------------------------------- 00005901
LA 4,NSTR 00006001
LA 3,4 00006101
CCFIN040 CLC 0(1,4),=X'F0' 00006201
BL CCERET03 00006302
CLC 0(1,4),=X'F9' 00006401
BH CCERET03 00006502
LA 4,1(4) 00006601
BCT 3,CCFIN040 00006701
*-------------------------------------------------------------------- 00006801
* CONVERT NUMBER TO BINARY INTO R15 00006901
*-------------------------------------------------------------------- 00007001
PACK PSTR,NSTR(4) 00007101
CVB 15,PSTR 00007201
CLC UFLAG(1),=C'Y' 00007301
BE FINUA 00007401
FINCC L 13,4(13) 00007501
RETURN (14,12),RC=(15) 00007601
FINUA LR 2,15 00007701
CL 2,=F'4095' 00007801
BNH FU0001 00007901
WTO 'CCFIN02 - USER ABEND CODE GREATER THAN 4095', X00008001
ROUTCDE=(2),DESC=(1) 00008101
SR 2,2 00008201
FU0001 ABEND (2) 00008301
CCERET01 WTO 'CCFIN03 - PARAMETER GREATER THAN 6 CHARACTERS', X00008401
ROUTCDE=(2),DESC=(1) 00008501
B ERR_END 00008603
CCERET02 WTO 'CCFIN04 - PARAMETER GREATER THAN 4 CHARACTERS', X00008701
ROUTCDE=(2),DESC=(1) 00008801
B ERR_END 00008903
CCERET03 WTO 'CCFIN05 - NON NUMERICS CHARACTERS IN PARAMETER', X00009001
ROUTCDE=(2),DESC=(1) 00009101
B ERR_END 00009203
FINISH 00009300
UFLAG DS CL1 00010001
NSTR DS 1F 00020001
PSTR DS D'0' 00030001
END 00036900
JCL для вышеупомянутого (для выдачи кода условия 8) будет тогда:
//STEP010 EXEC PGM=CCFIN,PARM="8"
//STEPLIB DD DSN=MY.LOADLIB,DISP=SHR
пример
Предполагая, что производственный (sic) JCL для тестирования был:-
//CCOP010R JOB (@OPC,PROD,OPC),'MIKE TAYLOR',
// RESTART=STEP020,
// NOTIFY=CCOP010
//*--------------------------------------------------------------------
//STEP010 EXEC PGM=IKJEFT01,REGION=8M,TIME=10
//*
//* SELECT REQUIRED RECORDS FROM THE JOB/APPL XREF
//*
//SYSPROC DD DISP=SHR,DSN=ISPF.EI.XGROUP.CLIST
//SYSEXEC DD DISP=SHR,DSN=CCOP010.USER.EXEC
//SYSTPRT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
OIR00001
//JXIN DD DISP=SHR,DSN=CCOP010.JX.LIST
//JXOUT DD DISP=SHR,DSN=CCOP010.JXMOD.LIST
//*--------------------------------------------------------------------
//STEP020 EXEC PGM=SORT,REGION=8M,COND=(0,NE)
//*
//* SORT BY APPLICATION OPNO AND JOBNAME REMOVING ANY DUPLICATES
//*
//SYSIN DD *
SORT FIELDS=(1,16,CH,A,19,3,CH,A,23,8,CH,A)
SUM FIELDS=NONE
//SORTIN DD DISP=SHR,DSN=CCOP010.JXMOD.LIST
//SORTOUT DD DISP=(,PASS),DSN=&&STEP020A,UNIT=SYSDA,SPACE=(CYL,(50,1))
//SYSOUT DD SYSOUT=*
//*--------------------------------------------------------------------
//STEP030 EXEC PGM=IKJEFT01,REGION=8M,TIME=30,COND=(0,NE)
//*
//* SELECT REQUIRED RECORDS FROM THE JOB/APPL XREF
//*
//SYSPROC DD DISP=SHR,DSN=ISPF.EI.XGROUP.CLIST
//SYSEXEC DD DISP=SHR,DSN=CCOP010.USER.EXEC
//SYSTPRT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
OIR00002
//JXIN DD DISP=(SHR,DELETE),DSN=&&STEP020A
//OIIN DD DISP=SHR,DSN=CCOP010.OI.LIST
//IEBOUT DD DISP=SHR,DSN=CCOP010.OIPDS.DATA
//REPORT DD DISP=SHR,DSN=CCOP010.OIPDS.REPORT
//*--------------------------------------------------------------------
И мы хотели проверить, правильно ли обрабатывался код состояния 8, выданный STEP010:
Выше можно изменить на:-
//CCOP010R JOB (@OPC,PROD,OPC),'MIKE TAYLOR',
// RESTART=STEP020,
// NOTIFY=CCOP010
//*--------------------------------------------------------------------
//STEP010 EXEC PGM=IDCAMS
//*
//* SELECT REQUIRED RECORDS FROM THE JOB/APPL XREF
//*
//SYSIN DD *
MAXCC = 8
//SYSPRINT DD SYSOUT=*
//*--------------------------------------------------------------------
//STEP020 EXEC PGM=IEFBR14,COND=(0,NE)
//*
//* SORT BY APPLICATION OPNO AND JOBNAME REMOVING ANY DUPLICATES
//*
//*--------------------------------------------------------------------
//STEP030 EXEC PGM=IEFBR14,COND=(0,NE)
//*
//* SELECT REQUIRED RECORDS FROM THE JOB/APPL XREF
//*
//*--------------------------------------------------------------------
Заметка! серьезное внимание должно быть уделено влиянию, которое может оказать отсутствие изменения имени и учетной информации. т.е. было бы целесообразно изменить их в соответствии с внутренним использованием.
Например, выполнение задания с тем же именем, что и задание, которое запускается и отслеживается с помощью планировщика, может повлиять на производственный график.
Использование TYPRUN=SCAN
в вашей карточке работы и отправьте работу. Это выполнит проверку синтаксиса, но ваша работа не будет запущена.
Имейте в виду, что он не будет выполнять проверки, такие как "файл не существует".
,