DFHJUP 的控制语句和返回码

可以使用控制语句 CONTROL , OPTION 和 END 来指导 DFHJUP 完成处理阶段。

使用 END 语句作为定界符,将一组测试 (包含一个或多个 OPTION 语句) 与下一个数据集上的后续测试组分开。 当在控制输入流中迂到 END 语句时,记录选择参数的构造停止,输入数据记录的处理开始。 正确使用 END 语句允许实用程序的一次执行对一个或多个 CICS® 日志数据集执行各种数量的测试。

可以使用语句 * 或 COMMENTS 来提供输出列表上的标题或注释。 使用它来包含您认为有助于识别测试或数据的任何信息。 它对实用程序没有影响。

每个完整关键字都有相应的缩写形式可供您使用。

可以在下一条记录上继续 DFHJUP 语句的关键字操作数 (最多 9 条记录) ,前提是您在位置 72 中编码一个非空白字符,然后继续下一条语句的第 16 列中的操作数。 如果语句不是先前语句的连续记录,那么该先前语句的第 72 列中的字符必须为空白。

CONTROL 语句

1         10       16

CONTROL   CNTL     [{SKIP|K}={0|number}]
                   [,{STOPAFT|H}={EOF|number|(number,E)}]
                   [,{DDNAME|D}={SYSUT1|ddname}]
                   [,{DDNOUT|O}={SYSUT4|ddname}]

CONTROL 语句是可选的,如果缺省操作数值令人满意,那么可以将其省略。 它定义要用于输入和输出数据集的 ddname 以及要扫描的数据集的开始和结束限制。 如果未指定此语句,那么 DFHJUP 缺省为读取 SYSUT1 DD 语句中指定的输入文件。 仅当您在当前测试组中指定 OPTION COPY 函数并对 COND=E 参数进行编码时,才会打开 SYSUT4 DD 语句上定义的可选输出数据集。

SKIP= 或 K=
定义测试的第一个记录。 将忽略所有先前记录。 如果未指定此关键字,那么将使用缺省值零,并导致测试输入文件上的第一个记录。
必须在范围 0 到 999999 中指定,并且不能具有嵌入式逗号。
STOPAFT = 或 H=
定义要测试的最后一条记录。 当通过对已处理的记录进行计数来达到此值时,将终止当前测试组。 如果未指定此关键字,那么将采用 EOF 的缺省值。
必须在 0 到 9999999 范围内指定,并且不使用嵌入式逗号。

如果指定值为零,那么将处理一条记录。

EOF
表示文件结束条件; 允许记录处理超过规定的最大记录数 99999999。
E
仅当记录满足选择标准时,才会计入测试序列终止。 否则,将对读取的所有记录 (在 SKIP 值之后) 进行计数。
DDNAME= 或 D=
标识当前测试组的输入数据集的 ddname。

如果未对此关键字进行编码,那么将使用缺省 ddname SYSUT1 ,并且必须在作业流中包含 SYSUT1 DD 语句。 如果对此参数进行编码以指定其他 ddname ,那么作业流必须包含相应的 DD 语句。

DDNOUT = 或 O=
标识当前测试组的可选输出数据集的 ddname。

此关键字与 OPTION COPY 函数结合使用,如果要使用除缺省值 SYSUT4以外的 ddname ,那么仅需要对此参数进行编码。 编码 DDNOUT 或在 DFHJUP 作业流中存在 SYSUT4 不会导致使用此数据集。 仅当使用 COND=E 指定 OPTION COPY 时,才会使用输出数据集。

OPTION 语句

OPTION 语句定义要对候选记录的数据执行的测试或一系列测试,以确定是否已选择该测试。 每个 OPTION 语句都构造一组测试。 您可以在任何组合中指定一个或多个 OPTION 语句,以更紧密地定义要对每个输入记录执行的选择标准和输出处理。 如果省略所有关键字操作数 (EXITR 和 DDNAME 除外) ,那么 DFHJUP 的阶段 2 处理的所有记录要么写入 SYSPRINT 数据集,要么复制到指定的输出数据集。

