JCL如何将PRTOUTA,......等链接到Cobol程序?

时间:2014-01-14 16:51:05

标签: cobol jcl

我正在开发一个程序,它将信息写入输出文件,并通过PRTRTENO程序将信息写入PRTOUTA,PRTOUTB,PRTOUTC。您必须将变量移动到PRINT-AREA等等。

我确信这与PRTRTENO有关,但我并不完全确定

的Cobol:

 PRINT-B.                              
    DISPLAY 'PRINT-B SECTION'         
    MOVE 'B' TO RPT.                  
    CALL 'PRTRTENO' USING PRINT-AREA. 
 PRINT-B-X. EXIT.                      

Cobol Call:

 MOVE TEST-LINE TO PRINT-AREA. PERFORM PRINT-B.   

更多Cobol:

PAGE-TOPA.                           
    MOVE 'P' TO CTL.                 
PRINT-A.                             
    MOVE 'A' TO RPT.    <-- Is it here that determines the JCL printout.             
    CALL 'PRTRTENO' USING PRINT-AREA.
    IF CTL = '*'                     
       PERFORM HEAD-A THRU HEAD-A-X  
    END-IF.                          
HEAD-A.                              
  ...etc... //code here
HEAD-A-X.

JCL:

//OUTPUT1   DD  DSN=Test-File-Name-Goes-Here,DISP=(,CATLG),         
//          DCB=TS20.FB0080.MODEL,MGMTCLAS=TDML1   --EMAIL     
//PRTOUTA   DD  SYSOUT=1,DCB=TS20.FBM0133.MODEL    --EOS       
//PRTOUTB   DD  SYSOUT=1,DCB=TS20.FBM0133.MODEL    --LABELS    
//PRTOUTC   DD  SYSOUT=1,DCB=TS20.FBM0133.MODEL    --NO EMAIL  

2 个答案:

答案 0 :(得分:4)

我不希望你的程序中的DDNAMES有SELECT / ASSIGN / FD。使用子程序的一个原因是避免1,000个报告程序与1,000个相同(或几乎相同)的SELECT / ASSIGN / FD,以及随之而来的所有IO和检查以及页面大小等。

他们将在CALLed程序中,或者它依次调用的程序。一路上,DDNAMES很可能是“动态”分配的,或者至少一个程序询问JCL中是否存在DDNAME,并且只有DDNAME才会存在(显然很难知道如果不能访问代码)。

我认为实际的IO很可能是在Assembler子例程中完成的。可以在COBOL中执行此操作,但这取决于原始程序的年龄。

你有一个本地编写的节目,PRTRTENO。该程序由您的程序调用。 PRTRTENO直接或通过CALLing其他程序支持具有不同特征的不同类型的“报告”输出。

报告制作程序往往会有大量重复的代码(处理标题,新页面,标准列表报告,标签,字母等),这些代码可能过于复杂(通过源的大小),包含细微差别,要求对许多程序进行更改以提供一般维护等。

通过使用像PRTRTENO这样的子程序,可以解决其中的一些问题。标准的公司范围标题,标题和报告结束,输出路由信息,特殊信纸(和非文具,如您的电子邮件)等可以集中在一个程序中,提供许多好处。

在子程序可以同时处理多个输出的情况下,需要一个参数来指示哪些打印行属于哪个逻辑报告。这是输出中的A,B,C设置,子程序(或它使用的东西)将使用此输出将输出映射到JCL中的DDNAME。

如果你问同事,你应该能够看一下PRTRTENO的来源,看看它到底发生了什么,以及它是如何做到的。它或它的组件将是一个相当大的程序,否则你的程序必须包含类似于PRTRTENO的代码来执行打印输出。

有些网站是这样做的,有些则没有。在其他站点,您将拥有所有OPEN / WRITE / CLOSE,计数行,将标题放在正确的位置等,并在每个程序中编码。

答案 1 :(得分:4)

通过程序的ENVIRONMENT DIVISION中的FILE-CONTROL段落使COBOL程序知道文件。 FILE-CONTROL段落看起来像:

 FILE-CONTROL.
     SELECT PRT-FILE       <-- Name in FD SECTION
     ASSIGN TO PRTOUTA     <-- JCL DD Name
     ...

然后在DATA DIVISION中使用FD将记录缓冲区与FILE-CONTROL中的SELECTed文件相关联。当您对相关缓冲区进行READ / WRITE时,记录将从您的程序传输到指定文件。 FD将从以下开始:

 FD PRT-FILE  <-- same as SELECT from FILE-CONTROL
 ...

除此之外,事情会变得有点复杂,因为你的程序不是直接写入这些文件,而是直接写入 一个叫做程序('PRTRTENO')。上述文件定义可能出现在您的程序或被调用程序中。在任何一种情况下,它们都可能被声明为EXTERNAL,使它们可以在您的运行单元中的任何位置使用。

我打赌你会在被叫程序中找到它们作为EXTERNAL。所以要回答你的问题,你需要寻找FILE-CONTROL 段和FD在你的程序中。如果它们与JCL DD名称无关,那么查看被调用程序 - 它们必须 在那里。