使用条件逻辑验证 JCL
Posted
技术标签:
【中文标题】使用条件逻辑验证 JCL【英文标题】:Validating JCL with conditional logic 【发布时间】:2017-11-06 16:24:02 【问题描述】:通常,当我查看完 JCL 后,我会在我的 ISPF 命令行中输入 JEM 命令,它会进行快速扫描并告诉我任何错误,例如文件未分配。
唯一的问题是,当我们在 JCL 中有 IF 语句时,JEM 将跳过这些部分。因此,即使 JCL JEM-ed clean,我仍然会遇到 JCL 错误。除了实际检查每个文件是否已分配之外,我还能验证 JCL 吗?
【问题讨论】:
JEM 是一个与 ASG Software 的 JOB/SCAN 产品相关的编辑宏。如果产品的该部分已安装并可供您使用,您可能可以通过 ISPF 对话框访问 JEM 正在执行的操作的更可配置版本。与您的技术人员交谈,这可能是产品中的一个错误,可能是通过维护修复的一个尚未应用的错误。 @cschneid 我不知道没有你们我会做什么!在大型机世界中,作为一个年轻人的糟糕之处在于,我不知道大局是如何运作的。我知道如何编码,但是当 JEM 之类的东西不能像我希望的那样工作时,我什至不知道从哪里开始寻找。再次感谢! 【参考方案1】:您可以做的是检查条件代码处理逻辑,通过使用可以发出条件代码的程序来替换实际程序。
对于发出 Cond 代码 0 的程序,只需将步骤的 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
示例
假设要测试的生产(原文如此)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
//*--------------------------------------------------------------------
我们想测试一下STEP010发出的条件代码8是否被正确处理:-
上面可以改成:-
//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
//*
//*--------------------------------------------------------------------
注意!应认真考虑不更改职位名称和会计信息可能产生的影响。即建议更改这些以适应内部使用。
例如运行与通过调度程序运行和跟踪的作业同名的作业可能会干扰生产计划。
【讨论】:
【参考方案2】:在您的工作卡中使用TYPRUN=SCAN
并提交工作。这将进行语法检查,但您的作业将不会运行。
请记住,它不会进行诸如“文件不存在”之类的检查。
.
【讨论】:
以上是关于使用条件逻辑验证 JCL的主要内容,如果未能解决你的问题,请参考以下文章