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
1 Answer
Reset to default 1In 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
版权声明:本文标题:COBOL report confusion - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744378149a2603364.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论