我正在开发一个程序,它将信息写入输出文件,并通过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
答案 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名称无关,那么查看被调用程序 - 它们必须 在那里。