通过对相应数目的 OPTION 语句进行编码,创建逻辑 OR 函数,可以对每个逻辑记录执行一个或多个测试。 您可以使用 COND 操作数的多字段测试功能和相应的 OPTION 语句来分析具有逻辑 AND 函数的记录,从而创建测试序列。 使用操作数 COND=M 和 COND=E 分别表示记录的多字段测试序列的开始和结束。

每个 OPTION 语句都有自己的输出处理缺省值。 如果使用多个 OPTION 语句来创建多字段测试序列,那么最终输出处理由 OPTION 语句及其与 COND=E 关键字一起定义的关联关键字确定。

1         10       16

OPTION    {PRINT|  [{OFFSET|O}={1|number}]
           COPY|   
           NEGOF}  [,{FLDTYP|T}={X|C}]
                   [,{VALUE|V}=string]
                   [,{FLDLEN|L}={1|number}]
                   [,{COND|C}={E|M|T{Y|N}|ET{Y|N}|MT{Y|N}}]
                   [,{EXITR|E}=name]
                   [,{DDNAME|D}={TRCPUNCH | ddname}]
                   [,{PRTSYS|P}={N|Y}]
                   [,NEWDCB]
每个选项都有两个不同的函数:
  1. 确定 OFFSET 关键字的起始位置
  2. 确定要执行的输出处理。

如果组合各个选项以形成多字段测试,那么 OFFSET 的使用保持不变; 但是,输出处理由使用 COND=E 关键字编码的选项确定。

PRINT
导致在 SYSPRINT 数据集上显示所有所选记录。
COPY
导致将所有选定记录传输到指定的输出数据集。 还可以通过对 PRTSYS 关键字进行编码来将这些记录写入 SYSPRINT 数据集。
NEGOF
使 OFFSET 关键字值用作日志记录末尾的负偏移量。 使用此函数选择的所有记录都显示在 SYSPRINT 数据集中。

下列所有 OPTION 控制语句关键字都是可选的:

OFFSET = 或 O=
定义要测试的字段的第一个字节的记录中的位置。 缺省值为记录的位置 1。
可以在从 1 到 (包括) 被测试记录的长度的范围内。 最大值为 32767 字节,不执行检查以确定是否超出逻辑记录长度。
注: 如果 DSECT 用于查找控制记录或块中的值,那么必须调整 OFFSET 参数的起始值。 大多数 DSECT 以相对值零开头,而 OFFSET 关键字中指定的值始终表示为相对于字节 1。
FLDTYP= 或 T =
定义 VALUE=field 中的数据类型。
X
要作为十六进制对处理的数据。 测试数据已打包 (2 字节到 1 中以形成十六进制等效项)。 这是缺省值。

示例: 如果使用 FLDTYP=X 参数指定 VALUE=D9D6D6E3E2C5C7 (14 字节) ,那么生成的 VALUE= 如下所示 :ROOTSEG (EBCDIC 字符) 或 D9D6D6E3E2C5C7 (十六进制); 在任一情况下,长度仅为 7 字节。

