当我想显示来自 Cobol 程序的 ispf 面板时出现错误 rc=20
An error rc=20 when I want to show an ispf panel from a cobol program
我想用 cobol 程序显示一个 ispf 面板。使用 REXX 很容易,没有问题,但使用 cobol 时不显示面板。
当我提交 jcl 时,编译和 link 步骤没有给出任何错误,但是当它尝试 运行 时收到错误:MAXCC=0020。在我发现的 jesysmsg 中
...
IEF236I ALLOC. FOR CBLMINE STEP2
IGD103I SMS ALLOCATED TO DDNAME STEPLIB
IEF237I JES2 ALLOCATED TO SYSOUT
IEF237I DMY ALLOCATED TO CEEDUMP
IEF237I DMY ALLOCATED TO SYSUDUMP
IEF142I CBLMINE STEP2 - STEP WAS EXECUTED - COND CODE 0020
IGD104I Z30952.PATO RETAINED,DDNAME=STEPLIB
IEF285I Z30952.CBLMINE.JOB04408.D0000103.? SYSOUT
...
根据 IBM 手册,错误是:错误。 I/O 写入更新文件时出错,缺少 FILEDEF,或由于文件属性不一致而取消了 APNDUPD 进程选项。
任何实际帮助(请举例)?
使用 ispf 面板:
)ATTR DEFAULT(+_%)
% TYPE(TEXT) COLOR(PINK) INTENS(HIGH)
$ TYPE(INPUT) INTENS(HIGH) PAD(_)
! TYPE(INPUT) INTENS(LOW) PAD(' ')
)BODY
%-------------------- *TITLE FOR ENTRY PANEL* --------------------------
%COMMAND ===>_ZCMD
%
&ZUSER &ZTIME &ZSCREEN &ZWIDTH &ZUS4S7
+ THIS DIRECTION LINE TELLS THE USER HOW TO USE THE PANEL:
%XXXXX:_X %YYY:$YYY %ZZZ:$ZZ%AAAAAAAA:$AAAAAAAA +
)END
使用 cobol 程序:
IDENTIFICATION DIVISION.
PROGRAM-ID. CBLEX003
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 PST1 PIC X(6) VALUE 'LIBDEF'.
77 PST2 PIC X(7) VALUE 'ISPPLIB'.
77 PST3 PIC X(7) VALUE 'DATASET'.
77 PST4 PIC X(15) VALUE 'Z30952.MINE.GML'.
77 PST5 PIC X(16) VALUE 'DISPLAY PANEL01'.
77 ISPLINK PIC X(7) VALUE 'ISPLINK'.
PROCEDURE DIVISION.
CALL ISPLINK USING PST1 PST2 PST3 PST4.
CALL ISPLINK USING PST5.
STOP RUN.
有 jcl:
//CBLMINE JOB 1,NOTIFY=&SYSUID,MSGLEVEL=(1,1)
//SETVAR SET THEPGM=CBLEX003
//SETVAR SET WHERES=&SYSUID..MINE.GML
//SETVAR SET LINKRU=&SYSUID..PATO
//COBRUN EXEC IGYWCL
//COBOL.SYSIN DD DSN=&WHERES(&THEPGM),DISP=SHR
//LKED.SYSLMOD DD DSN=&LINKRU(&THEPGM),DISP=SHR
// IF RC = 0 THEN
//STEP2 EXEC PGM=&THEPGM
//STEPLIB DD DSN=&LINKRU,DISP=SHR
//SYSOUT DD SYSOUT=*,OUTLIM=15000
//CEEDUMP DD DUMMY
//SYSUDUMP DD DUMMY
// ELSE
// ENDIF
如果您想使用 ISPF 服务,如 ISPLINK,您必须在 ISPF 环境中执行。 IBM 的文档提供了一个示例 here,转载如下。
//USERAA JOB (AA04,BIN1,000000),'I. M. USERAA',
// CLASS=L,MSGCLASS=A,NOTIFY=USERAA,MSGLEVEL=(1,1)
//*-------------------------------------------------------*/
//* EXECUTE ISPF COMMAND IN THE BACKGROUND */
//*-------------------------------------------------------*/
//*
//ISPFBACK EXEC PGM=IKJEFT01,DYNAMNBR=25,REGION=1024K
//*- - ALLOCATE PROFILE, PANELS, MSGS, PROCS, AND TABLES -*/
//ISPPROF DD DSN=USERAA.ISPF.PROFILE,DISP=OLD
//ISPPLIB DD DSN=ISP.SISPPENU,DISP=SHR
//ISPMLIB DD DSN=ISP.SISPMENU,DISP=SHR
//ISPSLIB DD DSN=ISP.SISPSENU,DISP=SHR
// DD DSN=ISP.SISPSLIB,DISP=SHR
//ISPTLIB DD DSN=USERAA.ISPF.TABLES,DISP=SHR
// DD DSN=ISP.SISPTENU,DISP=SHR
// DD DSN=ISP.SISPTLIB,DISP=SHR
//ISPTABL DD DSN=USERAA.ISPF.TABLES,DISP=SHR
//*
//*- - ALLOCATE ISPF LOG DATA SET - - - - - - - - - - - -*/
//ISPLOG DD DSN=USERAA.ISPF.LOG,DISP=SHR
//*
//*- - ALLOCATE DIALOG PROGRAM AND TSO COMMAND LIBRARIES -*/
//ISPLLIB DD DSN=USERAA.ISPF.LOAD,DISP=SHR
//SYSEXEC DD DSN=ISP.SISPEXEC,DISP=SHR
//SYSPROC DD DSN=ISP.SISPCLIB,DISP=SHR
//*
//*- - ALLOCATE TSO BACKGROUND OUTPUT AND INPUT DS - - - -*/
//SYSTSPRT DD DSNAME=USERAA.ISPF.ISPFPRNT,DISP=SHR
//SYSTSIN DD *
PROFILE PREFIX(USERAA) /* ESTABLISH PREFIX */
ISPSTART CMD(%TBUPDATE) /* INVOKE CLIST DIALOG */
/*
您必须为您的商店提供有效的工作卡和正确的 ISPF 图书馆连接。此外,我相信您会使用 ISPSTART PGM(CBLEX003)
而不是 IBM 示例中用于启动 CLIST 的内容。
如果您不知道您商店的 ISPF 库串联,您可能可以从任何 ISPF 命令行的 ISRDDN 命令显示的内容中确定它们。
还有一个 ISPF 对话测试工具,通常位于 ISPF 主菜单上。您可以使用它来测试您的面板。
我同意 Bruce 和 cschneid 的说法。您不能使用 JCL 从 COBOL pgm 调用 ISPF 服务,除非 JCL 在批处理模式下 运行ning ISPF,如 cschneid 提供的示例所示。如果没有 ISPF 环境,ISPLINK 将设置 rc=20,因为它找不到 ISPF 环境。通过 ISPF 选项 7 测试您的程序或将 exec 写入 运行 它,您 LIBDEF ISPLLIB 指向包含链接的 COBOL pgm 的加载库。
地址 ISPEXEC
"LIBDEF ISPLLIB DATASET ID('userid.TEST.LOAD')"
"SELECT PGM(mycbl)"
"LIBDEF ISPLLIB"
您通常不会按照建议通过批处理 运行 显示服务。可以通过为面板字段提供所有值,然后使用 CONTROL 服务模拟 ENTER 或 END 来完成,但如果不小心,很容易进入 DISPLAY 循环。
我想用 cobol 程序显示一个 ispf 面板。使用 REXX 很容易,没有问题,但使用 cobol 时不显示面板。 当我提交 jcl 时,编译和 link 步骤没有给出任何错误,但是当它尝试 运行 时收到错误:MAXCC=0020。在我发现的 jesysmsg 中
...
IEF236I ALLOC. FOR CBLMINE STEP2
IGD103I SMS ALLOCATED TO DDNAME STEPLIB
IEF237I JES2 ALLOCATED TO SYSOUT
IEF237I DMY ALLOCATED TO CEEDUMP
IEF237I DMY ALLOCATED TO SYSUDUMP
IEF142I CBLMINE STEP2 - STEP WAS EXECUTED - COND CODE 0020
IGD104I Z30952.PATO RETAINED,DDNAME=STEPLIB
IEF285I Z30952.CBLMINE.JOB04408.D0000103.? SYSOUT
...
根据 IBM 手册,错误是:错误。 I/O 写入更新文件时出错,缺少 FILEDEF,或由于文件属性不一致而取消了 APNDUPD 进程选项。 任何实际帮助(请举例)?
使用 ispf 面板:
)ATTR DEFAULT(+_%)
% TYPE(TEXT) COLOR(PINK) INTENS(HIGH)
$ TYPE(INPUT) INTENS(HIGH) PAD(_)
! TYPE(INPUT) INTENS(LOW) PAD(' ')
)BODY
%-------------------- *TITLE FOR ENTRY PANEL* --------------------------
%COMMAND ===>_ZCMD
%
&ZUSER &ZTIME &ZSCREEN &ZWIDTH &ZUS4S7
+ THIS DIRECTION LINE TELLS THE USER HOW TO USE THE PANEL:
%XXXXX:_X %YYY:$YYY %ZZZ:$ZZ%AAAAAAAA:$AAAAAAAA +
)END
使用 cobol 程序:
IDENTIFICATION DIVISION.
PROGRAM-ID. CBLEX003
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 PST1 PIC X(6) VALUE 'LIBDEF'.
77 PST2 PIC X(7) VALUE 'ISPPLIB'.
77 PST3 PIC X(7) VALUE 'DATASET'.
77 PST4 PIC X(15) VALUE 'Z30952.MINE.GML'.
77 PST5 PIC X(16) VALUE 'DISPLAY PANEL01'.
77 ISPLINK PIC X(7) VALUE 'ISPLINK'.
PROCEDURE DIVISION.
CALL ISPLINK USING PST1 PST2 PST3 PST4.
CALL ISPLINK USING PST5.
STOP RUN.
有 jcl:
//CBLMINE JOB 1,NOTIFY=&SYSUID,MSGLEVEL=(1,1)
//SETVAR SET THEPGM=CBLEX003
//SETVAR SET WHERES=&SYSUID..MINE.GML
//SETVAR SET LINKRU=&SYSUID..PATO
//COBRUN EXEC IGYWCL
//COBOL.SYSIN DD DSN=&WHERES(&THEPGM),DISP=SHR
//LKED.SYSLMOD DD DSN=&LINKRU(&THEPGM),DISP=SHR
// IF RC = 0 THEN
//STEP2 EXEC PGM=&THEPGM
//STEPLIB DD DSN=&LINKRU,DISP=SHR
//SYSOUT DD SYSOUT=*,OUTLIM=15000
//CEEDUMP DD DUMMY
//SYSUDUMP DD DUMMY
// ELSE
// ENDIF
如果您想使用 ISPF 服务,如 ISPLINK,您必须在 ISPF 环境中执行。 IBM 的文档提供了一个示例 here,转载如下。
//USERAA JOB (AA04,BIN1,000000),'I. M. USERAA',
// CLASS=L,MSGCLASS=A,NOTIFY=USERAA,MSGLEVEL=(1,1)
//*-------------------------------------------------------*/
//* EXECUTE ISPF COMMAND IN THE BACKGROUND */
//*-------------------------------------------------------*/
//*
//ISPFBACK EXEC PGM=IKJEFT01,DYNAMNBR=25,REGION=1024K
//*- - ALLOCATE PROFILE, PANELS, MSGS, PROCS, AND TABLES -*/
//ISPPROF DD DSN=USERAA.ISPF.PROFILE,DISP=OLD
//ISPPLIB DD DSN=ISP.SISPPENU,DISP=SHR
//ISPMLIB DD DSN=ISP.SISPMENU,DISP=SHR
//ISPSLIB DD DSN=ISP.SISPSENU,DISP=SHR
// DD DSN=ISP.SISPSLIB,DISP=SHR
//ISPTLIB DD DSN=USERAA.ISPF.TABLES,DISP=SHR
// DD DSN=ISP.SISPTENU,DISP=SHR
// DD DSN=ISP.SISPTLIB,DISP=SHR
//ISPTABL DD DSN=USERAA.ISPF.TABLES,DISP=SHR
//*
//*- - ALLOCATE ISPF LOG DATA SET - - - - - - - - - - - -*/
//ISPLOG DD DSN=USERAA.ISPF.LOG,DISP=SHR
//*
//*- - ALLOCATE DIALOG PROGRAM AND TSO COMMAND LIBRARIES -*/
//ISPLLIB DD DSN=USERAA.ISPF.LOAD,DISP=SHR
//SYSEXEC DD DSN=ISP.SISPEXEC,DISP=SHR
//SYSPROC DD DSN=ISP.SISPCLIB,DISP=SHR
//*
//*- - ALLOCATE TSO BACKGROUND OUTPUT AND INPUT DS - - - -*/
//SYSTSPRT DD DSNAME=USERAA.ISPF.ISPFPRNT,DISP=SHR
//SYSTSIN DD *
PROFILE PREFIX(USERAA) /* ESTABLISH PREFIX */
ISPSTART CMD(%TBUPDATE) /* INVOKE CLIST DIALOG */
/*
您必须为您的商店提供有效的工作卡和正确的 ISPF 图书馆连接。此外,我相信您会使用 ISPSTART PGM(CBLEX003)
而不是 IBM 示例中用于启动 CLIST 的内容。
如果您不知道您商店的 ISPF 库串联,您可能可以从任何 ISPF 命令行的 ISRDDN 命令显示的内容中确定它们。
还有一个 ISPF 对话测试工具,通常位于 ISPF 主菜单上。您可以使用它来测试您的面板。
我同意 Bruce 和 cschneid 的说法。您不能使用 JCL 从 COBOL pgm 调用 ISPF 服务,除非 JCL 在批处理模式下 运行ning ISPF,如 cschneid 提供的示例所示。如果没有 ISPF 环境,ISPLINK 将设置 rc=20,因为它找不到 ISPF 环境。通过 ISPF 选项 7 测试您的程序或将 exec 写入 运行 它,您 LIBDEF ISPLLIB 指向包含链接的 COBOL pgm 的加载库。
地址 ISPEXEC
"LIBDEF ISPLLIB DATASET ID('userid.TEST.LOAD')"
"SELECT PGM(mycbl)"
"LIBDEF ISPLLIB"
您通常不会按照建议通过批处理 运行 显示服务。可以通过为面板字段提供所有值,然后使用 CONTROL 服务模拟 ENTER 或 END 来完成,但如果不小心,很容易进入 DISPLAY 循环。