admin管理员组

文章数量:1402781

This program is supposed to take a file, sort it, and generate a report.
The problem is that it does not output the data on the first page. It prints all the headers and the dates, but then just cuts to a new page. The software I'm using is OpenCOBOLIDE.

       PROGRAM-ID. CH1407.
      *            Nyarlathotep
       ENVIRONMENT DIVISION.

       INPUT-OUTPUT SECTION.

       FILE-CONTROL.
           SELECT IN-FILE
               ASSIGN TO 'D:\DATA-FILES\CH1407.DAT'
               ORGANIZATION IS LINE SEQUENTIAL.

           SELECT SORT-FILE ASSIGN TO 'TEMPO'.

           SELECT REPORT-FILE
               ASSIGN TO 'D:\REPORTS\CH1407.RPT'
               ORGANIZATION IS LINE SEQUENTIAL.

       DATA DIVISION.
       FILE SECTION.
       FD  IN-FILE.
       01  IN-REC.
           05 IN-STUDENT-NUM            PIC X(5).
           05 IN-NAME                  PIC X(45).
           05 IN-NUM-OF-CREDITS         PIC 9(3).

       SD  SORT-FILE.
       01  SORT-REC.
           05 SR-STUDENT-NUM            PIC X(5).
           05 SR-FIRST-NAME            PIC X(20).
           05 SR-LAST-NAME             PIC X(25).
           05 SR-NUM-OF-CREDITS         PIC 9(3).
           05 SR-CLASS-NUM              PIC 9(1).

       FD  REPORT-FILE.
       01  REPORT-REC                  PIC X(80).


       WORKING-STORAGE SECTION.
       01  SWITCHES.
           05 ARE-THERE-MORE-RECORDS   PIC X(3).
               88 NO-MORE-RECORDS      VALUE 'NO '.
               88 MORE-RECORDS         VALUE 'YES'.



       01  MONTH-DATA.
           05 PIC X(9) VALUE 'JANUARY'.
           05 PIC X(9) VALUE 'FEBURARY'.
           05 PIC X(9) VALUE 'MARCH'.
           05 PIC X(9) VALUE 'APRIL'.
           05 PIC X(9) VALUE 'MAY'.
           05 PIC X(9) VALUE 'JUNE'.
           05 PIC X(9) VALUE 'JULY'.
           05 PIC X(9) VALUE 'AUGUST'.
           05 PIC X(9) VALUE 'SEPTEMBER'.
           05 PIC X(9) VALUE 'OCTOBER'.
           05 PIC X(9) VALUE 'NOVEMBER'.
           05 PIC X(9) VALUE 'DECEMBER'.

       01  MONTH-TABLE REDEFINES MONTH-DATA.
           05 MT-MONTH OCCURS 12 TIMES PIC X(9).

       01  HEADING1.
           05 PIC X(31).
           05 PIC X(18) VALUE 'UAM STUDENT REPORT'.
           05 PIC X(22).
           05 PIC X(4) VALUE 'PAGE'.
           05 H1-PAGE-CTR              PIC Z9.

       01  HEADING2.
           05 PIC X(31).
           05 H2-DATE              PIC X(18).

       01  HEADING3.
           05 PIC X(7) VALUE 'STUDENT'.
           05 PIC X(24).
           05 PIC X(7) VALUE 'STUDENT'.
           05 PIC X(24).
           05 PIC X(5) VALUE 'NO OF'.
           05 PIC X(6).
           05 PIC X(5) VALUE 'CLASS'.

       01  HEADING4.
           05 PIC X(2).
           05 PIC X(2) VALUE 'NO'.
           05 PIC X(28).
           05 PIC X(4) VALUE 'NAME'.
           05 PIC X(25).
           05 PIC X(7) VALUE 'CREDITS'.
           05 PIC X(6).
           05 PIC X(4) VALUE 'NAME'.

       01  WORK-AREA.
           05 WS-DATE.
               10 WS-YEAR              PIC 9(4).
               10 WS-MONTH             PIC 9(2).
               10 WS-DAY               PIC 9(2).
           05 WS-PAGE-CTR              PIC 99.
           05 WS-LINE-CTR              PIC 99.
           05 WS-CLASS-NAME            PIC X(9).
           05 WS-CLASS-HOLD            PIC 9(1).



       01  DETAIL-LINE.
           05 DL-STUDENT-NUM            PIC X(5).
           05 PIC X(5).
           05 DL-NAME                  PIC X(45).
           05 PIC X(5).
           05 DL-NUM-OF-CREDITS         PIC ZZ9.
           05 PIC X(5).
           05 DL-CLASS-NAME            PIC X(9).



       PROCEDURE DIVISION.
       100-MAIN-MODULE.
           SORT SORT-FILE
               ASCENDING KEY SR-CLASS-NUM
                             SR-LAST-NAME
                             SR-FIRST-NAME
               INPUT PROCEDURE IS 1000-EVALUATE-INPUT
               OUTPUT PROCEDURE IS 2000-PRINT-RTN
           STOP RUN.

       1000-EVALUATE-INPUT.
           OPEN INPUT IN-FILE
           SET MORE-RECORDS TO TRUE
            PERFORM UNTIL NO-MORE-RECORDS
               READ IN-FILE
                   AT END
                       SET NO-MORE-RECORDS TO TRUE
                   NOT AT END
                       PERFORM 1200-CALC-RTN
               END-READ
           END-PERFORM
           CLOSE IN-FILE.

       1200-CALC-RTN.
           MOVE IN-STUDENT-NUM TO SR-STUDENT-NUM
           UNSTRING
           IN-NAME DELIMITED BY ' '
           INTO SR-FIRST-NAME
                SR-LAST-NAME
           END-UNSTRING
           MOVE IN-NUM-OF-CREDITS TO SR-NUM-OF-CREDITS
           EVALUATE IN-NUM-OF-CREDITS
               WHEN 0 THRU 29
                   MOVE 1 TO SR-CLASS-NUM
               WHEN 30 THRU 59
                   MOVE 2 TO SR-CLASS-NUM
               WHEN 60 THRU 89
                   MOVE 3 TO SR-CLASS-NUM
               WHEN 90 THRU 200
                   MOVE 4 TO SR-CLASS-NUM
           END-EVALUATE
           RELEASE SORT-REC.

       2000-PRINT-RTN.
           OPEN OUTPUT REPORT-FILE
           PERFORM 2100-INITIALIZE-RTN
           PERFORM 2200-HEADING-RTN
           PERFORM UNTIL NO-MORE-RECORDS
               RETURN SORT-FILE
                   AT END
                       SET NO-MORE-RECORDS TO TRUE
                   NOT AT END
                       PERFORM 2300-PROCESS-RTN
                   END-RETURN
               END-PERFORM
           CLOSE REPORT-FILE.

       2100-INITIALIZE-RTN.
           INITIALIZE WORK-AREA
           MOVE FUNCTION CURRENT-DATE TO WS-DATE
           STRING
               MT-MONTH(WS-MONTH) DELIMITED BY ' '
               ' ' DELIMITED BY SIZE
               WS-DAY DELIMITED BY ' '
               ', ' DELIMITED BY SIZE
               WS-YEAR DELIMITED BY ' '
               INTO H2-DATE
           END-STRING
           SET MORE-RECORDS TO TRUE
           MOVE SR-CLASS-NUM TO WS-CLASS-HOLD.

       2200-HEADING-RTN.
           MOVE SPACES TO REPORT-REC
           WRITE REPORT-REC 
           ADD 1 TO WS-PAGE-CTR
           MOVE WS-PAGE-CTR TO H1-PAGE-CTR
           WRITE REPORT-REC FROM HEADING1
               AFTER 4
           WRITE REPORT-REC FROM HEADING2
               AFTER 1
           WRITE REPORT-REC FROM HEADING3
               AFTER 2
           WRITE REPORT-REC FROM HEADING4
           MOVE ZEROS TO WS-LINE-CTR.

       2300-PROCESS-RTN.
           IF WS-CLASS-HOLD NOT = SR-CLASS-NUM OR WS-LINE-CTR > 25
               PERFORM 2200-HEADING-RTN
           END-IF
           MOVE SR-CLASS-NUM TO WS-CLASS-HOLD
           MOVE SR-STUDENT-NUM TO DL-STUDENT-NUM
           MOVE SR-NUM-OF-CREDITS TO DL-NUM-OF-CREDITS
           EVALUATE SR-CLASS-NUM
               WHEN '1'
                   MOVE 'FRESHMAN' TO DL-CLASS-NAME
               WHEN '2'
                   MOVE 'SOPHOMORE' TO DL-CLASS-NAME
               WHEN '3'
                   MOVE 'JUNIOR' TO DL-CLASS-NAME
               WHEN '4'
                   MOVE 'SENIOR' TO DL-CLASS-NAME
           END-EVALUATE.
           STRING
               SR-LAST-NAME DELIMITED BY ' '
               ', ' DELIMITED BY SIZE
               SR-FIRST-NAME DELIMITED BY ' '
               INTO DL-NAME
           END-STRING
           WRITE REPORT-REC FROM DETAIL-LINE
               AFTER 2
           ADD 1 TO WS-LINE-CTR.

