当我想从cobol程序中显示ispf面板时出现错误rc = 20

时间:2019-03-03 03:09:03

标签: cobol jcl ispf

我想显示带有cobol程序的ispf面板。使用REXX很容易,没有问题,但是使用cobol不会显示面板。 当我提交jcl时,编译和链接步骤未给出任何错误,但是当它尝试运行错误时收到: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手册,错误为:ERROR。由于文件属性不一致,写入更新文件的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        

2 个答案:

答案 0 :(得分:5)

如果要使用ISPLINK之类的ISPF服务,则必须在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主菜单上。您可以使用它来测试您的面板。

答案 1 :(得分:3)

我同意Bruce和cschneid所说的话。您不能使用JCL从COBOL pgm调用ISPF服务,除非JCL以批处理方式运行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”

通常,您不会像建议的那样通过批处理运行DISPLAY服务。可以通过提供面板字段的所有值,然后使用CONTROL服务模拟ENTER或END来完成此操作,但是如果不小心,很容易进入DISPLAY循环。