符号JCL混淆

4

我对在我的COBOL课程中完成的任务中如何创建JCL中的符号变量有些困惑。

例如,我应该“为PARM选项指定一个符号参数,并将TEST和APOST指定为默认值。”

我该如何指定“PARM”选项为符号参数?

编辑:抱歉,我忘了提到我正在运行的操作系统。我在z/OS中编写这个JCL文件。

谢谢!

编辑:

@avisser:

所以,你的意思是我可以直接调用"&PARM='TEST,APOST'",如果我想要在另一个JCL语句中运行此过程时更改该参数,则可以从调用JCL中更改列出的参数?

编辑:

@avisser:

是的,抱歉,我真的需要更加具体地说明... 在我的COBOL JCL中,我调用了COBOL编译器(IGYCRCTL),链接编辑器(HEWL)和程序获取(EXEC PGM=)。

编辑:

也许看一下我的输出会有所帮助。我真的很感谢所有试图帮助我的人。

输出:

------ JES2 JOB STATISTICS ------

       37 CARDS READ                                                                                                            

       61 SYSOUT PRINT RECORDS                                                                                                  

        0 SYSOUT PUNCH RECORDS                                                                                                  

        3 SYSOUT SPOOL KBYTES                                                                                                   

     0.00 MINUTES EXECUTION TIME                                                                                                