Tried altering the way the page counter works, altering where the page counter was executed, and trying to force the report rec to run. I either did one of those things incorrectly, or it's something else.

This program is supposed to take a file, sort it, and generate a report.
The problem is that it does not output the data on the first page. It prints all the headers and the dates, but then just cuts to a new page. The software I'm using is OpenCOBOLIDE.

       PROGRAM-ID. CH1407.
      *            Nyarlathotep
       ENVIRONMENT DIVISION.

       INPUT-OUTPUT SECTION.

       FILE-CONTROL.
           SELECT IN-FILE
               ASSIGN TO 'D:\DATA-FILES\CH1407.DAT'
               ORGANIZATION IS LINE SEQUENTIAL.

           SELECT SORT-FILE ASSIGN TO 'TEMPO'.

           SELECT REPORT-FILE
               ASSIGN TO 'D:\REPORTS\CH1407.RPT'
               ORGANIZATION IS LINE SEQUENTIAL.

       DATA DIVISION.
       FILE SECTION.
       FD  IN-FILE.
       01  IN-REC.
           05 IN-STUDENT-NUM            PIC X(5).
           05 IN-NAME                  PIC X(45).
           05 IN-NUM-OF-CREDITS         PIC 9(3).

       SD  SORT-FILE.
       01  SORT-REC.
           05 SR-STUDENT-NUM            PIC X(5).
           05 SR-FIRST-NAME            PIC X(20).
           05 SR-LAST-NAME             PIC X(25).
           05 SR-NUM-OF-CREDITS         PIC 9(3).
           05 SR-CLASS-NUM              PIC 9(1).

       FD  REPORT-FILE.
       01  REPORT-REC                  PIC X(80).


       WORKING-STORAGE SECTION.
       01  SWITCHES.
           05 ARE-THERE-MORE-RECORDS   PIC X(3).
               88 NO-MORE-RECORDS      VALUE 'NO '.
               88 MORE-RECORDS         VALUE 'YES'.



       01  MONTH-DATA.
           05 PIC X(9) VALUE 'JANUARY'.
           05 PIC X(9) VALUE 'FEBURARY'.
           05 PIC X(9) VALUE 'MARCH'.
           05 PIC X(9) VALUE 'APRIL'.
           05 PIC X(9) VALUE 'MAY'.
           05 PIC X(9) VALUE 'JUNE'.
           05 PIC X(9) VALUE 'JULY'.
           05 PIC X(9) VALUE 'AUGUST'.
           05 PIC X(9) VALUE 'SEPTEMBER'.
           05 PIC X(9) VALUE 'OCTOBER'.
           05 PIC X(9) VALUE 'NOVEMBER'.
           05 PIC X(9) VALUE 'DECEMBER'.

       01  MONTH-TABLE REDEFINES MONTH-DATA.
           05 MT-MONTH OCCURS 12 TIMES PIC X(9).

       01  HEADING1.
           05 PIC X(31).
           05 PIC X(18) VALUE 'UAM STUDENT REPORT'.
           05 PIC X(22).
           05 PIC X(4) VALUE 'PAGE'.
           05 H1-PAGE-CTR              PIC Z9.

       01  HEADING2.
           05 PIC X(31).
           05 H2-DATE              PIC X(18).

       01  HEADING3.
           05 PIC X(7) VALUE 'STUDENT'.
           05 PIC X(24).
           05 PIC X(7) VALUE 'STUDENT'.
           05 PIC X(24).
           05 PIC X(5) VALUE 'NO OF'.
           05 PIC X(6).
           05 PIC X(5) VALUE 'CLASS'.

       01  HEADING4.
           05 PIC X(2).
           05 PIC X(2) VALUE 'NO'.
           05 PIC X(28).
           05 PIC X(4) VALUE 'NAME'.
           05 PIC X(25).
           05 PIC X(7) VALUE 'CREDITS'.
           05 PIC X(6).
           05 PIC X(4) VALUE 'NAME'.

       01  WORK-AREA.
           05 WS-DATE.
               10 WS-YEAR              PIC 9(4).
               10 WS-MONTH             PIC 9(2).
               10 WS-DAY               PIC 9(2).
           05 WS-PAGE-CTR              PIC 99.
           05 WS-LINE-CTR              PIC 99.
           05 WS-CLASS-NAME            PIC X(9).
           05 WS-CLASS-HOLD            PIC 9(1).



       01  DETAIL-LINE.
           05 DL-STUDENT-NUM            PIC X(5).
           05 PIC X(5).
           05 DL-NAME                  PIC X(45).
           05 PIC X(5).
           05 DL-NUM-OF-CREDITS         PIC ZZ9.
           05 PIC X(5).
           05 DL-CLASS-NAME            PIC X(9).



       PROCEDURE DIVISION.
       100-MAIN-MODULE.
           SORT SORT-FILE
               ASCENDING KEY SR-CLASS-NUM
                             SR-LAST-NAME
                             SR-FIRST-NAME
               INPUT PROCEDURE IS 1000-EVALUATE-INPUT
               OUTPUT PROCEDURE IS 2000-PRINT-RTN
           STOP RUN.

       1000-EVALUATE-INPUT.
           OPEN INPUT IN-FILE
           SET MORE-RECORDS TO TRUE
            PERFORM UNTIL NO-MORE-RECORDS
               READ IN-FILE
                   AT END
                       SET NO-MORE-RECORDS TO TRUE
                   NOT AT END
                       PERFORM 1200-CALC-RTN
               END-READ
           END-PERFORM
           CLOSE IN-FILE.

       1200-CALC-RTN.
           MOVE IN-STUDENT-NUM TO SR-STUDENT-NUM
           UNSTRING
           IN-NAME DELIMITED BY ' '
           INTO SR-FIRST-NAME
                SR-LAST-NAME
           END-UNSTRING
           MOVE IN-NUM-OF-CREDITS TO SR-NUM-OF-CREDITS
           EVALUATE IN-NUM-OF-CREDITS
               WHEN 0 THRU 29
                   MOVE 1 TO SR-CLASS-NUM
               WHEN 30 THRU 59
                   MOVE 2 TO SR-CLASS-NUM
               WHEN 60 THRU 89
                   MOVE 3 TO SR-CLASS-NUM
               WHEN 90 THRU 200
                   MOVE 4 TO SR-CLASS-NUM
           END-EVALUATE
           RELEASE SORT-REC.

       2000-PRINT-RTN.
           OPEN OUTPUT REPORT-FILE
           PERFORM 2100-INITIALIZE-RTN
           PERFORM 2200-HEADING-RTN
           PERFORM UNTIL NO-MORE-RECORDS
               RETURN SORT-FILE
                   AT END
                       SET NO-MORE-RECORDS TO TRUE
                   NOT AT END
                       PERFORM 2300-PROCESS-RTN
                   END-RETURN
               END-PERFORM
           CLOSE REPORT-FILE.

       2100-INITIALIZE-RTN.
           INITIALIZE WORK-AREA
           MOVE FUNCTION CURRENT-DATE TO WS-DATE
           STRING
               MT-MONTH(WS-MONTH) DELIMITED BY ' '
               ' ' DELIMITED BY SIZE
               WS-DAY DELIMITED BY ' '
               ', ' DELIMITED BY SIZE
               WS-YEAR DELIMITED BY ' '
               INTO H2-DATE
           END-STRING
           SET MORE-RECORDS TO TRUE
           MOVE SR-CLASS-NUM TO WS-CLASS-HOLD.

       2200-HEADING-RTN.
           MOVE SPACES TO REPORT-REC
           WRITE REPORT-REC 
           ADD 1 TO WS-PAGE-CTR
           MOVE WS-PAGE-CTR TO H1-PAGE-CTR
           WRITE REPORT-REC FROM HEADING1
               AFTER 4
           WRITE REPORT-REC FROM HEADING2
               AFTER 1
           WRITE REPORT-REC FROM HEADING3
               AFTER 2
           WRITE REPORT-REC FROM HEADING4
           MOVE ZEROS TO WS-LINE-CTR.

       2300-PROCESS-RTN.
           IF WS-CLASS-HOLD NOT = SR-CLASS-NUM OR WS-LINE-CTR > 25
               PERFORM 2200-HEADING-RTN
           END-IF
           MOVE SR-CLASS-NUM TO WS-CLASS-HOLD
           MOVE SR-STUDENT-NUM TO DL-STUDENT-NUM
           MOVE SR-NUM-OF-CREDITS TO DL-NUM-OF-CREDITS
           EVALUATE SR-CLASS-NUM
               WHEN '1'
                   MOVE 'FRESHMAN' TO DL-CLASS-NAME
               WHEN '2'
                   MOVE 'SOPHOMORE' TO DL-CLASS-NAME
               WHEN '3'
                   MOVE 'JUNIOR' TO DL-CLASS-NAME
               WHEN '4'
                   MOVE 'SENIOR' TO DL-CLASS-NAME
           END-EVALUATE.
           STRING
               SR-LAST-NAME DELIMITED BY ' '
               ', ' DELIMITED BY SIZE
               SR-FIRST-NAME DELIMITED BY ' '
               INTO DL-NAME
           END-STRING
           WRITE REPORT-REC FROM DETAIL-LINE
               AFTER 2
           ADD 1 TO WS-LINE-CTR.

