了解以下控制卡

Understand the following control cards

我有以下控制卡,我看不懂怎么读。有人可以帮我解释一下 JOB 的这一部分在做什么吗?

 OUTFIL  FNAMES=(XSCB),BLKCCT1,INCLUDE=(67,7,CH,EQ,                            
                C'XSCB   ',OR,69,7,CH,EQ,                                       
                C'XSCB   '),                                                    
   HEADER2=(22:C'XSCB    MVS USERID SYSTEM USAGE REPORT',/,                     
            01:C'GENERATED ON ',&DATE=(MD4/),70:C'PAGE',&PAGE,/,                
            01:C'          AT ',&TIME,/,X,/,                                    
            01:C'JULIAN',/,                                                     
            01:C'DATE     TIME     SYSTEM JOB      MESSAGE',/,                  
            01:C'-------- -------- ------ -------- ---------------->'),         
   TRAILER1=(X,/,01:C'RECORDS FOUND =',COUNT,/,34:C'END OF REPORT'),            
     OUTREC=(20,07,ZD,EDIT=(TTTT.TTT),X,                * JULIAN DATE           
             28,08,X,                                   * TIME                  
             11,06,X,                                   * SYSTEM                
             40,08,X,                                   * JOB OR REF            
             59,07,CHANGE=(50,C'IEF125I',C'LOGGED ON ', * MESSAGE               
                              C'IEF126I',C'LOGGED OFF'),                        
                  NOMATCH=(79,50),                                              
             132:X) 

我知道它在位置 67 或 69 中搜索 ID 'XSCB'。但是一旦找到它,我无法解释它接下来要做什么。

那些是排序控制卡。如果您查看该步骤的 SYSOUT,并注意消息,您将能够判断它是 DFSORT(以 ICE 为前缀的消息)还是 SyncSORT(以 WER 为前缀的消息)。

您的步骤可能是 EXEC PGM=SORT 或 ICEMAN 或其他内容,具体取决于您的站点。

控制卡正在生成报告。您的控制卡中至少缺少一行(OPTION COPY、或 SORT FIELDS=COPY 或不同的 SORT 或 MERGE 语句)。可能有任意数量的缺失卡片,并且您可能从该步骤获得另一个输出。否则 OUTFIL INCLUDE= 可能是一个普通的 INCLUDE COND=.

您所展示的内容实际上是做什么的?

OUTFIL 定义特定输出数据集的最终处理。如果没有名称,它将用于 JCL 中的 SORTOUT DD。

FNAMES=(XSCB) 用于 JCL 中名为 XSCB 的 DD。对于 FNAMES 中指定的单个名称,括号是多余的。

BLKCTT1 说 "put a blank in column one to not get a page-eject from TRAILER1 output"。

INCLUDE= 如您所料。测试相同值的两个不同起始位置。如果任一测试为真,则当前记录将包含在 OUTFIL 组中。

HEADER2 定义出现在每个页面顶部的内容。

01: 是列号,是多余的,因为默认情况下每行从第一列开始。

HEADER2 可以创建多行(任何 HEADERn 或 TRAILERn 和 BUILD(或 OUTREC,但不要将其用于新的)在 OUTFIL 上也可以),每行由“/”分隔。 &DATE、&TIME 和&PAGE 比较特殊,包含显而易见的内容。 &DATE可以有多种格式,MD4/是MM、DD、YYYY,中间用斜杠隔开。

X 是一个空白,单独占一行。您同样可以看到 .../,/... 或 n/ 来创建 n 个空行。

常数应该很明显。

TRAILER1 定义报告末尾打印的内容。

COUNT是OUTFIL组的记录数,这里使用不带格式,但可以带格式。

34:column-number表示后面的项目将从第34列开始。

OUTREC 最好拼写为 BUILD。 OUTREC 存在于其他地方。 BUILD 已经存在了 10 多年,因此无需在新代码中对 OUTFIL 使用 OUTREC(也许这无论如何都是旧的)。

BUILD 所做的是将当前输入记录格式化为报表输出行所需的格式。

成对的数字是字段的起始位置和长度。在没有定义字段类型的地方,它们被(视为)字符字段。

您有一种字段类型 ZD,它是分区十进制的。它的长度是七,并且使用了一个 EDIT 掩码,四位数字,句号(小数点),然后是三位数字。

之前的 X 是空白,在报告中用作分隔符。每个字段的内容都在注释中描述。注释是控制卡末尾之后的任何文本。控制卡在语句完成后以空白结束,或者在可能的延续(逗号或冒号是可能的延续)之后有空白的地方结束。

132:X 在第 132 列中放置一个空白,并用空白填充最后一个字段或常量之间的任何列。

剩下 CHANGE=.

CHANGE= 是一个非常有用的测试和替换。

79,50,CHANGE=(50,C'IEF125I',C'LOGGED ON ', * MESSAGE               
           C'IEF126I',C'LOGGED OFF'),                        
              NOMATCH=(79,50)

这表示“在正在创建的记录的当前列,考虑从位置 79 输入的内容,长度为 50。输出长度将为 50。如果 IEF125I,则使用常量 LOGGED ON,如果 IEF126I 使用 LOGGED OFF,否则 (NOMATCH) 使用位置 79 的任何内容,从输入开始长度为 50。

基本上,该报告使用系统日志或其中的摘录来报告与 Userid/Logon XSCB 相关的 activity。