Control Break Report
Problem Description
Generate report with control breaks (subtotals by group).
Expected Output
Report with group subtotals
Hints
Detect when key field changes, print subtotal.
Solution
IDENTIFICATION DIVISION.
PROGRAM-ID. CTRLBRK.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-SALES-DATA.
05 WS-SALE OCCURS 8 TIMES.
10 WS-DEPT PIC X(10).
10 WS-EMP PIC X(15).
10 WS-AMOUNT PIC 9(6)V99.
01 WS-I PIC 9.
01 WS-PREV-DEPT PIC X(10) VALUE SPACES.
01 WS-DEPT-TOTAL PIC 9(8)V99 VALUE 0.
01 WS-GRAND-TOTAL PIC 9(9)V99 VALUE 0.
01 WS-DISP PIC ZZ,ZZ,ZZ9.99.
PROCEDURE DIVISION.
PERFORM INIT-DATA.
DISPLAY "===========================================".
DISPLAY " SALES BY DEPARTMENT ".
DISPLAY "===========================================".
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 8
* Check for control break
IF WS-DEPT(WS-I) NOT = WS-PREV-DEPT
IF WS-PREV-DEPT NOT = SPACES
MOVE WS-DEPT-TOTAL TO WS-DISP
DISPLAY " SUBTOTAL: " WS-DISP
DISPLAY "-------------------------------------------"
END-IF
DISPLAY "DEPARTMENT: " WS-DEPT(WS-I)
MOVE 0 TO WS-DEPT-TOTAL
MOVE WS-DEPT(WS-I) TO WS-PREV-DEPT
END-IF
MOVE WS-AMOUNT(WS-I) TO WS-DISP
DISPLAY " " WS-EMP(WS-I) " " WS-DISP
ADD WS-AMOUNT(WS-I) TO WS-DEPT-TOTAL
ADD WS-AMOUNT(WS-I) TO WS-GRAND-TOTAL
END-PERFORM.
* Final subtotal
MOVE WS-DEPT-TOTAL TO WS-DISP.
DISPLAY " SUBTOTAL: " WS-DISP.
DISPLAY "===========================================".
MOVE WS-GRAND-TOTAL TO WS-DISP.
DISPLAY "GRAND TOTAL: " WS-DISP.
STOP RUN.
INIT-DATA.
MOVE "FINANCE" TO WS-DEPT(1).
MOVE "ALICE" TO WS-EMP(1).
MOVE 5000.00 TO WS-AMOUNT(1).
MOVE "FINANCE" TO WS-DEPT(2).
MOVE "BOB" TO WS-EMP(2).
MOVE 6500.00 TO WS-AMOUNT(2).
MOVE "FINANCE" TO WS-DEPT(3).
MOVE "CHARLIE" TO WS-EMP(3).
MOVE 5500.00 TO WS-AMOUNT(3).
MOVE "IT" TO WS-DEPT(4).
MOVE "DIANA" TO WS-EMP(4).
MOVE 7000.00 TO WS-AMOUNT(4).
MOVE "IT" TO WS-DEPT(5).
MOVE "EDWARD" TO WS-EMP(5).
MOVE 8000.00 TO WS-AMOUNT(5).
MOVE "SALES" TO WS-DEPT(6).
MOVE "FIONA" TO WS-EMP(6).
MOVE 9500.00 TO WS-AMOUNT(6).
MOVE "SALES" TO WS-DEPT(7).
MOVE "GEORGE" TO WS-EMP(7).
MOVE 8500.00 TO WS-AMOUNT(7).
MOVE "SALES" TO WS-DEPT(8).
MOVE "HELEN" TO WS-EMP(8).
MOVE 7500.00 TO WS-AMOUNT(8).
Explanation:
Track previous key value. When it changes, print subtotal and reset.