如何让Cobol DISPLAY在JCL中工作,以便我可以看到输出消息将它们用作调试?

时间:2014-03-06 16:21:09

标签: cobol

我正在研究Cobol程序并需要DISPLAY来打印消息,以便在运行程序时可以看到它们。我以为是用SYSOUC编写这种类型的Cobol消息,但我不能让它显示它应该是这样我可以查看它,只看到显示或至少这是我的想法。

问题:如何让Cobol中的DISPLAY显示消息?

//STEP2      EXEC PGM=MyProgram,REGION=32M,COND=(0,NE)          
//STEPLIB     DD DSN=MyPrgram,DISP=SHR              
//SYSOUT      DD SYSOUT=1   --system messages                  
//SYSDBOUT    DD SYSOUT=1                                      
//SYSOUC      DD SYSOUT=3   --display                          
//SYSPRINT    DD SYSOUT=1                                      
//SYSUDUMP    DD SYSOUT=1                                      
//INPUT1      DD DSN=MyFile,DISP=SHR,BUFNO=30            
//INPUT2      DD DSN=CDP.PARMLIB(SomeParmCard),DISP=SHR            
//OUTPUT1     DD DSN=&&Temp,DISP=(,PASS),UNIT=SYSDA,            
//            DCB=aaaa.bbbb.MODEL,MGMTCLAS=TMM               
//PRTOUTA     DD SYSOUT=2,DCB=(BLKSIZE=0,LRECL=133,RECFM=FBM)  

1 个答案:

答案 0 :(得分:2)

默认情况下,从IBM的Enterprise COBOL,您的DISPLAY消息将转到//SYSOUT DD SYSOUT=whatyouneedatyoursite

您已将其标记为系统消息,但您应该在那里查看。使用一些实用程序(SORT就是一个很好的例子),它将包含产品的消息输出,但默认情况下不是COBOL的情况。

可以通过编译选项更改DISPLAY输出的位置:OUTDD(YOURDD)。如果输出不在SYSOUT上,请检查编译列表的开头是否有选项,看看是否正在使用OUTDD。

逻辑错误可能会确保您的DISPLAY语句不会被执行。

我建议将TIME =(,2)放在您的EXEC卡或JOB卡上。如果你碰巧得到一个循环,这将节省你。我今天仍然这样做(尽管比我刚开始时更少的循环...,更少,但如果它发生,它将节省一堆CPU)。你可能能够使用TIME =(,1),但有时候会在其黄金时段中关闭转储处理。

当想知道你在程序中放置的DISPLAY时,要检查的另一件事是你正在执行正确的程序版本。我觉得有用的一件事是:

01  W-WHEN-COMPILED             PIC X(8)BX(8).

MOVE WHEN-COMPILED              TO W-WHEN-COMPILED
DISPLAY "yourprogramname " W-WHEN-COMPILED

您在WORKING-STORAGE中执行01,在“仅运行一次”中执行MOVE和DISPLAY。然后在任何运行之后,你查看sysout并告诉你正在运行你编译的程序(或者你可以告诉你不是)。如果是您正在运行的日期/时间,则日期/时间应与最新编译列表中的日期/时间相同。多年来保存了我很多的时间。

有一个内在函数可以提供类似的输出,包括一个4位数的年份。这是两者之间的唯一区别。两者都在编译时完全解析,因此只要您只在程序的“只使用一次”部分执行它们,就不会对它们中的任何一个产生性能影响。有关WHEN-COMPILED和内在函数的文档,请参阅Enterprise COBOL语言参考,有关编译选项的文档,请参阅编程指南。