Home Programming Books for Computer Professionals Privacy Terms
           Home   > Programming   > COBOL Book   > COBOL Preview   > COBOL Preview Chapter 8

Cobol Book Chapter 8

8. The Three Level Subtotal (Control Break) Program

BRKLV3.

Similar to the One Level Subtotal (Control Break) Program, #7 above, but now there are three levels of subtotals, corresponding to three levels of fields in the data. Typical levels might be Salesperson within State within District. If you can handle this program, you can handle a Two or Four or Six or Eleven level program.

This program is even more Real World. Most businesses are organized in a hierarchical manner - Salesperson within Department within District within Region is typical. Each level of the company has its head honcho. She or he will want to know everything about her or his level and everything under it. This report provides everything needed for those long meetings and discussions about "how we did last quarter."

Here is the program BRKLV3:

000200 IDENTIFICATION DIVISION.

000300* 3 level control break - model program

000400* this is an excellent example of a 3 level control break

000500* (subtotal) program. Use it as a model when writing yours.

000600 PROGRAM-ID. BRKLV3.

000700 ENVIRONMENT DIVISION.

000800 CONFIGURATION SECTION.

000900 INPUT-OUTPUT SECTION.

001000 FILE-CONTROL.

001100 SELECT SALES-FILE ASSIGN SALES3.

001400 SELECT REPORT-FILE ASSIGN REPORTFI.

001700*

001800 DATA DIVISION.

001900 FILE SECTION.

002000*

002100 FD SALES-FILE

002200 RECORDING MODE IS F

002400 RECORD CONTAINS 80 CHARACTERS.

002600*

002700 01 SALES-RECORD.

002800* The program assumes that the input data is sorted

002900* by salesperson within branch within state

003000 05 SR-STATE PIC X(02).

003100 05 FILLER PIC X(03).

003200 05 SR-BRANCH PIC X(10).

003400 05 SR-SALESPERSON PIC X(15).

003500 05 FILLER PIC X(05).

003600 05 SR-ITEM-SOLD PIC X(15).

003700 05 FILLER PIC X(05).

003800 05 SR-AMOUNT-SOLD PIC S9(7)V99.

003900 05 FILLER PIC X(16).

004000*

004100 FD REPORT-FILE

004200 RECORDING MODE IS F

004400 RECORD CONTAINS 133 CHARACTERS.

004600*

004700 01 REPORT-RECORD PIC X(133).

004800*

004900 WORKING-STORAGE SECTION.

005000 01 SWITCHES.

005100 05 FILE-AT-END PIC X VALUE 'N'.

005200*

005300 01 ACCUMULATORS.

005400 05 GRAND-TOTAL-ACCUM PIC S9(9)V99

005500 PACKED-DECIMAL VALUE +0.

005600 05 STATE-ACCUM PIC S9(9)V99

005700 PACKED-DECIMAL VALUE +0.

005800 05 BRANCH-ACCUM PIC S9(9)V99

005900 PACKED-DECIMAL VALUE +0.

006000 05 SALESPERSON-ACCUM PIC S9(9)V99

006100 PACKED-DECIMAL VALUE +0.

006200*

006300 01 LINE-AND-PAGE-CTRS.

006400 05 LINE-CTR PIC S9(3)

006500 PACKED-DECIMAL VALUE +0.

006600 05 MAX-LINES-PER-PAGE PIC S9(3)

006700 PACKED-DECIMAL VALUE +40.

006800 05 PAGE-CTR PIC S9(3)

006900 PACKED-DECIMAL VALUE +0.

007000* *

007100 01 SAVE-AREAS.

007200 05 SAVE-STATE PIC X(02) VALUE SPACES.

007300 05 SAVE-BRANCH PIC X(10) VALUE SPACES.

007400 05 SAVE-SALESPERSON PIC X(15) VALUE SPACES.

007500*

007600 01 PRINT-LINES.

007700 05 GRAND-TOTAL-LINE.

007800 10 FILLER PIC X(02) VALUE SPACES.

007900 10 FILLER PIC X(20)

008000 VALUE '*** GRAND TOTAL ***'.

008100 10 FILLER PIC X(43) VALUE SPACES.

008200 10 GTL-AMOUNT-SOLD PIC Z(9).99-.

008300*

008400 05 STATE-TOTAL-LINE.

008500 10 FILLER PIC X(04) VALUE SPACES.

008600 10 FILLER PIC X(20)

