Control Break COBOL

---------------------------------------------------------------------
This example is for a two level control break.
This routine also gathers 'grand total' figures.
Initialize control routines are from major to minor.
Process data in the way that you normally would.
Read the next record into the buffer.
Detecting a control field change also means changes to
all control levels below it.
Summarize control routines are from minor to major.
---------------------------------------------------------------------
This method does away with all switches: e.g. first-time, last-time.
Note: All data is accessed from the "current-record".
The choosing of when the next-record area is moved to the
current-record area is crucial to the programs ease of use.
No matter where you are in the main-line: initial, normal process
or summary routines, you can always access the current-record 
for the appropriate values. Note that in some COBOL compilers
the FD area becomes unavailable after end of file is encountered.
This code does not access the next-record area after end-of-file.
---------------------------------------------------------------------
IDENTIFICATION DIVISION.
PROGRAM-ID.  CBREAKEX.
AUTHOR.      ALFRED SIMPSON.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT SALES-FILE              ASSIGN TO "INFILE"
ORGANIZATION IS SEQUENTIAL.
SELECT REPORT-FILE             ASSIGN TO "PRNTFILE"
ORGANIZATION IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD   SALES-FILE 
DATA RECORD IS NEXT-RECORD.
01  NEXT-RECORD.
    05  NEXT-STATE                PIC X(2).
    05  NEXT-CITY                 PIC X(20).
    05                            PIC X(30).
    05                            PIC S9(6)V9(2).

FD  REPORT-FILE
DATA RECORD IS REPORT-RECORD.
01  REPORT-RECORD                 PIC X(80).

WORKING-STORAGE SECTION.
01  CURRENT-RECORD.
    05  CURRENT-STATE             PIC X(2).
    05  CURRENT-CITY              PIC X(20).
    05  CURRENT-CUSTOMER          PIC X(30).
    05  CURRENT-AMOUNT            PIC S9(6)V9(2).
01  LEVEL-CONTROL                 PIC 9999.

01  WORKING-NUMERICS.
    05  AMOUNT-BY-FEDERAL         PIC S9(8)V9(2).
    05  AMOUNT-BY-STATE           PIC S9(8)V9(2).
    05  AMOUNT-BY-CITY            PIC S9(8)V9(2).
    05  CUSTOMER-COUNT-BY-FEDERAL PIC 9(5).
    05  CUSTOMER-COUNT-BY-STATE   PIC 9(5).
    05  CUSTOMER-COUNT-BY-CITY    PIC 9(5).
    05  CITY-COUNT-BY-FEDERAL     PIC 9(5).
    05  CITY-COUNT-BY-STATE       PIC 9(5).
    05  STATE-COUNT-BY-FEDERAL    PIC 9(5).
01  STATE-HEADER.
    05                            PIC X(7)  VALUE " STATE ".
    05  LN01-STATE                PIC X(2).
01  CITY-HEADER.
    05                            PIC X(9)  VALUE "    CITY ".
    05  LN02-CITY                 PIC X(20).

01  CUSTOMER-DETAIL.
    05                            PIC X(5)  VALUE SPACES.
    05  LN03-CUSTOMER             PIC X(30).
    05                            PIC X(5)  VALUE SPACES.
    05  LN03-AMOUNT               PIC ----,--9.99.
01  CITY-TRAILER.
    05                            PIC X(6)  VALUE " CITY ".
    05  LN04-CITY                 PIC X(20).
    05                            PIC X(5)  VALUE SPACES.
    05  LN04-AMOUNT               PIC ---,---,--9.99.
    05                            PIC X(5)  VALUE SPACES.
    05  LN04-CUSTOMER-COUNT       PIC ZZZ,ZZ9.
    05                            PIC X(10) VALUE " CUSTOMERS".
01  STATE-TRAILER.
    05                            PIC X(10) VALUE "    STATE ".
    05  LN05-STATE                PIC X(2).
    05                            PIC X(5)  VALUE SPACES.
    05  LN05-AMOUNT               PIC ---,---,--9.99.
    05                            PIC X(5)  VALUE SPACES.
    05  LN05-CITY-COUNT           PIC ZZZ,ZZ9.
    05                            PIC X(9)  VALUE " CITIES  ".
    05  LN05-CUSTOMER-COUNT       PIC ZZZ,ZZ9.
    05                            PIC X(10) VALUE " CUSTOMERS".
01  FEDERAL-TRAILER.
    05                            PIC X(9)  VALUE " FEDERAL ".
    05  LN06-AMOUNT               PIC ---,---,--9.99.
    05                            PIC X(5)  VALUE SPACES.
    05  LN06-STATE-COUNT          PIC ZZZ,ZZ9.
    05                            PIC X(9)  VALUE " STATES  ".
    05  LN06-CITY-COUNT           PIC ZZZ,ZZ9.
    05                            PIC X(9)  VALUE " CITIES  ".
    05  LN06-CUSTOMER-COUNT       PIC ZZZ,ZZ9.
    05                            PIC X(10) VALUE " CUSTOMERS".

PROCEDURE DIVISION.
PROCEDURE-MAIN.


    PERFORM PROGRAM-INITIAL.
    
    PERFORM MAIN-LINE UNTIL LEVEL-CONTROL = 100.

    PERFORM PROGRAM-SUMMARY.
    
    STOP RUN.