C
要作为 EBCDIC 字符处理的数据。 DFHJUP 使用 OPTION 语句中编码的数据,而不进行更改。
VALUE= 或 V=
定义组成测试字段的字符。 如果指定 FLDTYPE=X ,那么必须以十六进制字符对形式输入此数据。 对于 "在掩码下的测试" 条件,单个对必须表示测试的十六进制值。 如果指定 FLDTYP=C,则必须以 EBCDIC 字符输入值数据。 但是,如果要在数值中包含空格或逗号,则必须指定FLDTYP=X,并将数值操作数编码为十六进制字符,根据需要使用 X'40' 表示空格, X'6B' 表示逗号。
字符串(string)
不能超过 255 EBCDIC 或 510 十六进制字符。 此字段的长度由 FLDLEN= 关键字的值设置,而不是由此字段中的非空字符数设置。
FLDLEN= 或 L=
定义要在测试字段中使用的字符数。
表示要使用的实际字节数,而不是 VALUE= 关键字中指定的字符数。 此字段的可接受值范围从 1 到 255 (包括 255)。 缺省值为 1。
COND= 或 C=
定义测试类型及其与组中其他测试的关系。 如果未指定此关键字,那么缺省值为 COND=E。
E
标记测试序列中的最后一个 (或唯一) 元素。 在此之后出现的任何 OPTION 控制语句将形成一系列新的测试。 对 E 进行编码以终止测试序列允许 DFHJUP 对每个记录执行各种测试,并且每个测试序列可以在记录中的不同字段上使用。 最终输出处理由使用此关键字值定义的 OPTION 函数确定。
M
指示这是多字段测试。 即,要对每个输入记录进行多个测试。 必须满足此序列中的所有测试才能开始记录选择和输出处理。
T
使 VALUE= 字节用作测试下掩码值,而不是用作比较字段。 仅使用 VALUE= 字段的第一个字节 (两个十六进制字符 (如果 FLDTYP=X))。 如果使用 FLDTYP=C ,那么 EBCDIC 字符的十六进制等效项是测试值。 如果编码 COND=T ,那么不得指定 FLDLEN= 关键字,并且 DFHJUP 假定缺省长度为 1。
Y
指示为使掩码下的测试被视为满足,在测试字节的每个相应位的记录测试字段中必须有一个位。 这等同于分支 if-ones 检验。
N
指示对于要视为满足的掩码下的测试,对于测试字节的任何相应位,记录测试字段中不得有位。 这等同于分支 if-zeros 检验。
MT
定义了T选项中描述的带口罩测试选项,但具有M选项中描述的多领域测试属性。 由于 T 参数导致 FLDLEN 缺省为 1 ,因此 MT 参数必须用于以测试下掩码值开头的多字段测试。
ET
表示多字段测试序列以测试下的掩码条件结束。
EXITR = 或 E=
指定当候选记录满足当前测试的所有选择标准时要对其进行控制的出口例程的入口点名称。

如果多个测试组指定了相同的出口例程,那么 DFHJUP 会尝试将该例程装入到每个组的存储器中; 因此,应该可重新输入该例程。 当在输入时到达文件末尾时,将对出口例程进行最终调用。 您可以通过在参数字段中查找零来确定是否已到达文件末尾。

出口例程的接口如下所示:

条目:
  • 寄存器
  • R1 包含指向参数列表的指针。
  • R13 指向空的保存区域。
  • R14 包含返回地址。
  • R15 包含出口例程入口地址。
  • PARMLIST
  • 参数列表由 2 个词组成。 第一个是指向候选记录的指针; 第二个 (高序位开启) 是指向 SYSPRINT 数据集 DCB 的指针。
退出:
  • 从出口例程返回时,寄存器 15 的内容确定是否继续处理此记录。
  • 非零值指示将不会对此记录执行进一步的处理,并且选择测试将针对下一个输入记录重新开始。
  • 零值指示此记录是必需的,现在输出处理由包含 COND=E 关键字的最后一个 OPTION 语句确定。
  • 如果省略了 EXITR 关键字,那么将继续处理,就像接收到返回码值 0 一样。
DDNAME= 或 D=
定义 DL/I 调用跟踪日志记录检索例程所使用的输出数据集,无论何时将其指定为用户出口例程。 必须提供相应的 DD 语句。
PRTSYS= 或 P=
确定是否打印 SYSPRINT 数据集上的所有选定记录。
N
指示不打印所选记录。
Y
指示传输到输出数据集的所有记录也将进行格式化和打印。

此关键字只能与 OPTION COPY 函数配合使用。 N 是缺省值。

