如何从COBOL程序在SYSOUT假脱机中打印输出时纠正此逻辑错误?
这是cobol代码如何从COBOL程序在SYSOUT假脱机中打印输出时纠正此逻辑错误?,cobol,mainframe,jcl,gnucobol,cobol85,Cobol,Mainframe,Jcl,Gnucobol,Cobol85,这是cobol代码 *----------------------- IDENTIFICATION DIVISION. *----------------------- PROGRAM-ID. TOPACCTS AUTHOR. Otto B. Boolean. *-------------------- ENVIRONMENT DIVISION. *-------------
*-----------------------
IDENTIFICATION DIVISION.
*-----------------------
PROGRAM-ID. TOPACCTS
AUTHOR. Otto B. Boolean.
*--------------------
ENVIRONMENT DIVISION.
*--------------------
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PRINT-LINE ASSIGN TO PRTLINE.
SELECT CUST-RECS ASSIGN TO CUSTRECS.
*-------------
DATA DIVISION.
*-------------
FILE SECTION.
FD PRINT-LINE RECORDING MODE F.
01 PRINT-REC.
05 FILLER PIC X(02) VALUE SPACES.
05 LAST-NAME-O PIC X(25).
05 FILLER PIC X(02) VALUE SPACES.
05 ACCT-BALANCE-O PIC X(18).
05 FILLER PIC X(33) VALUE SPACES.
*
FD CUST-RECS RECORDING MODE F.
01 CUSTOMER-REC.
05 LAST-NAME PIC X(25).
05 FILLER PIC X(10) VALUE SPACES.
05 FIRST-NAME PIC X(15).
05 FILLER PIC X(10) VALUE SPACES.
05 ACCT-BALANCE PIC X(18).
05 FILLER PIC X(02) VALUE SPACES.
*
WORKING-STORAGE SECTION.
01 Filler.
05 LASTREC PIC X VALUE SPACE.
05 TOTL PIC 9(2) VALUE ZEROS.
05 SUB1 PIC 9(2) VALUE 01.
05 S PIC X(12) VALUE "8,500,000.00".
*
01 OVERLIMIT.
03 FILLER OCCURS 20 TIMES.
05 OL-ACCT-NO PIC X(8).
05 OL-ACCT-LIMIT PIC S9(7)V99 COMP-3.
05 OL-ACCT-BALANCE PIC S9(7)V99 COMP-3.
05 OL-LASTNAME PIC X(20).
05 OL-FIRSTNAME PIC X(15).
*
01 HEADER-1.
05 FILLER PIC X(20)
VALUE 'Financial Report for'.
05 FILLER PIC X(01) VALUE SPACES.
05 FILLER PIC X(14)
VALUE "Account holder".
05 FILLER PIC X(45) VALUE SPACES.
*
01 HEADER-2.
05 FILLER PIC X(05) VALUE 'Year '.
05 HDR-YR PIC 9(04).
05 FILLER PIC X(02) VALUE SPACES.
05 FILLER PIC X(06) VALUE 'Month '.
05 HDR-MO PIC X(02).
05 FILLER PIC X(02) VALUE SPACES.
05 FILLER PIC X(04) VALUE 'Day '.
05 HDR-DAY PIC X(02).
05 FILLER PIC X(56) VALUE SPACES.
*
01 HEADER-3.
05 FILLER PIC X(08) VALUE 'No.'.
05 FILLER PIC X(02) VALUE SPACES.
05 FILLER PIC X(10) VALUE 'Cust Name '.
05 FILLER PIC X(15) VALUE SPACES.
05 FILLER PIC X(08) VALUE 'Balance '.
05 FILLER PIC X(40) VALUE SPACES.
*
01 HEADER-4.
05 FILLER PIC X(08) VALUE '--------'.
05 FILLER PIC X(02) VALUE SPACES.
05 FILLER PIC X(10) VALUE '----------'.
05 FILLER PIC X(15) VALUE SPACES.
05 FILLER PIC X(10) VALUE '----------'.
05 FILLER PIC X(02) VALUE SPACES.
05 FILLER PIC X(13) VALUE '-------------'.
05 FILLER PIC X(40) VALUE SPACES.
*
01 WS-CURRENT-DATE-DATA.
05 WS-CURRENT-DATE.
10 WS-CURRENT-YEAR PIC 9(04).
10 WS-CURRENT-MONTH PIC 9(02).
10 WS-CURRENT-DAY PIC 9(02).
05 WS-CURRENT-TIME.
10 WS-CURRENT-HOURS PIC 9(02).
10 WS-CURRENT-MINUTE PIC 9(02).
10 WS-CURRENT-SECOND PIC 9(02).
10 WS-CURRENT-MILLISECONDS PIC 9(02).
*
*------------------
PROCEDURE DIVISION.
*------------------
OPEN-FILES.
OPEN INPUT CUST-RECS.
OPEN OUTPUT PRINT-LINE.
DISPLAY HEADER-1.
PERFORM WRITE-HEADERS.
DISPLAY 'PREPARED ON ' HDR-DAY '.' HDR-MO '.' HDR-YR.
DISPLAY '# OF RECORDS: ' TOTL.
DISPLAY '==========================================='.
PERFORM READ-NEXT-RECORD.
*
WRITE-HEADERS.
MOVE FUNCTION CURRENT-DATE TO WS-CURRENT-DATE-DATA.
MOVE WS-CURRENT-YEAR TO HDR-YR.
MOVE WS-CURRENT-MONTH TO HDR-MO.
MOVE WS-CURRENT-DAY TO HDR-DAY.
MOVE SPACES TO PRINT-REC.
WRITE PRINT-REC AFTER ADVANCING 1 LINES.
MOVE SPACES TO PRINT-REC.
*
*
READ-NEXT-RECORD.
PERFORM READ-RECORD
PERFORM UNTIL LASTREC = 'Y'
PERFORM THE-RICH
PERFORM WRITE-RECORD
PERFORM READ-RECORD
END-PERFORM.
EXIT.
*
*
READ-RECORD.
READ CUST-RECS
AT END MOVE 'Y' TO LASTREC
END-READ.
EXIT.
*
THE-RICH.
IF FUNCTION NUMVAL-C(S) < FUNCTION NUMVAL-C(ACCT-BALANCE)
THEN
DISPLAY LAST-NAME ACCT-BALANCE
MOVE ACCT-BALANCE TO ACCT-BALANCE-O
MOVE LAST-NAME TO LAST-NAME-O
ADD 1 TO SUB1
MOVE SUB1 TO TOTL
END-IF.
EXIT.
*
WRITE-RECORD.
MOVE ACCT-BALANCE TO ACCT-BALANCE-O.
MOVE LAST-NAME TO LAST-NAME-O.
* MOVE FIRST-NAME TO FIRST-NAME-O.
WRITE PRINT-REC.
EXIT.
*
如果您使用的是大型机COBOL编译器,请转到并选择您的版本。然后搜索“文件状态键”,查看文件状态46的含义 试图对输入中打开的文件执行顺序读取语句 或I-O模式,且未建立有效的下一条记录,因为:
- 前面的READ语句未成功,但未导致结束条件
- 前面的READ语句导致了结束条件
打开文件
段落中,您执行READ-NEXT-RECORD
,然后在到达文件末尾后进入代码的其余部分
您可能希望在第一段末尾有一个STOP RUN
或GOBACK
关于打印记录计数的编辑:确实没有一种好方法可以让记录计数显示在报告的顶部,因为在读取整个输入文件之前,您不知道记录计数,但您正在打印报告行。大多数时间控制总计(如记录计数)都是显示的(默认情况下会转到SYSOUT DD),而报告会转到文件控制中定义的不同DD(通过WRITE
,就像您正在做的那样)
关于打印记录计数的第二次编辑:@GilbertLeBlanc指出,在读取输入文件中的所有记录之前,您可以将输出行存储在表中。表中必须有足够的空间来处理所有的输出记录,有许多不同的方法可以做到这一点
- 您的表可以用一个足够大的
ocurses
子句静态定义,以处理您被告知的合理数量的记录。这曾经是非常常见的,并且会有代码来检查是否超过了合理的数字,如果超过了,则会异常终止
- 您的表可能会随短语的不同而出现,但会受到其限制,并且存储是由语句和语句管理的
- 您可以使用LE可调用服务进行自己的分配和重新分配,以及
Gilbert还指出,您可以读取文件两次,一次读取记录计数,然后关闭并重新打开以进行正常处理。只要你没有在JCL上做一些棘手的事情,比如
//TOPACCTS EXEC PGM=TOPACCTS
//SYSOUT DD SYSOUT=*
//CUSTRECS DD DISP=SHR,DSN=MY.INPUT.FILE01
//CUSTRECS DD DISP=SHR,DSN=MY.INPUT.FILE02
//CUSTRECS DD DISP=SHR,DSN=MY.INPUT.FILE03
//PRTLINE DD SYSOUT=*
//PRTLINE DD SYSOUT=*
//PRTLINE DD SYSOUT=*
…每次关闭和打开CUST-REC和PRINT-LINE时,您都会看到下一个DD。但这是一个更高级的JCL主题,您在实践中可能不会经常遇到它。停止运行
使用C0000。我没有想到,谢谢。现在我想在输出的顶部打印SYSOUT中的记录数,但似乎只有在运行READ-NEXT-RECORD
后才能在下面打印。有什么聪明的方法吗?@Fnechz:您可以将所有输出保存为字母数字,直到所有输入记录都被读取,然后写入输出行,或者您可以读取输入文件两次,即打开文件、读取文件、关闭文件、再次打开文件、再次读取文件、再次关闭文件。
//TOPACCTS EXEC PGM=TOPACCTS
//SYSOUT DD SYSOUT=*
//CUSTRECS DD DISP=SHR,DSN=MY.INPUT.FILE01
//CUSTRECS DD DISP=SHR,DSN=MY.INPUT.FILE02
//CUSTRECS DD DISP=SHR,DSN=MY.INPUT.FILE03
//PRTLINE DD SYSOUT=*
//PRTLINE DD SYSOUT=*
//PRTLINE DD SYSOUT=*