008700 VALUE '*** TOTAL FOR ***'.

008800 10 FILLER PIC X(02) VALUE SPACES.

008900 10 STL-STATE PIC X(02) VALUE SPACES.

009000 10 FILLER PIC X(37) VALUE SPACES.

009100 10 STL-AMOUNT-SOLD PIC Z(9).99-.

009200*

009300 05 BRANCH-TOTAL-LINE.

009400 10 FILLER PIC X(06) VALUE SPACES.

009500 10 FILLER PIC X(20)

009600 VALUE '*** TOTAL FOR ***'.

009700 10 FILLER PIC X(02) VALUE SPACES.

009800 10 BTL-BRANCH PIC X(10) VALUE SPACES.

009900 10 FILLER PIC X(27) VALUE SPACES.

010000 10 BTL-AMOUNT-SOLD PIC Z(9).99-.

010100*

010200 05 SALESPERSON-TOTAL-LINE.

010300 10 FILLER PIC X(08) VALUE SPACES.

010400 10 FILLER PIC X(20)

010500 VALUE '*** TOTAL FOR ***'.

010600 10 SLSTL-SALESPERSON PIC X(15) VALUE SPACES.

010700 10 FILLER PIC X(22) VALUE SPACES.

010800 10 SLSTL-AMOUNT-SOLD PIC Z(9).99-.

010900*

011000 05 DETAIL-PRINT-LINE.

011100 10 FILLER PIC X(05) VALUE SPACES.

011200 10 DPL-STATE PIC X(02) VALUE SPACES.

011300 10 FILLER PIC X(05) VALUE SPACES.

011400 10 DPL-BRANCH PIC X(10) VALUE SPACES.

011500 10 FILLER PIC X(06) VALUE SPACES.

011600 10 DPL-SALESPERSON PIC X(15) VALUE SPACES.

011700 10 FILLER PIC X(05) VALUE SPACES.

011800 10 DPL-ITEM-SOLD PIC X(15) VALUE SPACES.

011900 10 FILLER PIC X(04) VALUE SPACES.

012000 10 DPL-AMOUNT-SOLD PIC Z(7).99-.

012100*

012200 01 BLANK-LINE.

012300 05 FILLER PIC X(133) VALUE SPACES.

012400*

012500 01 HEADING-LINE-1.

012600 05 FILLER PIC X(30) VALUE SPACES.

012700 05 FILLER PIC X(40)

012800 VALUE 'MODEL CONTROL BREAK REPORT'.

012900 05 FILLER PIC X(50) VALUE SPACES.

013000 05 HL1-PAGE PIC ZZZ.

013100*

013200 01 HEADING-LINE-2.

013300 05 FILLER PIC X(2) VALUE SPACES.

013400 05 FILLER PIC X(10)

013500 VALUE 'STATE'.

013600 05 FILLER PIC X(16)

013700 VALUE 'BRANCH'.

013800 05 FILLER PIC X(20)

013900 VALUE 'SALESPERSON'.

014000*

014100 PROCEDURE DIVISION.

014200 PERFORM INITIALIZATION

014300 PERFORM PRODUCE-THE-REPORT

014400 UNTIL FILE-AT-END = 'Y'

014500 PERFORM TERMINATION

014600 GOBACK.

014700*

014800 INITIALIZATION.

014900 OPEN INPUT SALES-FILE

015000 OUTPUT REPORT-FILE

015100 PERFORM READ-A-RECORD

015200 MOVE SR-STATE TO SAVE-STATE

015300 MOVE SR-BRANCH TO SAVE-BRANCH

015400 MOVE SR-SALESPERSON TO SAVE-SALESPERSON

015500 MOVE ZEROS TO GTL-AMOUNT-SOLD

015600 MOVE ZEROS TO STL-AMOUNT-SOLD

015700 MOVE ZEROS TO BTL-AMOUNT-SOLD

015800 MOVE ZEROS TO SLSTL-AMOUNT-SOLD

015900 MOVE ZEROS TO DPL-AMOUNT-SOLD

016000 PERFORM PRINT-HEADER-LINES.

016100*

016200 PRODUCE-THE-REPORT.

016300 IF SR-STATE IS NOT EQUAL TO SAVE-STATE

016400 THEN PERFORM STATE-BREAK

016500 END-IF

016600*

016700 IF SR-BRANCH IS NOT EQUAL TO SAVE-BRANCH

016800 THEN PERFORM BRANCH-BREAK

