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

3. The Simple, Single File Report Program with Record Count or Final Totals

SEQRPT2.

Same as The Simple, Single File Report Program, #2 above, but also counts records, or accumulates totals. Then at the end of the file, it prints a record count or total of some money amount.

This type of program may not sound very difficult. It is not. But it is extremely useful: it is the meat and potatoes of many businesses. It absolutely must be accurate: It prints out in clear usable form the entire business’ or business application’s records. Final or grand totals answer the questions: "How much did we produce last year?", "What is the bottom line? "

Here is the program SEQRPT2:

000200 IDENTIFICATION DIVISION.

000300 PROGRAM-ID. SEQRPT2.

000400* Read and print every record

000500* header line, detail line, page change, final total

000600* & rec count

000700 ENVIRONMENT DIVISION.

000800 CONFIGURATION SECTION.

000900 INPUT-OUTPUT SECTION.

001000 FILE-CONTROL.

001100* INPUT FILE: PARTS

001200 SELECT IN-FILE ASSIGN PARTS.

001500* OUTFILE: SEND TO PRINTER

001600 SELECT OUT-FILE ASSIGN OUTFILE.

001900 DATA DIVISION.

002000 FILE SECTION.

002100 FD IN-FILE

002110 RECORDING MODE IS F

002500 RECORD CONTAINS 80 CHARACTERS.

002600 01 IN-RECORD PIC X(80).

002610 05 PART-NUMBER PIC X(6).

002620 05 filler pic x.

002630 05 PART-DESC PIC X(30).

002640 05 filler pic x.

002650 05 QTY-ON-HAND PIC 9(3).

002660 05 filler pic x.

002670 05 QTY-ON-ORDER PIC 9(3).

002680 05 filler pic x.

002690 05 QTY-ON-RESERVE PIC 9(3).

002700 05 filler pic x.

002710 05 PART-PRICE PIC 9(3)V99.

002720 05 UNUSED PIC X(25).

002730

002800 FD OUT-FILE

002810 RECORDING MODE IS F

003000* Record length can be more than input file

003100* because you are printing, not copying to a file

003200 RECORD CONTAINS 133 CHARACTERS.

003500 01 OUT-RECORD PIC X(133).

003600

003700 WORKING-STORAGE SECTION.

003800 01 SWITCHES.

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

004000 01 COUNTERS-AND-ACCUMULATORS.

004100 05 LINES-PRINTED PIC S9(5) PACKED-DECIMAL

004200 VALUE ZERO.

004300 05 INPUT-RECORD-COUNT PIC S9(5) PACKED-DECIMAL

004400 VALUE ZERO.

004500 05 TOTAL-QUANTITY PIC S9(7) PACKED-DECIMAL

004600 VALUE ZERO.

004700 05 OUTPUT-RECORD-COUNT PIC S9(5) PACKED-DECIMAL

004800 VALUE ZERO.

004900 05 MAX-PER-PAGE PIC S9(5) PACKED-DECIMAL

005000 VALUE +55.

005100

006600 01 WS-OUT-RECORD.

006700* We will use edit fields for the numeric fields

006800* we are using fillers between the fields for legibility

006900* Leave first character position blank

007000* because of after advancing

007100 05 FILLER PIC X(3) VALUE SPACES.

007200 05 OUT-PART-NUMBER PIC X(6).

007300 05 FILLER PIC X(3) VALUE SPACES.

007400 05 OUT-PART-DESC PIC X(30).

007500 05 FILLER PIC X(3) VALUE SPACES.

007600 05 OUT-QTY-ON-HAND PIC ZZ9.

007700 05 FILLER PIC X(3) VALUE SPACES.

007800 05 OUT-QTY-ON-ORDER PIC ZZ9.

007900 05 FILLER PIC X(3) VALUE SPACES.

008000 05 OUT-QTY-ON-RESERVE PIC ZZ9.

008100 05 FILLER PIC X(3) VALUE SPACES.

008200 05 OUT-PART-PRICE PIC ZZZ.99.

008300 05 FILLER PIC X(3) VALUE SPACES.

008400 05 OUT-UNUSED PIC X(30).

008500 05 FILLER PIC X(31) VALUE SPACES.

