The LAST keyword represents specialized final processing capabilities within COBOL Report Writer environments, providing sophisticated end-of-group detection and last-record identification mechanisms that enable precise control break handling, final summary processing, and comprehensive data finalization patterns. This keyword embodies advanced reporting principles by supporting automated last-record recognition, enabling sophisticated group closure operations, and facilitating comprehensive final processing sequences while maintaining report formatting integrity, ensuring proper group termination, and supporting complex reporting requirements across enterprise applications requiring detailed control break processing, automated summary generation, and reliable final record handling with optimized performance characteristics and consistent reporting standards.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152*> Report Writer LAST usage REPORT SECTION. RD SALES-REPORT CONTROLS ARE REGION, SALESPERSON PAGE LIMIT IS 60 LINES HEADING 1 FIRST DETAIL 5 LAST DETAIL 55 FOOTING 58. 01 DETAIL-LINE TYPE IS DETAIL. 05 LINE PLUS 1. 05 COLUMN 1 PIC X(10) SOURCE REGION. 05 COLUMN 12 PIC X(20) SOURCE SALESPERSON. 05 COLUMN 33 PIC X(15) SOURCE CUSTOMER. 05 COLUMN 49 PIC $,$$$,$$9.99 SOURCE SALE-AMOUNT. 01 REGION-FOOTER TYPE IS CONTROL FOOTING REGION. 05 LINE PLUS 2. 05 COLUMN 1 PIC X(25) VALUE "REGION TOTAL:". 05 COLUMN 27 PIC $,$$$,$$9.99 SUM SALE-AMOUNT. *> LAST detail processing concept 01 LAST-DETAIL-LINE TYPE IS DETAIL. 05 LINE PLUS 1. 05 COLUMN 1 PIC X(50) VALUE "*** END OF REGION DATA ***". *> Procedural LAST record simulation PROCEDURE DIVISION. MAIN-PROCESSING. OPEN INPUT SALES-FILE OPEN OUTPUT REPORT-FILE INITIATE SALES-REPORT PERFORM UNTIL WS-EOF = 'Y' READ SALES-FILE AT END MOVE 'Y' TO WS-EOF PERFORM PROCESS-LAST-RECORD NOT AT END GENERATE DETAIL-LINE END-READ END-PERFORM TERMINATE SALES-REPORT CLOSE SALES-FILE REPORT-FILE. PROCESS-LAST-RECORD. DISPLAY "Processing last record in file" *> Perform final calculations *> Generate final totals *> Close report sections.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439IDENTIFICATION DIVISION. PROGRAM-ID. LAST-PROCESSING-DEMO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT EMPLOYEE-FILE ASSIGN TO "EMPLOYEE.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-EMP-STATUS. SELECT PAYROLL-REPORT ASSIGN TO "PAYROLL.RPT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-RPT-STATUS. DATA DIVISION. FILE SECTION. FD EMPLOYEE-FILE. 01 EMPLOYEE-RECORD. 05 EMP-ID PIC 9(6). 05 EMP-NAME PIC X(30). 05 EMP-DEPARTMENT PIC X(10). 05 EMP-SALARY PIC 9(8)V99. 05 EMP-HOURS-WORKED PIC 9(3)V9. 05 EMP-OVERTIME-HOURS PIC 9(3)V9. FD PAYROLL-REPORT. 01 REPORT-LINE PIC X(132). WORKING-STORAGE SECTION. *> File control variables 01 WS-FILE-STATUS. 05 WS-EMP-STATUS PIC X(2). 05 WS-RPT-STATUS PIC X(2). *> End-of-file and last record flags 01 WS-EOF-FLAGS. 05 WS-EOF PIC X VALUE 'N'. 05 WS-LAST-RECORD-FLAG PIC X VALUE 'N'. 05 WS-FIRST-RECORD-FLAG PIC X VALUE 'Y'. *> Previous record for comparison 01 WS-PREVIOUS-RECORD. 05 WS-PREV-DEPT PIC X(10). 05 WS-PREV-EMP-ID PIC 9(6). *> Current processing variables 01 WS-CURRENT-PROCESSING. 05 WS-CURRENT-DEPT PIC X(10). 05 WS-RECORDS-IN-DEPT PIC 9(4) VALUE 0. 05 WS-TOTAL-RECORDS PIC 9(6) VALUE 0. *> Department totals 01 WS-DEPT-TOTALS. 05 WS-DEPT-SALARY-TOTAL PIC 9(10)V99 VALUE 0. 05 WS-DEPT-HOURS-TOTAL PIC 9(6)V9 VALUE 0. 05 WS-DEPT-COUNT PIC 9(4) VALUE 0. *> Grand totals 01 WS-GRAND-TOTALS. 05 WS-GRAND-SALARY-TOTAL PIC 9(12)V99 VALUE 0. 05 WS-GRAND-HOURS-TOTAL PIC 9(8)V9 VALUE 0. 05 WS-GRAND-COUNT PIC 9(6) VALUE 0. *> Report formatting 01 WS-REPORT-HEADERS. 05 WS-HEADER-LINE-1 PIC X(132) VALUE " PAYROLL SUMMARY REPORT". 05 WS-HEADER-LINE-2 PIC X(132) VALUE "DEPT EMPLOYEE NAME SALARY HOURS OVERTIME". 05 WS-HEADER-LINE-3 PIC X(132) VALUE "---- ------------- ------ ----- --------". 01 WS-DETAIL-FORMAT. 05 WS-DETAIL-DEPT PIC X(10). 05 FILLER PIC X(2) VALUE SPACES. 05 WS-DETAIL-NAME PIC X(30). 05 FILLER PIC X(2) VALUE SPACES. 05 WS-DETAIL-SALARY PIC $,$$$,$$9.99. 05 FILLER PIC X(2) VALUE SPACES. 05 WS-DETAIL-HOURS PIC ZZ9.9. 05 FILLER PIC X(4) VALUE SPACES. 05 WS-DETAIL-OVERTIME PIC ZZ9.9. 05 FILLER PIC X(68) VALUE SPACES. 01 WS-DEPT-TOTAL-FORMAT. 05 FILLER PIC X(12) VALUE "DEPT TOTAL: ". 05 WS-DEPT-TOTAL-NAME PIC X(30). 05 FILLER PIC X(2) VALUE SPACES. 05 WS-DEPT-TOTAL-SALARY PIC $,$$$,$$9.99. 05 FILLER PIC X(2) VALUE SPACES. 05 WS-DEPT-TOTAL-HOURS PIC ZZZ9.9. 05 FILLER PIC X(4) VALUE SPACES. 05 WS-DEPT-TOTAL-COUNT PIC Z,ZZ9. 05 FILLER PIC X(65) VALUE " EMPLOYEES". 01 WS-GRAND-TOTAL-FORMAT. 05 FILLER PIC X(12) VALUE "GRAND TOTAL:". 05 FILLER PIC X(30) VALUE SPACES. 05 FILLER PIC X(2) VALUE SPACES. 05 WS-GRAND-TOTAL-SALARY PIC $,$$$,$$9.99. 05 FILLER PIC X(2) VALUE SPACES. 05 WS-GRAND-TOTAL-HOURS PIC ZZZ9.9. 05 FILLER PIC X(4) VALUE SPACES. 05 WS-GRAND-TOTAL-COUNT PIC Z,ZZ9. 05 FILLER PIC X(65) VALUE " EMPLOYEES". PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM INITIALIZE-PROCESSING PERFORM PROCESS-EMPLOYEE-FILE PERFORM FINALIZE-PROCESSING STOP RUN. INITIALIZE-PROCESSING. DISPLAY "=== LAST RECORD PROCESSING DEMONSTRATION ===" OPEN INPUT EMPLOYEE-FILE IF WS-EMP-STATUS NOT = "00" DISPLAY "Error opening employee file: " WS-EMP-STATUS STOP RUN END-IF OPEN OUTPUT PAYROLL-REPORT IF WS-RPT-STATUS NOT = "00" DISPLAY "Error opening report file: " WS-RPT-STATUS STOP RUN END-IF PERFORM WRITE-REPORT-HEADERS DISPLAY "Processing started - looking for last records in each department" DISPLAY SPACES. WRITE-REPORT-HEADERS. WRITE REPORT-LINE FROM WS-HEADER-LINE-1 WRITE REPORT-LINE FROM SPACES WRITE REPORT-LINE FROM WS-HEADER-LINE-2 WRITE REPORT-LINE FROM WS-HEADER-LINE-3 WRITE REPORT-LINE FROM SPACES. PROCESS-EMPLOYEE-FILE. PERFORM READ-EMPLOYEE-RECORD PERFORM UNTIL WS-EOF = 'Y' PERFORM PROCESS-CURRENT-RECORD PERFORM READ-EMPLOYEE-RECORD END-PERFORM. READ-EMPLOYEE-RECORD. READ EMPLOYEE-FILE AT END MOVE 'Y' TO WS-EOF MOVE 'Y' TO WS-LAST-RECORD-FLAG DISPLAY "*** LAST RECORD IN FILE DETECTED ***" IF WS-TOTAL-RECORDS > 0 PERFORM PROCESS-LAST-RECORD-IN-DEPARTMENT END-IF NOT AT END ADD 1 TO WS-TOTAL-RECORDS PERFORM CHECK-FOR-DEPARTMENT-CHANGE END-READ. CHECK-FOR-DEPARTMENT-CHANGE. IF WS-FIRST-RECORD-FLAG = 'Y' MOVE EMP-DEPARTMENT TO WS-CURRENT-DEPT MOVE EMP-DEPARTMENT TO WS-PREV-DEPT MOVE 'N' TO WS-FIRST-RECORD-FLAG DISPLAY "First record - Department: " WS-CURRENT-DEPT ELSE IF EMP-DEPARTMENT NOT = WS-PREV-DEPT DISPLAY "*** LAST RECORD IN DEPARTMENT " WS-PREV-DEPT " ***" PERFORM PROCESS-LAST-RECORD-IN-DEPARTMENT PERFORM START-NEW-DEPARTMENT END-IF END-IF. START-NEW-DEPARTMENT. MOVE EMP-DEPARTMENT TO WS-CURRENT-DEPT MOVE EMP-DEPARTMENT TO WS-PREV-DEPT MOVE 0 TO WS-RECORDS-IN-DEPT MOVE 0 TO WS-DEPT-SALARY-TOTAL MOVE 0 TO WS-DEPT-HOURS-TOTAL MOVE 0 TO WS-DEPT-COUNT DISPLAY "Starting new department: " WS-CURRENT-DEPT. PROCESS-CURRENT-RECORD. *> Accumulate department totals ADD EMP-SALARY TO WS-DEPT-SALARY-TOTAL ADD EMP-HOURS-WORKED TO WS-DEPT-HOURS-TOTAL ADD 1 TO WS-DEPT-COUNT ADD 1 TO WS-RECORDS-IN-DEPT *> Accumulate grand totals ADD EMP-SALARY TO WS-GRAND-SALARY-TOTAL ADD EMP-HOURS-WORKED TO WS-GRAND-HOURS-TOTAL ADD 1 TO WS-GRAND-COUNT *> Format and write detail line MOVE EMP-DEPARTMENT TO WS-DETAIL-DEPT MOVE EMP-NAME TO WS-DETAIL-NAME MOVE EMP-SALARY TO WS-DETAIL-SALARY MOVE EMP-HOURS-WORKED TO WS-DETAIL-HOURS MOVE EMP-OVERTIME-HOURS TO WS-DETAIL-OVERTIME WRITE REPORT-LINE FROM WS-DETAIL-FORMAT DISPLAY "Processed: " EMP-ID " " EMP-NAME " Dept: " EMP-DEPARTMENT. PROCESS-LAST-RECORD-IN-DEPARTMENT. DISPLAY "Processing last record for department: " WS-PREV-DEPT *> Write department total line MOVE WS-PREV-DEPT TO WS-DEPT-TOTAL-NAME MOVE WS-DEPT-SALARY-TOTAL TO WS-DEPT-TOTAL-SALARY MOVE WS-DEPT-HOURS-TOTAL TO WS-DEPT-TOTAL-HOURS MOVE WS-DEPT-COUNT TO WS-DEPT-TOTAL-COUNT WRITE REPORT-LINE FROM SPACES WRITE REPORT-LINE FROM WS-DEPT-TOTAL-FORMAT WRITE REPORT-LINE FROM SPACES DISPLAY "Department " WS-PREV-DEPT " Summary:" DISPLAY " Employees: " WS-DEPT-COUNT DISPLAY " Total Salary: $" WS-DEPT-SALARY-TOTAL DISPLAY " Total Hours: " WS-DEPT-HOURS-TOTAL DISPLAY " Average Salary: $" FUNCTION NUMERIC-LITERAL(WS-DEPT-SALARY-TOTAL / WS-DEPT-COUNT). FINALIZE-PROCESSING. DISPLAY "=== FINAL PROCESSING (LAST RECORD HANDLING) ===" *> Write grand totals MOVE WS-GRAND-SALARY-TOTAL TO WS-GRAND-TOTAL-SALARY MOVE WS-GRAND-HOURS-TOTAL TO WS-GRAND-TOTAL-HOURS MOVE WS-GRAND-COUNT TO WS-GRAND-TOTAL-COUNT WRITE REPORT-LINE FROM SPACES WRITE REPORT-LINE FROM SPACES WRITE REPORT-LINE FROM WS-GRAND-TOTAL-FORMAT DISPLAY "=== PROCESSING COMPLETE ===" DISPLAY "Total employees processed: " WS-GRAND-COUNT DISPLAY "Total salary processed: $" WS-GRAND-SALARY-TOTAL DISPLAY "Total hours processed: " WS-GRAND-HOURS-TOTAL CLOSE EMPLOYEE-FILE PAYROLL-REPORT. *> Additional last record processing scenarios ADVANCED-LAST-PROCESSING. DISPLAY "=== ADVANCED LAST RECORD SCENARIOS ===" PERFORM DEMONSTRATE-LAST-IN-ARRAY PERFORM DEMONSTRATE-LAST-IN-TABLE PERFORM DEMONSTRATE-LAST-PAGE-PROCESSING. DEMONSTRATE-LAST-IN-ARRAY. 01 WS-ARRAY-DATA. 05 WS-ARRAY-ITEM OCCURS 10 TIMES PIC 9(3). 01 WS-ARRAY-INDEX PIC 9(2). DISPLAY "Processing array with last element detection:" *> Initialize array PERFORM VARYING WS-ARRAY-INDEX FROM 1 BY 1 UNTIL WS-ARRAY-INDEX > 10 COMPUTE WS-ARRAY-ITEM(WS-ARRAY-INDEX) = WS-ARRAY-INDEX * 10 END-PERFORM *> Process array with last element special handling PERFORM VARYING WS-ARRAY-INDEX FROM 1 BY 1 UNTIL WS-ARRAY-INDEX > 10 DISPLAY "Element " WS-ARRAY-INDEX ": " WS-ARRAY-ITEM(WS-ARRAY-INDEX) IF WS-ARRAY-INDEX = 10 DISPLAY "*** LAST ELEMENT IN ARRAY ***" DISPLAY "Special processing for final element" END-IF END-PERFORM. DEMONSTRATE-LAST-IN-TABLE. 01 WS-EMPLOYEE-TABLE. 05 WS-EMP-ENTRY OCCURS 5 TIMES. 10 WS-EMP-TABLE-ID PIC 9(6). 10 WS-EMP-TABLE-NAME PIC X(20). 01 WS-TABLE-INDEX PIC 9(2). 01 WS-TABLE-SIZE PIC 9(2) VALUE 5. DISPLAY "Processing table with last entry detection:" *> Initialize table MOVE 123456 TO WS-EMP-TABLE-ID(1) MOVE "JOHN SMITH" TO WS-EMP-TABLE-NAME(1) MOVE 234567 TO WS-EMP-TABLE-ID(2) MOVE "JANE DOE" TO WS-EMP-TABLE-NAME(2) MOVE 345678 TO WS-EMP-TABLE-ID(3) MOVE "BOB JOHNSON" TO WS-EMP-TABLE-NAME(3) MOVE 456789 TO WS-EMP-TABLE-ID(4) MOVE "ALICE BROWN" TO WS-EMP-TABLE-NAME(4) MOVE 567890 TO WS-EMP-TABLE-ID(5) MOVE "CHARLIE WILSON" TO WS-EMP-TABLE-NAME(5) *> Process table with last entry special handling PERFORM VARYING WS-TABLE-INDEX FROM 1 BY 1 UNTIL WS-TABLE-INDEX > WS-TABLE-SIZE DISPLAY "Employee " WS-TABLE-INDEX ": " WS-EMP-TABLE-ID(WS-TABLE-INDEX) " " WS-EMP-TABLE-NAME(WS-TABLE-INDEX) IF WS-TABLE-INDEX = WS-TABLE-SIZE DISPLAY "*** LAST ENTRY IN TABLE ***" DISPLAY "Final employee processed: " WS-EMP-TABLE-NAME(WS-TABLE-INDEX) END-IF END-PERFORM. DEMONSTRATE-LAST-PAGE-PROCESSING. 01 WS-PAGE-CONTROL. 05 WS-LINES-PER-PAGE PIC 9(2) VALUE 50. 05 WS-CURRENT-LINE PIC 9(2) VALUE 1. 05 WS-PAGE-NUMBER PIC 9(3) VALUE 1. 05 WS-LAST-PAGE-FLAG PIC X VALUE 'N'. DISPLAY "Simulating last page processing:" *> Simulate processing multiple pages PERFORM UNTIL WS-PAGE-NUMBER > 3 DISPLAY "Processing Page " WS-PAGE-NUMBER PERFORM UNTIL WS-CURRENT-LINE > WS-LINES-PER-PAGE ADD 1 TO WS-CURRENT-LINE *> Check if this is the last line on the page IF WS-CURRENT-LINE = WS-LINES-PER-PAGE DISPLAY "*** LAST LINE ON PAGE " WS-PAGE-NUMBER " ***" PERFORM PROCESS-END-OF-PAGE END-IF END-PERFORM *> Check if this is the last page IF WS-PAGE-NUMBER = 3 MOVE 'Y' TO WS-LAST-PAGE-FLAG DISPLAY "*** LAST PAGE OF REPORT ***" PERFORM PROCESS-LAST-PAGE END-IF ADD 1 TO WS-PAGE-NUMBER MOVE 1 TO WS-CURRENT-LINE END-PERFORM. PROCESS-END-OF-PAGE. DISPLAY "End of page processing:" DISPLAY " Writing page footer" DISPLAY " Preparing for next page". PROCESS-LAST-PAGE. DISPLAY "Last page processing:" DISPLAY " Writing final summary" DISPLAY " Closing report" DISPLAY " Performing cleanup". *> Last record in sorted processing LAST-RECORD-IN-SORTED-FILE. 01 WS-SORT-CONTROL. 05 WS-CURRENT-KEY PIC X(10). 05 WS-PREVIOUS-KEY PIC X(10). 05 WS-KEY-BREAK-FLAG PIC X VALUE 'N'. 05 WS-FIRST-KEY-FLAG PIC X VALUE 'Y'. DISPLAY "=== LAST RECORD IN SORTED GROUPS ===" *> Simulate sorted file processing MOVE "GROUP-A" TO WS-CURRENT-KEY PERFORM PROCESS-SORTED-GROUP MOVE "GROUP-B" TO WS-CURRENT-KEY PERFORM PROCESS-SORTED-GROUP MOVE "GROUP-C" TO WS-CURRENT-KEY PERFORM PROCESS-SORTED-GROUP DISPLAY "*** LAST GROUP PROCESSED ***". PROCESS-SORTED-GROUP. IF WS-FIRST-KEY-FLAG = 'Y' MOVE WS-CURRENT-KEY TO WS-PREVIOUS-KEY MOVE 'N' TO WS-FIRST-KEY-FLAG ELSE IF WS-CURRENT-KEY NOT = WS-PREVIOUS-KEY DISPLAY "*** LAST RECORD IN GROUP " WS-PREVIOUS-KEY " ***" PERFORM FINALIZE-PREVIOUS-GROUP MOVE WS-CURRENT-KEY TO WS-PREVIOUS-KEY END-IF END-IF DISPLAY "Processing record in group: " WS-CURRENT-KEY. FINALIZE-PREVIOUS-GROUP. DISPLAY "Finalizing group: " WS-PREVIOUS-KEY DISPLAY " Calculating group totals" DISPLAY " Writing group summary". *> Database-style last record processing DATABASE-STYLE-LAST-PROCESSING. 01 WS-CURSOR-CONTROL. 05 WS-FETCH-STATUS PIC X(2). 05 WS-ROW-COUNT PIC 9(6) VALUE 0. 05 WS-LAST-ROW-FLAG PIC X VALUE 'N'. DISPLAY "=== DATABASE-STYLE LAST RECORD PROCESSING ===" *> Simulate cursor processing MOVE "00" TO WS-FETCH-STATUS PERFORM UNTIL WS-FETCH-STATUS = "02" *> No more data PERFORM FETCH-NEXT-ROW IF WS-FETCH-STATUS = "00" ADD 1 TO WS-ROW-COUNT DISPLAY "Processing row " WS-ROW-COUNT ELSE IF WS-FETCH-STATUS = "02" MOVE 'Y' TO WS-LAST-ROW-FLAG DISPLAY "*** LAST ROW FETCHED ***" PERFORM PROCESS-FINAL-ROW END-IF END-IF END-PERFORM. FETCH-NEXT-ROW. *> Simulate fetching rows IF WS-ROW-COUNT < 5 MOVE "00" TO WS-FETCH-STATUS ELSE MOVE "02" TO WS-FETCH-STATUS END-IF. PROCESS-FINAL-ROW. DISPLAY "Final row processing:" DISPLAY " Total rows processed: " WS-ROW-COUNT DISPLAY " Closing cursor" DISPLAY " Committing transaction".
123456789101112131415161718192021222324252627282930313201 SALES-RECORD. 05 SALE-DEPT PIC X(10). 05 SALE-PERSON PIC X(20). 05 SALE-AMOUNT PIC 9(8)V99. 01 WS-DEPT-TOTALS. 05 WS-CURRENT-DEPT PIC X(10). 05 WS-DEPT-TOTAL PIC 9(10)V99. 05 WS-DEPT-COUNT PIC 9(4). PROCEDURE DIVISION. PROCESS-SALES. PERFORM UNTIL WS-EOF = 'Y' READ SALES-FILE AT END MOVE 'Y' TO WS-EOF PERFORM PROCESS-LAST-DEPARTMENT NOT AT END IF SALE-DEPT NOT = WS-CURRENT-DEPT PERFORM PROCESS-LAST-DEPARTMENT PERFORM START-NEW-DEPARTMENT END-IF PERFORM ACCUMULATE-SALES END-READ END-PERFORM. PROCESS-LAST-DEPARTMENT. IF WS-DEPT-COUNT > 0 DISPLAY "Last record in department: " WS-CURRENT-DEPT DISPLAY "Department total: $" WS-DEPT-TOTAL DISPLAY "Number of sales: " WS-DEPT-COUNT END-IF.
123456789101112131415161718192021222301 WS-SALES-ARRAY. 05 WS-MONTHLY-SALES OCCURS 12 TIMES PIC 9(8)V99. 01 WS-PROCESSING-VARS. 05 WS-MONTH-INDEX PIC 9(2). 05 WS-ANNUAL-TOTAL PIC 9(10)V99. PROCEDURE DIVISION. PROCESS-ANNUAL-SALES. PERFORM VARYING WS-MONTH-INDEX FROM 1 BY 1 UNTIL WS-MONTH-INDEX > 12 ADD WS-MONTHLY-SALES(WS-MONTH-INDEX) TO WS-ANNUAL-TOTAL DISPLAY "Month " WS-MONTH-INDEX ": $" WS-MONTHLY-SALES(WS-MONTH-INDEX) IF WS-MONTH-INDEX = 12 DISPLAY "*** LAST MONTH OF YEAR ***" DISPLAY "Annual total: $" WS-ANNUAL-TOTAL PERFORM CALCULATE-AVERAGES END-IF END-PERFORM.
How is LAST used in COBOL Report Writer?
Answer: In Report Writer, LAST identifies the final detail line before control breaks occur. It enables special processing of the last record in a group, such as adding totals or performing cleanup before moving to the next control group.
How do you handle the last record in a sequential file?
Answer: Use the AT END clause in READ statements to detect the last record, set appropriate flags, and perform final processing including totals calculation, report finalization, and cleanup operations.
What processing is typically done for the last record in a control group?
Answer: For the last record in a control group, you typically calculate and display group totals, write summary lines, reset accumulators, and prepare for the next group or final processing.