016900 END-IF

017000*

017100 IF SR-SALESPERSON IS NOT EQUAL TO SAVE-SALESPERSON

017200 THEN PERFORM SALESPERSON-BREAK

017300 END-IF

017400*

017500 PERFORM DETAIL-PROCESSING

017600 PERFORM READ-A-RECORD.

017700

017800 DETAIL-PROCESSING.

017900* Add detail amount to lowest level (salesperson) total.

018000* format detail line for printing.

018100* print detail line.

018200 ADD SR-AMOUNT-SOLD TO SALESPERSON-ACCUM

018300 MOVE SR-STATE TO DPL-STATE

018400 MOVE SR-BRANCH TO DPL-BRANCH

018500 MOVE SR-SALESPERSON TO DPL-SALESPERSON

018600 MOVE SR-ITEM-SOLD TO DPL-ITEM-SOLD

018700 MOVE SR-AMOUNT-SOLD TO DPL-AMOUNT-SOLD

018800 WRITE REPORT-RECORD FROM DETAIL-PRINT-LINE

018900 AFTER ADVANCING 1 LINE

019000 ADD 1 TO LINE-CTR

019100 IF LINE-CTR IS GREATER THAN MAX-LINES-PER-PAGE

019200 THEN PERFORM PRINT-HEADER-LINES

019300 END-IF.

019400*

019500 STATE-BREAK.

019600* Highest level break.

019700* perform next lower level break (branch)

019800* write out this level (state) totals

019900* add this level totals (state) to next level (grand total)

020000* zero out this level totals (state)

020100* save this level input field (save input state)

020200* if program requirements dictate, perform print-header-lines.

020300*

020400 PERFORM BRANCH-BREAK

020500 PERFORM PRINT-STATE-TOTALS

020600 ADD STATE-ACCUM TO GRAND-TOTAL-ACCUM

020700 MOVE ZERO TO STATE-ACCUM

020800 MOVE SR-STATE TO SAVE-STATE.

020900*

021000 BRANCH-BREAK.

021100* Middle level break

021200* perform next level break (salesperson)

021300* write out this level totals (branch)

021400* add this level totals (branch) to next level (state)

021500* zero out this level totals (branch)

021600* save this level input field (save input branch)

021700*

021800 PERFORM SALESPERSON-BREAK

021900 PERFORM PRINT-BRANCH-TOTALS

022000 ADD BRANCH-ACCUM TO STATE-ACCUM

022100 MOVE ZERO TO BRANCH-ACCUM

022200 MOVE SR-BRANCH TO SAVE-BRANCH.

022300*

022400 SALESPERSON-BREAK.

022500* Lowest level break

022600* write out this level totals (salesperson)

022700* add this level total (salesperson) to next level (branch)

022800* zero out this level totals (salesperson)

022900* save this level input field (save input salesperson)

023000*

023100 PERFORM PRINT-SALESPERSON-TOTALS

023200 ADD SALESPERSON-ACCUM TO BRANCH-ACCUM

023300 MOVE ZERO TO SALESPERSON-ACCUM

023400 MOVE SR-SALESPERSON TO SAVE-SALESPERSON.

023500*

023600 PRINT-STATE-TOTALS.

023700 MOVE SAVE-STATE TO STL-STATE

023800 MOVE STATE-ACCUM TO STL-AMOUNT-SOLD

023900 WRITE REPORT-RECORD FROM STATE-TOTAL-LINE

024000 AFTER ADVANCING 3 LINES

024100 WRITE REPORT-RECORD FROM BLANK-LINE

024200 AFTER ADVANCING 2 LINES

024300 ADD 5 TO LINE-CTR

024400 IF LINE-CTR IS GREATER THAN MAX-LINES-PER-PAGE

024500 THEN PERFORM PRINT-HEADER-LINES

024600 END-IF.

024700*

024800 PRINT-BRANCH-TOTALS.

024900 MOVE SAVE-BRANCH TO BTL-BRANCH

025000 MOVE BRANCH-ACCUM TO BTL-AMOUNT-SOLD

025100 WRITE REPORT-RECORD FROM BRANCH-TOTAL-LINE

025200 AFTER ADVANCING 3 LINES

025300 WRITE REPORT-RECORD FROM BLANK-LINE

025400 AFTER ADVANCING 2 LINES

025500 ADD 5 TO LINE-CTR

