使用条件逻辑验证 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 )的程序,您可以使用 IDCAMSSET 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的主要内容,如果未能解决你的问题,请参考以下文章

python_逻辑运算符

如何覆盖DataAnnotations必需标记以允许条件客户端验证

如何用策略替换(而不仅仅是移动)条件逻辑?

使用条件逻辑组合 HTML 视图

ASP.NET Razor - C# 逻辑条件

使用 CodeIgniter 的 ActiveRecord 对多个条件逻辑进行分组