尝试在 COBOL 中打开输出数据集时出现错误 IGZ0035S

Posted

技术标签:

【中文标题】尝试在 COBOL 中打开输出数据集时出现错误 IGZ0035S【英文标题】:Error IGZ0035S when attempting to open an output dataset in COBOL 【发布时间】:2021-09-07 06:53:42 【问题描述】:

我在输出中创建了两个数据集PRT-DONEPRT-LINE。但是当我提交作业时,它显示PRT-DONE 输出打开失败; PRT-LINE 工作正常。

我认为它无法打开数据集PRT-DONE。看起来像输出 PRTDONE 的打开错误。当我删除那个 open 语句时,只有条件代码错误。

错误: IGZ0035S 在相对位置 X'318' 的程序 ADDONE 中打开或关闭文件 PRTDONE 不成功。

       IDENTIFICATION DIVISION.
       PROGRAM-ID.    ADDONE.
       AUTHOR.        STUDENT.
      *
       ENVIRONMENT DIVISION.
      *
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT PRT-LINE ASSIGN TO PRTLINE.
           SELECT PRT-DONE ASSIGN TO PRTDONE.

       DATA DIVISION.
       FILE SECTION.
       FD  PRT-LINE RECORD CONTAINS 80 CHARACTERS RECORDING MODE F.
       01  PRT-REC        PIC X(80) VALUE SPACES.

       FD  PRT-DONE RECORD CONTAINS 80 CHARACTERS RECORDING MODE F.
       01  PRT-REC-DONE.
           05  PRT-DATE     PIC X(8)  VALUE SPACES.
           05  FILLER       PIC X(1)  VALUE SPACES.
           05  PRT-TIME     PIC X(4)  VALUE SPACES.
           05  FILLER       PIC X(2)  VALUE SPACES.
           05  PRT-COMMENT  PIC X(27) VALUE SPACES.
           05  FILLER       PIC X(2)  VALUE SPACES.
           05  PRT-MY-NAME  PIC X(36) VALUE SPACES.

       WORKING-STORAGE SECTION.

       01  PGM-VARIABLES.
           05  PGM-COUNT    PIC 9(05).

       01  YYYYMMDD         PIC 9(8).

       01  INTEGER-FORM     PIC S9(9).

       01  REFMOD-TIME-ITEM PIC X(8).

      ****************************************************************
      *                  PROCEDURE DIVISION                          *
      ****************************************************************
       PROCEDURE DIVISION.
      *
       A000-START.
           OPEN OUTPUT PRT-LINE.
           PERFORM A000-COUNT 10 TIMES.
           PERFORM A000-DONE.
           CLOSE   PRT-LINE.
           STOP RUN.
      *
       A000-COUNT.
           ADD 1 TO PGM-COUNT.
      *    DISPLAY PGM-COUNT.
           WRITE PRT-REC FROM  PGM-COUNT.
      *
       A000-DONE.
           OPEN OUTPUT PRT-DONE.
           MOVE SPACES TO PRT-REC-DONE.
           ACCEPT REFMOD-TIME-ITEM FROM TIME.
           MOVE FUNCTION CURRENT-DATE(1:8) TO YYYYMMDD.
           MOVE YYYYMMDD         TO PRT-DATE.
           MOVE REFMOD-TIME-ITEM (1:4) TO PRT-TIME.
           MOVE "My first z/OS COBOL program" TO PRT-COMMENT.
           WRITE PRT-REC-DONE.
           CLOSE PRT-DONE.

JCL:

//ADD1JCL  JOB 1,NOTIFY=&SYSUID
//*****************/
//COBRUN  EXEC IGYWCL
//COBOL.SYSIN  DD DSN=&SYSUID..SOURCE(ADD1CBL),DISP=SHR
//LKED.SYSLMOD DD DSN=&SYSUID..LOAD(ADD1CBL),DISP=SHR
//*****************/
// IF RC = 0 THEN
//*****************/
//RUN     EXEC PGM=ADD1CBL
//STEPLIB   DD DSN=&SYSUID..LOAD,DISP=SHR
//PRTDONE   DD  DSN=Z12441.OUTPUT(PRTDONE),DISP=SHR,OUTLIM=15000
//PRTLINE   DD  DSN=Z12441.OUTPUT(PRTLINE),DISP=SHR,OUTLIM=15000
//SYSOUT    DD SYSOUT=*,OUTLIM=15000
//CEEDUMP   DD DUMMY
//SYSUDUMP  DD DUMMY
//*****************/
// ELSE
// ENDIF

