如何从COBOL程序在SYSOUT假脱机中打印输出时纠正此逻辑错误?

如何从COBOL程序在SYSOUT假脱机中打印输出时纠正此逻辑错误?,cobol,mainframe,jcl,gnucobol,cobol85,Cobol,Mainframe,Jcl,Gnucobol,Cobol85,这是cobol代码 *----------------------- IDENTIFICATION DIVISION. *----------------------- PROGRAM-ID. TOPACCTS AUTHOR. Otto B. Boolean. *-------------------- ENVIRONMENT DIVISION. *-------------

这是cobol代码

     *-----------------------
       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=*