!! JES SPOOL文件结束 !! 1 //KC03CEFA JOB ,'MATT R',MSGCLASS=H,TYPRUN=SCAN JOB07731 //*
2 //STEP01 EXEC PGM=IGYCRCTL,&REGION=248K,
// &PARM='TEST,APOST'
3 //STEPLIB DD DSN=IGY340.SIGYCOMP,DISP=SHR
/*
4 //SYSLIN DD &DSN=&&OBJSET,UNIT=DISK,SPACE=(TRK,(3,3)),
// &DISP=(NEW,PASS,DELETE)
5 //SYSPRINT DD SYSOUT=*
6 //SYSUT1 DD UNIT=DISK,SPACE=(CYL,(1,1))
7 //SYSUT2 DD UNIT=DISK,SPACE=(CYL,(1,1))
8 //SYSUT3 DD UNIT=DISK,SPACE=(CYL,(1,1))
9 //SYSUT4 DD UNIT=DISK,SPACE=(CYL,(1,1))
10 //SYSUT5 DD UNIT=DISK,SPACE=(CYL,(1,1))
11 //SYSUT6 DD UNIT=DISK,SPACE=(CYL,(1,1))
12 //SYSUT7 DD UNIT=DISK,SPACE=(CYL,(1,1))
//*
//*
13 //STEP02 EXEC PGM=HEWL,&COND=,&REAGION=2048K,
// &PARM=
14 //SYSLIB DD DSN=CEE.SCEELKED,DISP=SHR
15 //SYSLIN DD &DSN=&&OBJSET,&DISP=(OLD,DELETE)
16 //SYSLMOD DD DSN=&&TEMPLIB(PGM6),
// SPACE=(1024,(50,20,1)),UNIT=DISK,
// DISP=(NEW,CATLG,DELETE)
17 //SYSPRINT DD SYSOUT=*
18 //PRINTER DD SYSOUT=*
19 //SYSUT1 DD UNIT=DISK,SPACE=(TRK,(10,10))
//*
//*
20 //STEP01 EXEC PGM=PGM6,&PARM=TERMTHDACT(DUMP)
21 //STEPLIB DD DSN=&&TEMPLIB,DISP=SHR
22 //CEEDUMP
23 //SYSUDUMP
24 //PRINTER DD SYSOUT=*
25 //PRODUCTS DD DSN=KC02322.CSCI465.SP09(DATA1),DISP=SHR
26 //SYSIN DD *
!! JES SPOOL文件结束 !! STMT NO. MESSAGE 2 IEFC630I 未识别的关键字 &REGION 2 IEFC630I 未识别的关键字 &PARM 4 IEFC630I 未识别的关键字 &DSN 4 IEFC630I 未识别的关键字 &DISP 13 IEFC630I 未识别的关键字 &COND 13 IEFC630I 未识别的关键字 &REAGION 13 IEFC630I 未识别的关键字 &PARM 15 IEFC630I 未识别的关键字 &DSN 15 IEFC630I 未识别的关键字 &DISP 20 IEFC630I 未识别的关键字 &PARM 22 IEFC605I 未识别的操作字段 23 IEFC605I 未识别的操作字段 !! JES SPOOL文件结束


JCL是作业控制语言的泛称。您需要指定您所询问的操作系统。 - anon
2个回答

6
符号参数是在名称前面加上“&”的名称。当在JCL语句中使用时,它们会在运行时转换为提供的值。在z/OS上创建它们的一种方法是使用声明:// SET name = value。如果使用PARM,则应设计程序以便可以使用它。也许分配是关于如何做到这一点的(提示:链接部分)。或者JCL是您的COBOL课程的一部分吗?对我来说,TEST和APOST看起来像编译器指令。我不知道您是否可以在程序中指定它们,在我的工作场所,我们只在调用编译器时提供它们。编辑:好的,对我来说有点不寻常,因为我们倾向于在单独的JCL流中编译和运行程序。但无论如何,考虑您的第二个语句:
2 //STEP01 EXEC PGM=IGYCRCTL,&REGION=248K,
  // &PARM='TEST,APOST'

REGION和PARM是所谓的位置参数,它们是关键字,而不是真正意义上的符号名称,尽管您可以自由地这样做(这将解释“未识别的关键字”消息)。 常见用法-如果适用的话-是为这些参数的操作数提供符号名称。显然,您必须首先定义一个值,例如:

  // SET OPTIONS='TEST,APOST'
  //STEP01 EXEC PGM=IGYCRCTL,REGION=248K,
  // PARM=&OPTIONS

哇,因为知道JCL是什么而加1。 - Charlie Martin
我最终解决了这个问题(和你展示的有点不同),但是你的建议非常有帮助。非常感谢。 - Enyalius
正如所提到的,SET仅是定义参数值的一种方式。在过程调用时提供它们是另一种方式,但我认为从SET开始会更容易。 - Albert Visser

4

好的,我做了一些调查,并在avisser给我的指导下,成功弄清楚了我该怎么做。因此,对于任何可能有这个问题(或类似问题)的人来说,这是我想出的解决方法:

步骤1:创建一个带有你将要使用的变量的“PROC”。

例如,我想在我的COBOL编译器中使用变量作为“PARM”,默认值为“TEST”和“APOST”,所以我写了如下代码:

//PROC1  PROC  CPARM='TEST,APOST',

步骤2:在实际的JCL步骤中使用这些新定义的符号参数。"&"字符表示其后面的内容是符号参数。

例如,我在COBOL编译步骤中使用了上述的"CPARM":

//COB    EXEC  PGM=IGYCRCTL,REGION=&CREGION,  
//             PARM='&CPARM'

第三步:在实际步骤之后,使用“PEND”语句结束你的“PROC”。
例如,在列出所有变量和编译步骤(编译器名称、编译器位置以及在PEND语句之前可以看到的SYSUT1-SYSUT7语句)之后,放置你的PEND关键字。
//SYSUT7   DD UNIT=DISK,SPACE=(CYL,(1,1))  
//         PEND

步骤4:在您的源文件中添加任何额外的JCL步骤和/或代码,然后就可以开始了!

注意事项:

- 您可以在单个JCL文件中拥有多个PROC语句。我有三个:一个用于COBOL编译,一个用于链接编辑器和一个用于程序提取。我还在同一文件中放置了COBOL代码。

- 这是在运行z / OS的IBM Mainframe上进行的。

- 在上面可以看到,我的“CPARM”变量设置为默认值'TEST,APOST'。通过简单地将字段留空(例如CPARM=,),可以使变量默认为空。

- 您可能已经注意到,在CPARM定义之后,有一个逗号;这是因为我在它之后有更多的变量。请记住,对于任何给定的PROC,您创建的最后一个符号参数不应该跟随任何内容(即没有逗号)。当然,您可以在同一行上放置注释行(//*),另一个PROC或实际代码,但是最后一个符号参数应该在其后没有任何内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接