PROGRAM-INITIAL.
    MOVE ZERO                     TO AMOUNT-BY-FEDERAL.
    MOVE ZERO                     TO STATE-COUNT-BY-FEDERAL.
    MOVE ZERO                     TO CITY-COUNT-BY-FEDERAL.
    MOVE ZERO                     TO CUSTOMER-COUNT-BY-FEDERAL.
    OPEN INPUT SALES-FILE.
    OPEN OUTPUT REPORT-FILE.
    READ SALES-FILE AT END MOVE 100 TO LEVEL-CONTROL
              NOT AT END MOVE  99 TO LEVEL-CONTROL
    END-READ.
    
PROGRAM-SUMMARY.
    MOVE AMOUNT-BY-FEDERAL        TO LN06-AMOUNT.
    MOVE STATE-COUNT-BY-FEDERAL   TO LN06-STATE-COUNT.
    MOVE CITY-COUNT-BY-FEDERAL    TO LN06-CITY-COUNT.
    MOVE CUSTOMER-COUNT-BY-FEDERAL    TO LN06-CUSTOMER-COUNT.
    WRITE REPORT-RECORD         FROM FEDERAL-TRAILER.
    
    CLOSE SALES-FILE REPORT-FILE.
MAIN-LINE.
    MOVE NEXT-RECORD              TO CURRENT-RECORD.
    IF   LEVEL-CONTROL  >=  20    PERFORM STATE-INITIAL.
    IF   LEVEL-CONTROL  >=  10    PERFORM CITY-INITIAL.
    PERFORM CUSTOMER-NORMAL-PROCESS.
    
    PERFORM GET-NEXT-RECORD.

    IF   LEVEL-CONTROL  >=  10    PERFORM CITY-SUMMARY.
    IF   LEVEL-CONTROL  >=  20    PERFORM STATE-SUMMARY.
    
STATE-INITIAL.
    MOVE ZERO                     TO AMOUNT-BY-STATE.
    MOVE ZERO                     TO CITY-COUNT-BY-STATE.
    MOVE ZERO                     TO CUSTOMER-COUNT-BY-STATE.
    MOVE CURRENT-STATE            TO LN01-STATE.
    WRITE REPORT-RECORD         FROM STATE-HEADER.
    
CITY-INITIAL.
    MOVE ZERO                     TO AMOUNT-BY-CITY.
    MOVE ZERO                     TO CUSTOMER-COUNT-BY-CITY.
    MOVE CURRENT-CITY             TO LN02-CITY.
    WRITE REPORT-RECORD         FROM CITY-HEADER.

CUSTOMER-NORMAL-PROCESS.
    MOVE CURRENT-CUSTOMER         TO LN03-CUSTOMER.
    MOVE CURRENT-AMOUNT           TO LN03-AMOUNT.
    WRITE REPORT-RECORD         FROM CUSTOMER-DETAIL.
    ADD  CURRENT-AMOUNT           TO AMOUNT-BY-CITY.
    ADD  1                        TO CUSTOMER-COUNT-BY-CITY.


GET-NEXT RECORD.
    READ SALES-FILE   AT END MOVE 100 TO LEVEL-CONTROL
                  NOT AT END PERFORM SET-LEVEL-CONTROL
    END-READ.

SET-LEVEL-CONTROL.
    IF   NEXT-STATE  NOT = CURRENT-STATE 
	 MOVE 20                  TO LEVEL-CONTROL
    ELSE IF   NEXT-CITY  NOT = CURRENT-CITY 
         MOVE 10                  TO LEVEL-CONTROL
	 ELSE MOVE 0              TO LEVEL-CONTROL.
CITY-SUMMARY.
    MOVE CURRENT-CITY             TO LN04-CITY.
    MOVE AMOUNT-BY-CITY           TO LN04-AMOUNT.
    MOVE CUSTOMER-COUNT-BY-CITY   TO LN04-CUSTOMER-COUNT.
    WRITE REPORT-RECORD         FROM CITY-TRAILER.
    ADD  AMOUNT-BY-CITY           TO AMOUNT-BY-STATE.
    ADD  CUSTOMER-COUNT-BY-CITY   TO CUSTOMER-COUNT-BY-STATE.
    ADD  1                        TO CITY-COUNT-BY-STATE.

STATE-SUMMARY.
    MOVE CURRENT-STATE            TO LN05-STATE.
    MOVE AMOUNT-BY-STATE          TO LN05-AMOUNT.
    MOVE CITY-COUNT-BY-STATE      TO LN05-CITY-COUNT.
    MOVE CUSTOMER-COUNT-BY-STATE  TO LN05-CUSTOMER-COUNT.
    WRITE REPORT-RECORD         FROM STATE-TRAILER.
    ADD  AMOUNT-BY-STATE          TO AMOUNT-BY-FEDERAL.
    ADD  CUSTOMER-COUNT-BY-STATE  TO CUSTOMER-COUNT-BY-FEDERAL.
    ADD  CITY-COUNT-BY-STATE      TO CITY-COUNT-BY-FEDERAL.
    ADD  1                        TO STATE-COUNT-BY-FEDERAL.