新DCB
要忽略原始数据集中的 DCB 信息,请在使用 COPY 函数时指定 NEWDCB。 为输出数据集提供有关 JCL 的新 DCB 信息。 您可以使用此过程从日志流以 COMPAT41 方式创建输出数据集。 您可以在 JCL 上指定输出数据集将采用可变分块格式。 当输入日志数据尚未转换为 COMPAT41 格式时,您可能想要使用 NEWDCB 来指定输出数据集属性。 使用 NEWDCB 将数据复制到 BSAM 数据集意味着数据必须符合各种访问方法限制和要求。 例如,BSAM数据不能超过32 KB。 此外,复制到使用 NEWDCB 的变量或被阻塞的变量数据集 (recfm=V 或 recfm = VB) 的数据要求数据采用可变格式。 这意味着如果在具有 NEWDCB 的复制步骤上使用了 S002 ,那么较新的日志记录格式将导致 DFHJUP 失败,因为输入数据的格式不可变,因为其记录未以 LLBB 全字开头。

如果要对 COMPAT41 格式的输入数据使用 NEWDCB ,那么可以向 DFHJUP 定义出口程序,该出口程序修改记录的格式以将 LLBB 值置于开头。 这样做允许使用 NEWDCB 将数据复制到不同的记录格式。

可以使用以下示例出口程序来实现此结果。 程序将修改每条记录的第一个字,以将其替换为 LLBB 字段,并避免返回 CICS 块头记录,因为这些记录供 CICS内部使用。 使用 EXITR= 或 E=OPTION 语句向 DFHJUP 定义出口程序。

      ****************************************************************
      *                                                              *
      * MODULE NAME = JUPEXIT                                        *
      *                                                              *
      * DESCRIPTIVE NAME = Sample exit program for DFHJUP            *
   .
   .
   .
      *                                                              *
      * Provide a sample exit routine for DFHJUP, to parse log       *
      * records and reject block header records. Adjust remaining    *
      * records to have an LLBB at their start. This means that      *
      * the remaining CICS TS log records returned by DFHJUP are     *
      * in RECFM=VB format, and so are eligible for blocking by      *
      * BSAM if COPY is used with a NEWDCB for the output data set.   *
      ****************************************************************
               DFHREGS                      Establish register equates
      JUPEXIT  CSECT
               STM   R14,R12,12(R13)        Save the registers
               BASR  R3,0                   Establish base register
               USING *,R3                   Tell the assembler
               ICM   R4,15,0(R1)            Address record
               BZ    EOF                    If plist empty then eof
               CLC   0(0,R4),=CL4'>DFH'     Test for block hdr record
               BE    EXITREJ                If so, reject record
               L     R5,0(,R4)              Pick up record length
               SLL   R5,16                  Convert to LLBB format
               ST    R5,0(,R4)              Store back at start
      *        WTO   'DFHJUP EXIT RAN'      Diagnostic message
               B     EXIT                   Leave the program
      EOF      DS    0H
      *        WTO   'EOF ENCOUNTERED'      Diagnostic message
      EXIT     DS    0H
               LM    R14,R12,12(R13)        Restore the registers
               SR    R15,R15                Set a good return code
               BR    R14                    Return to DFHJUP
      EXITREJ  DS    0H
               LM    R14,R12,12(R13)        Restore the registers
               LA    R15,1                  Set a bad rc (no base)
               BR    R14                    Return to DFHJUP
               DROP  R3                     Tell the assembler
               LTORG                        Define the literal pool
               END
 

END 语句

当您为当前输入文件定义了所有测试时,请使用 END 语句来启动测试。

位置 10 和向上可用于注释。

1         10       16

END       [.....comments....]

COMMENTS 语句

COMMENTS 语句是可选的。 如果使用,它将导致内容显示在 SYSPRINT 数据集中。

1         10       16

*

DFHJUP 返回码

DFHJUP 中可能发生以下错误:
04
由于以下任何原因,可以发出此返回码:
  • 在 SYSIN 记录中检测到语法错误
  • 在 OPTION 语句中检测到语法错误
  • SYSIN 语句类型未知
  • 在 SYSUT1 或 SYSUT4上发生了 OPEN 故障。
08
在 SYSUT1 或 SYSUT4上发生了 I/O 错误。
16
SYSIN 或 SYSPRINT 未能打开。