025600 IF LINE-CTR IS GREATER THAN MAX-LINES-PER-PAGE

025700 THEN PERFORM PRINT-HEADER-LINES

025800 END-IF.

025900*

026000 PRINT-SALESPERSON-TOTALS.

026100 MOVE SAVE-SALESPERSON TO SLSTL-SALESPERSON

026200 MOVE SALESPERSON-ACCUM TO SLSTL-AMOUNT-SOLD

026300 WRITE REPORT-RECORD FROM SALESPERSON-TOTAL-LINE

026400 AFTER ADVANCING 3 LINES

026500 WRITE REPORT-RECORD FROM BLANK-LINE

026600 AFTER ADVANCING 2 LINES

026700 ADD 5 TO LINE-CTR

026800 IF LINE-CTR IS GREATER THAN MAX-LINES-PER-PAGE

026900 THEN PERFORM PRINT-HEADER-LINES

027000 END-IF.

027100*

027200 PRINT-GRAND-TOTALS.

027300 MOVE GRAND-TOTAL-ACCUM TO GTL-AMOUNT-SOLD

027400 WRITE REPORT-RECORD FROM GRAND-TOTAL-LINE

027500 AFTER ADVANCING 3 LINES.

027600*

027700 PRINT-HEADER-LINES.

027800 ADD 1 TO PAGE-CTR

027900 MOVE PAGE-CTR TO HL1-PAGE

028000 MOVE 0 TO LINE-CTR

028100 WRITE REPORT-RECORD FROM HEADING-LINE-1

028200 AFTER ADVANCING PAGE

028300 WRITE REPORT-RECORD FROM HEADING-LINE-2

028400 AFTER ADVANCING 1 LINE

028500 WRITE REPORT-RECORD FROM BLANK-LINE

028600 AFTER ADVANCING 3 LINES.

028700*

028800 READ-A-RECORD.

028900 READ SALES-FILE

029000 AT END MOVE 'Y' TO FILE-AT-END

029200 END-READ.

030100*

030200 TERMINATION.

030300 PERFORM STATE-BREAK

030400 PERFORM PRINT-GRAND-TOTALS

030500 CLOSE SALES-FILE

030600 REPORT-FILE.

Here is the input data file SALES3: (the next two lines are a column ruler)

1 2 3 4 5 6

123456789.123456789.123456789.123456789.123456789.123456789.12345678

CT HARTFORD ANN T. HILL CHEVELLE 000800000

CT HARTFORD SAL MONELLA FERRARI 006000000

CT NEW HAVEN ANNA KONDA OMNI 000030000

CT NEW HAVEN ANNA KONDA STING RAY 000200000

CT NEW HAVEN ANNA KONDA STING RAY 000200000

CT NEW HAVEN ANNA KONDA STING RAY 000200000

CT NEW HAVEN BILL COLLECTOR CAMARO 000600000

CT NEW HAVEN CAL ZONI JAGUAR 009000000

CT NEW HAVEN CAL ZONI PEUGEOT 000200000

CT NEW HAVEN ROSE BUSH PINTO 000040000

MA BOSTON MOE PEDD HONDA 000010000

MA BOSTON RON ZONEY LEMON 000020000

MA BOSTON RON ZONEY SUBARU 000010000

MI DETROIT LEN GUINI EDSEL 000000010

MI DETROIT LEN GUINI FIAT 004000000

MI DETROIT LEN GUINI FORD 000020000

MI DETROIT LEN GUINI STUDEBAKER 000000600

NY ALBANY MAC A. RONEY CONTINENTAL 002000000

NY ALBANY MAC A. RONEY ESCORT 000010000

NY ALBANY MAC A. RONEY FORD 000010000

NY ALBANY MAC A. RONEY HYUNDAI 000010000

NY ALBANY MAC A. RONEY HYUNDAI 000010000

NY ROCHESTER BILL E. GOAT MASERATI 000001000

Here is sample JCL:

//STEP1 EXEC PGM=BRKLV3

//STEPLIB DD DSN=your.executable.program.library.goes.here,DISP=SHR

//*OF COURSE, THE NEXT LIBRARY NAME MAY BE DIFFERENT AT YOUR COMPANY

//SALES3 DD DSN=userid.CLASS.DATA(SALES3),DISP=SHR

//REPORTFI DD SYSOUT=*

//SYSOUT DD SYSOUT=*

//SYSUDUMP DD SYSOUT=*

Cobol Book Main Page

Top of Page