---------------------------------------------------------------------------------- 
     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 current-record 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 LINE SEQUENTIAL.
     
     SELECT REPORT-FILE ASSIGN TO PRNTFILE
     ORGANIZATION IS LINE SEQUENTIAL.
     DATA DIVISION.
     FILE SECTION.
     
     FD SALES-FILE
     RECORD CONTAINS 60 CHARACTERS
     DATA RECORD IS NEXT-RECORD.
     01 NEXT-RECORD.
     
     05 NEXT-STATE PIC X(2).
     05 NEXT-CITY PIC X(20).
     05 FILLER PIC X(30).
     05 FILLER 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 FILLER PIC X(7) VALUE " STATE ".
     05 LN01-STATE PIC X(2).
      
     
     01 CITY-HEADER.
     05 FILLER PIC X(9) VALUE " CITY ".
     05 LN02-CITY PIC X(20).
      
     
     01 CUSTOMER-DETAIL.
     05 FILLER PIC X(5) VALUE SPACES.
     05 LN03-CUSTOMER PIC X(30).
     05 FILLER PIC X(5) VALUE SPACES.
     
     05 LN03-AMOUNT PIC ----,--9.99.
      
     01 CITY-TRAILER.
     05 FILLER PIC X(6) VALUE " CITY ".
     
     05 LN04-CITY PIC X(20).
     05 FILLER PIC X(5) VALUE SPACES.
     05 LN04-AMOUNT PIC ---,---,--9.99.
     05 FILLER PIC X(5) VALUE SPACES.
     
     05 LN04-CUSTOMER-COUNT PIC ZZZ,ZZ9.
     05 FILLER PIC X(12) VALUE " CUSTOMERS ".
      
     01 STATE-TRAILER.
     
     05 FILLER PIC X(10) VALUE " STATE ".
     05 LN05-STATE PIC X(2).
     05 FILLER PIC X(5) VALUE SPACES.
     05 LN05-AMOUNT PIC ---,---,--9.99.
     
     05 FILLER PIC X(5) VALUE SPACES.
     05 LN05-CITY-COUNT PIC ZZZ,ZZ9.
     05 FILLER PIC X(9) VALUE " CITIES ".
     05 LN05-CUSTOMER-COUNT PIC ZZZ,ZZ9.
     
     05 FILLER PIC X(12) VALUE " CUSTOMERS ".
      
     01 FEDERAL-TRAILER.
     05 FILLER PIC X(9) VALUE " FEDERAL ".
     
     05 LN06-AMOUNT PIC ---,---,--9.99.
     05 FILLER PIC X(5) VALUE SPACES.
     05 LN06-CUSTOMER-COUNT PIC ZZZ,ZZ9.
     05 FILLER PIC X(12) VALUE " CUSTOMERS ".
     
     05 LN06-CITY-COUNT PIC ZZZ,ZZ9.
     05 FILLER PIC X(9) VALUE " CITIES ".
     05 LN06-STATE-COUNT PIC ZZZ,ZZ9.
     05 FILLER PIC X(9) VALUE " STATES ".
     
      
     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 CUSTOMER-COUNT-BY-FEDERAL TO LN06-CUSTOMER-COUNT.
     MOVE CITY-COUNT-BY-FEDERAL TO LN06-CITY-COUNT.
     
     MOVE STATE-COUNT-BY-FEDERAL TO LN06-STATE-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.