Tried altering the way the page counter works, altering where the page counter was executed, and trying to force the report rec to run. I either did one of those things incorrectly, or it's something else.

Share Improve this question edited Mar 21 at 7:13 Simon Sobisch 7,3721 gold badge20 silver badges40 bronze badges asked Mar 20 at 23:48 NyarlathotepNyarlathotep 211 silver badge1 bronze badge 2
  • OpenCobolIde is just an IDE (note: that software is abandoned since 2017, after having its last release in 2016 - you possibly want to switch, for example to GixIDE or vscode with superbol extension!), not a COBOL compiler. Have you updated the included GnuCOBOL 2.0 (a version that had no final release) or did you update it, for example to GnuCOBOL 3.2? – Simon Sobisch Commented Mar 21 at 7:17
  • 1 For people to recheck the execution you possibly want to provide a sample input file with enough data to see the result you face. – Simon Sobisch Commented Mar 21 at 7:24
Add a comment  | 

1 Answer 1

Reset to default 1

In 2100-INITIALIZE-RTN, MOVE SR-CLASS-NUM TO WS-CLASS-HOLD occurs before the first sort record is returned. SR-CLASS-NUM has an unknown value, maybe a space. It is likely a zero was moved to WS-CLASS-HOLD.

In 2000-PRINT-RTN, a page heading is produced before the first sort record is returned.

In 2300-PROCESS-RTN, IF WS-CLASS-HOLD NOT = SR-CLASS-NUM causes a new page to be printed.

After returning the first sort record, WS-CLASS-HOLD NOT = SR-CLASS-NUM will be true causing the first record to print on the second page; unless the value of SR-CLASS-NUM at the start happened to have had the same value as the first sort record

I suggest removing PERFORM 2200-HEADING-RTN from 2000-PRINT-RTN and initialize SR-CLASS-NUM to ZERO in the WORKING-STORAGE SECTION.

Or, replace PERFORM 2200-HEADING-RTN in 2000-PRINT-RTN with MOVE ZERO TO WS-CLASS-HOLD.

That way the first page header will not print until after the first record is returned.

本文标签: COBOL report confusionStack Overflow