008600

008700 01 HEADER-1.

008800* Leave first character position blank

008900* because of after advancing

009000 05 FILLER PIC X VALUE SPACE.

009100 05 FILLER PIC X(80)

009200 VALUE 'PRINT OF DATA FILE FOR ABC COMPANY'.

009300

009400 01 FINAL-TOTAL-LINE.

009500* LEAVE FIRST CHARACTER POSITION BLANK

009600* BECAUSE OF AFTER ADVANCING

009700 05 FILLER PIC X VALUE SPACE.

009800 05 FILLER PIC X(20)

009900 VALUE 'TOTAL QUANTITY '.

010000 05 FILLER PIC X VALUE SPACE.

010100 05 PRINT-TOTAL-QUANTITY PIC Z(7)-.

010200 05 FILLER PIC X(20)

010300 VALUE ' RECORDS READ '.

010400 05 FILLER PIC X VALUE SPACE.

010500 05 PRINT-INPUT-RECORD-COUNT PIC Z(7)-.

010600

010700 PROCEDURE DIVISION.

010800 PERFORM INITIALIZATION

010900* UPPER CASE Y, PLEASE

011000 PERFORM PROCESS-ALL

011100 UNTIL FILE-AT-END = 'Y'

011200 PERFORM TERMINATION

011300 GOBACK.

011400

011500 INITIALIZATION.

011600 OPEN INPUT IN-FILE

011700 OUTPUT OUT-FILE

011800 PERFORM HEADING-ROUTINE

011900 PERFORM READ-PAR.

012000

012100 PROCESS-ALL.

012200 IF LINES-PRINTED > MAX-PER-PAGE

012300 THEN

012400 PERFORM HEADING-ROUTINE

012500 END-IF

012600 ADD QTY-ON-HAND TO TOTAL-QUANTITY

012700 MOVE PART-NUMBER TO OUT-PART-NUMBER

012800 MOVE PART-DESC TO OUT-PART-DESC

012900 MOVE QTY-ON-HAND TO OUT-QTY-ON-HAND

013000 MOVE QTY-ON-ORDER TO OUT-QTY-ON-ORDER

013100 MOVE QTY-ON-RESERVE TO OUT-QTY-ON-RESERVE

013200 MOVE PART-PRICE TO OUT-PART-PRICE

013300 MOVE UNUSED TO OUT-UNUSED

013400 WRITE OUT-RECORD FROM WS-OUT-RECORD

013500 AFTER ADVANCING 1 LINE

013600 ADD 1 TO OUTPUT-RECORD-COUNT

013700 ADD 1 TO LINES-PRINTED

013800 PERFORM READ-PAR.

013900

014000 TERMINATION.

014100 MOVE TOTAL-QUANTITY TO PRINT-TOTAL-QUANTITY

014200 MOVE INPUT-RECORD-COUNT TO PRINT-INPUT-RECORD-COUNT

014300 WRITE OUT-RECORD FROM FINAL-TOTAL-LINE

014400 AFTER ADVANCING 5 LINES

014500 CLOSE IN-FILE OUT-FILE.

014600

014700 READ-PAR.

014800 READ IN-FILE

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

015000 NOT AT END ADD 1 TO INPUT-RECORD-COUNT

015100 END-READ.

015200

015300 HEADING-ROUTINE.

015400 WRITE OUT-RECORD FROM HEADER-1 AFTER ADVANCING PAGE

015500 MOVE 0 TO LINES-PRINTED.

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

1 2 3 4 5 6

123456789.123456789.123456789.123456789.123456789.123456789.12345678

PART01 LEFT HANDED WIDGET WRENCHES 003 007 002 10022

PART02 LEAD-WINGED GLIDERS 004 006 001 14054

PART04 LEFT FOOT REEBOKS 021 002 004 04323

PART06 286 COMPUTERS W 4K HARD DISK 043 077 012 00042

Here is sample JCL:

//STEP1 EXEC PGM=SEQRPT2

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

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

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

//OUTFILE DD SYSOUT=*

//SYSOUT DD SYSOUT=*

//SYSUDUMP DD SYSOUT=*

 

Cobol Book Main Page

Top of Page