尝试在 COBOL 中打开输出数据集时出现错误 IGZ0035S
Posted
技术标签:
【中文标题】尝试在 COBOL 中打开输出数据集时出现错误 IGZ0035S【英文标题】:Error IGZ0035S when attempting to open an output dataset in COBOL 【发布时间】:2021-09-07 06:53:42 【问题描述】:我在输出中创建了两个数据集PRT-DONE
和PRT-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的主要内容,如果未能解决你的问题,请参考以下文章
COBOL - 打开具有相对和动态选项的顺序数据集时的文件状态 37
在 AS400 上通过 Java 流式传输运行时进程执行(cobol obj)的结果时出现 MalformedInputException