【问题讨论】:

//ADD1JCL JOB 1,NOTIFY=&SYSUID //*****************/ //COBRUN EXEC IGYWCL //COBOL.SYSIN DD DSN= &SYSUID..SOURCE(ADD1CBL),DISP=SHR //LKED.SYSLMOD DD DSN=&SYSUID..LOAD(ADD1CBL),DISP=SHR //*****************/ // IF RC = 0 THEN //**********************/ //RUN EXEC PGM=ADD1CBL //STEPLIB DD DSN=&SYSUID..LOAD,DISP=SHR // PRTDONE DD DSN=Z12441.OUTPUT(PRTDONE),DISP=SHR,OUTLIM=15000 //PRTLINE DD DSN=Z12441.OUTPUT(PRTLINE),DISP=SHR,OUTLIM=15000 //SYSOUT DD SYSOUT=*,OUTLIM=15000 / /CEEDUMP DD DUMMY //SYSUDUMP DD DUMMY //**********************/ // ELSE // ENDIF IGZ0035S 在相对位置 X'318' 的程序 ADDONE 中打开或关闭文件 PRTDONE 不成功。这是错误 注意OUTLIM= DD 语句参数只对SYSOUT 语句有意义,即//ANYDD DD SYSOUT=*,OUTLIM=123。系统可能不接受非 SYSOUT DD 语句中的该参数。不过,这将是 JCL 错误,而不是“异常结束”错误。 我已经编辑了代码并添加了jcl代码请检查。 【参考方案1】:

我假设您的输出数据集Z12441.OUTPUT 的类型是 PDS 而不是 PDS/E。您正在尝试并行写入同一 PDS 中的两个成员,这是不受支持的。在您的作业输出中,您可能会看到一条消息 IEC143I 213-30,...。其中213 是指向OPEN 服务问题的ABEND 代码,30 是返回代码。消息IEC143I的解释可以在这里找到Message description。原因码 30 sais 的解释:

尝试打开 OUTPUT,DISP=SHR 的分区数据集 (PDS)。在这种情况下,PDS 已经打开,并且 DCB 已经打开以输出到数据集。数据集可能位于同一系统上,也可能位于共享该卷的另一个系统上。在尝试打开数据集之前访问未序列化。

您需要分配两个不同的输出数据集,一个用于PRTDONE,一个用于PRTLINE。同一 PDS 的两个成员不是两个不同的数据集。

注意 PDS/E 数据集允许多个并发打开以输出到不同的成员,但有一些限制。我建议不要习惯于同时打开同一 PDS 或 PDS/E 的多个成员输出。宁可使用 PS 数据集而不是 PDS 成员进行输出。一个原因是作业的可重新启动性。使用 PS 数据集,您可以简单地在作业中删除和重新分配数据集,然后重新运行作业。处理 PDS 成员的可重启性更为复杂。

【讨论】:

但是如何在ibm大型机中创建PS数据集,因为PDS和SDS选项只能创建。 请您为此提出另一个单独的问题,以便我(我们)可以写出与该问题相关的答案。我宁愿不在这里添加它。 当我这样做时解决了这个问题。谢谢。

以上是关于尝试在 COBOL 中打开输出数据集时出现错误 IGZ0035S的主要内容,如果未能解决你的问题,请参考以下文章

scanf 调用时出现“无法打开输出文件”错误

访问存储的 Proc 输出参数时出现间歇性空引用错误

在自定义数据集上微调 MobileNet 时出现形状错误

COBOL - 打开具有相对和动态选项的顺序数据集时的文件状态 37

在 AS400 上通过 Java 流式传输运行时进程执行(cobol obj)的结果时出现 MalformedInputException

导入数据集时出现问题:`扫描错误(...):第 1 行没有 145 个元素`