IDENTIFICATION DIVISION.
PROGRAM-ID. RPT1000.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CUST-FILE
ASSIGN TO "customers.isam"
ORGANIZATION IS INDEXED
ACCESS MODE IS SEQUENTIAL
RECORD KEY IS CUST-KEY
FILE STATUS IS CUST-STATUS.
SELECT RPT-FILE
ASSIGN TO "report.txt"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS RPT-STATUS.
DATA DIVISION.
FILE SECTION.
FD CUST-FILE
RECORD CONTAINS 80 CHARACTERS.
01 CUST-REC.
05 CUST-KEY.
10 BRANCH-NUM PIC 9(02).
10 CUST-NUM PIC 9(05).
05 CUST-NAME PIC X(28).
05 FILLER PIC X(05).
05 SALES-THIS-YTD PIC 9(9)V99.
05 SALES-LAST-YTD PIC 9(9)V99.
05 FILLER PIC X(23). *> pad to record length (80)
FD RPT-FILE.
01 RPT-LINE PIC X(132).
WORKING-STORAGE SECTION.
COPY "genaicob.book".
77 CUST-STATUS PIC XX VALUE SPACES.
77 RPT-STATUS PIC XX VALUE SPACES.
77 PAGE-NO PIC 9(4) VALUE 1.
77 LINE-COUNT PIC 9(3) VALUE 0.
77 LINES-PER-PAGE PIC 9(3) VALUE 60.
77 CURR-BRANCH PIC 9(02) VALUE 00.
77 FIRST-RECORD PIC X VALUE "Y".
77 CHANGE-AMT PIC S9(11)V99 VALUE 0.
77 CHANGE-PCT PIC S9(5)V9 VALUE 0. *> one decimal
77 BR-TOT-THIS PIC S9(13)V99 VALUE 0.
77 BR-TOT-LAST PIC S9(13)V99 VALUE 0.
77 BR-TOT-CHG PIC S9(13)V99 VALUE 0.
77 WS-DATE-YYYY PIC 9(4).
77 WS-DATE-MM PIC 9(2).
77 WS-DATE-DD PIC 9(2).
77 WS-TIME-HH PIC 9(2).
77 WS-TIME-MM PIC 9(2).
* Edited fields for display (with trailing minus like sample)
01 EDIT-FIELDS.
05 E-BRANCH PIC ZZ9.
05 E-CUST-NUM PIC Z(5).
05 E-CUST-NAME PIC X(28).
05 E-THIS PIC ZZ,ZZZ,ZZZ,ZZ9.99-.
05 E-LAST PIC ZZ,ZZZ,ZZZ,ZZ9.99-.
05 E-CHG PIC ZZ,ZZZ,ZZZ,ZZ9.99-.
05 E-PCT PIC ZZZ9.9-.
05 E-BR-TOT-THIS PIC ZZ,ZZZ,ZZZ,ZZ9.99-.
05 E-BR-TOT-LAST PIC ZZ,ZZZ,ZZZ,ZZ9.99-.
05 E-BR-TOT-CHG PIC ZZ,ZZZ,ZZZ,ZZ9.99-.
01 WS-HEAD1.
05 FILLER PIC X(90)
VALUE "------------------------------------------------------------------------------------------".
01 WS-HEAD2.
05 FILLER PIC X(7) VALUE "DATE: ".
05 H-DATE PIC X(10) VALUE SPACES.
05 FILLER PIC X(11) VALUE SPACES.
05 FILLER PIC X(29) VALUE "YEAR-TO-DATE SALES REPORT".
05 FILLER PIC X(18) VALUE SPACES.
05 FILLER PIC X(7) VALUE "PAGE: ".
05 H-PAGE PIC X(4) VALUE SPACES.
01 WS-HEAD3.
05 FILLER PIC X(7) VALUE "TIME: ".
05 H-TIME PIC X(5) VALUE SPACES.
05 FILLER PIC X(58) VALUE SPACES.
05 FILLER PIC X(6) VALUE "RPT1000".
01 WS-HEAD4.
05 FILLER PIC X(90)
VALUE "------------------------------------------------------------------------------------------".
01 WS-HEAD5.
05 FILLER PIC X(2) VALUE SPACES.
05 FILLER PIC X(6) VALUE "BRANCH".
05 FILLER PIC X(3) VALUE SPACES.
05 FILLER PIC X(4) VALUE "CUST".
05 FILLER PIC X(28) VALUE SPACES.
05 FILLER PIC X(5) VALUE "SALES".
05 FILLER PIC X(11) VALUE SPACES.
05 FILLER PIC X(5) VALUE "SALES".
05 FILLER PIC X(9) VALUE SPACES.
05 FILLER PIC X(6) VALUE "CHANGE".
05 FILLER PIC X(5) VALUE SPACES.
05 FILLER PIC X(6) VALUE "CHANGE".
01 WS-HEAD6.
05 FILLER PIC X(2) VALUE SPACES.
05 FILLER PIC X(4) VALUE "NUM".
05 FILLER PIC X(5) VALUE SPACES.
05 FILLER PIC X(3) VALUE "NUM".
05 FILLER PIC X(2) VALUE SPACES.
05 FILLER PIC X(13) VALUE "CUSTOMER NAME".
05 FILLER PIC X(14) VALUE SPACES.
05 FILLER PIC X(9) VALUE "THIS YTD".
05 FILLER PIC X(6) VALUE SPACES.
05 FILLER PIC X(8) VALUE "LAST YTD".
05 FILLER PIC X(7) VALUE SPACES.
05 FILLER PIC X(6) VALUE "AMOUNT".
05 FILLER PIC X(5) VALUE SPACES.
05 FILLER PIC X(7) VALUE "PERCENT".
01 WS-HEAD7.
05 FILLER PIC X(90)
VALUE "------------------------------------------------------------------------------------------".
01 WS-HEAD8.
05 FILLER PIC X(90)
VALUE "------------------------------------------------------------------------------------------".
01 DETAIL-LINE.
05 FILLER PIC X(1) VALUE SPACE.
05 D-BRANCH PIC ZZ9.
05 FILLER PIC X(3) VALUE SPACE.
05 D-CUST-NUM PIC Z(5).
05 FILLER PIC X(2) VALUE SPACE.
05 D-CUST-NAME PIC X(28).
05 FILLER PIC X(2) VALUE SPACE.
05 D-THIS PIC ZZ,ZZZ,ZZZ,ZZ9.99-.
05 FILLER PIC X(5) VALUE SPACE.
05 D-LAST PIC ZZ,ZZZ,ZZZ,ZZ9.99-.
05 FILLER PIC X(6) VALUE SPACE.
05 D-CHG PIC ZZ,ZZZ,ZZZ,ZZ9.99-.
05 FILLER PIC X(4) VALUE SPACE.
05 D-PCT PIC ZZZ9.9-.
01 BRANCH-TOTAL-LINE.
05 FILLER PIC X(20) VALUE SPACES.
05 FILLER PIC X(20) VALUE "BRANCH TOTAL".
05 FILLER PIC X(6) VALUE SPACES.
05 BT-THIS PIC ZZ,ZZZ,ZZZ,ZZ9.99-.
05 FILLER PIC X(5) VALUE SPACES.
05 BT-LAST PIC ZZ,ZZZ,ZZZ,ZZ9.99-.
05 FILLER PIC X(5) VALUE SPACES.
05 BT-CHG PIC ZZ,ZZZ,ZZZ,ZZ9.99-.
01 FILL-LINE PIC X(1) VALUE SPACE.
01 CD PIC X(21).
88 CD-VALID VALUE "YYYYMMDDHHMMSS+HHMM".
01 CURR-DATE REDEFINES CD.
05 CD-YYYY PIC 9(4).
05 CD-MM PIC 9(2).
05 CD-DD PIC 9(2).
05 CD-HH PIC 9(2).
05 CD-MI PIC 9(2).
05 CD-SS PIC 9(2).
05 CD-GMT PIC X(5).
PROCEDURE DIVISION.
MAIN-LOGIC.
OPEN INPUT CUST-FILE
OUTPUT RPT-FILE
IF CUST-STATUS NOT = "00" AND CUST-STATUS NOT = "97"
DISPLAY "OPEN ERROR CUST-FILE STATUS=" CUST-STATUS
STOP RUN
END-IF
IF RPT-STATUS NOT = "00"
DISPLAY "OPEN ERROR RPT-FILE STATUS=" RPT-STATUS
STOP RUN
END-IF
MOVE FUNCTION CURRENT-DATE TO CD
MOVE CD-DD TO WS-DATE-DD
MOVE CD-MM TO WS-DATE-MM
MOVE CD-YYYY TO WS-DATE-YYYY
MOVE CD-HH TO WS-TIME-HH
MOVE CD-MI TO WS-TIME-MM
PERFORM PRINT-HEADERS
READ CUST-FILE NEXT RECORD
AT END GO TO CLOSE-AND-EXIT
END-READ
PERFORM UNTIL CUST-STATUS = "10"
IF FIRST-RECORD = "Y"
MOVE BRANCH-NUM TO CURR-BRANCH
MOVE "N" TO FIRST-RECORD
END-IF
IF BRANCH-NUM NOT = CURR-BRANCH
PERFORM PRINT-BRANCH-TOTALS
MOVE BRANCH-NUM TO CURR-BRANCH
MOVE 0 TO BR-TOT-THIS BR-TOT-LAST BR-TOT-CHG
PERFORM CHECK-PAGE-LINES
END-IF
PERFORM BUILD-AND-WRITE-DETAIL
ADD SALES-THIS-YTD TO BR-TOT-THIS
ADD SALES-LAST-YTD TO BR-TOT-LAST
ADD CHANGE-AMT TO BR-TOT-CHG
READ CUST-FILE NEXT RECORD
AT END
PERFORM PRINT-BRANCH-TOTALS
EXIT PERFORM
END-READ
END-PERFORM
CLOSE-AND-EXIT.
CLOSE CUST-FILE RPT-FILE
CALL "genaicob" USING "report.txt" & X"00".
STOP RUN.
PRINT-HEADERS.
MOVE WS-DATE-DD TO H-DATE (1:2)
MOVE "/" TO H-DATE (3:1)
MOVE WS-DATE-MM TO H-DATE (4:2)
MOVE "/" TO H-DATE (6:1)
MOVE WS-DATE-YYYY TO H-DATE (7:4)
MOVE WS-TIME-HH TO H-TIME (1:2)
MOVE ":" TO H-TIME (3:1)
MOVE WS-TIME-MM TO H-TIME (4:2)
MOVE PAGE-NO TO H-PAGE
INSPECT H-PAGE REPLACING LEADING SPACES BY "0"
MOVE WS-HEAD1 TO RPT-LINE WRITE RPT-LINE
MOVE WS-HEAD2 TO RPT-LINE WRITE RPT-LINE
MOVE WS-HEAD3 TO RPT-LINE WRITE RPT-LINE
MOVE WS-HEAD4 TO RPT-LINE WRITE RPT-LINE
MOVE WS-HEAD5 TO RPT-LINE WRITE RPT-LINE
MOVE WS-HEAD6 TO RPT-LINE WRITE RPT-LINE
MOVE WS-HEAD7 TO RPT-LINE WRITE RPT-LINE
MOVE WS-HEAD8 TO RPT-LINE WRITE RPT-LINE
MOVE 8 TO LINE-COUNT
.
CHECK-PAGE-LINES.
IF LINE-COUNT > (LINES-PER-PAGE - 5)
ADD 1 TO PAGE-NO
MOVE 0 TO LINE-COUNT
PERFORM PRINT-HEADERS
END-IF
.
BUILD-AND-WRITE-DETAIL.
PERFORM CHECK-PAGE-LINES
COMPUTE CHANGE-AMT = SALES-THIS-YTD - SALES-LAST-YTD
IF SALES-LAST-YTD = 0
IF SALES-THIS-YTD = 0
MOVE 0 TO CHANGE-PCT
ELSE
MOVE 9999 TO CHANGE-PCT *> 999.9 shown by edited mask
MOVE 9 TO CHANGE-PCT *> ensure one decimal as 999.9
COMPUTE CHANGE-PCT = 999.9
END-IF
ELSE
COMPUTE CHANGE-PCT =
(CHANGE-AMT / SALES-LAST-YTD) * 100
END-IF
MOVE BRANCH-NUM TO D-BRANCH
MOVE CUST-NUM TO D-CUST-NUM
MOVE CUST-NAME TO D-CUST-NAME
MOVE SALES-THIS-YTD TO D-THIS
MOVE SALES-LAST-YTD TO D-LAST
MOVE CHANGE-AMT TO D-CHG
MOVE CHANGE-PCT TO D-PCT
*> For subsequent lines under same branch, blank the branch field
IF CUST-NUM NOT = 0
CONTINUE
END-IF
MOVE DETAIL-LINE TO RPT-LINE
WRITE RPT-LINE
ADD 1 TO LINE-COUNT
.
PRINT-BRANCH-TOTALS.
PERFORM CHECK-PAGE-LINES
MOVE BR-TOT-THIS TO BT-THIS
MOVE BR-TOT-LAST TO BT-LAST
COMPUTE BR-TOT-CHG = BR-TOT-THIS - BR-TOT-LAST
MOVE BR-TOT-CHG TO BT-CHG
MOVE SPACES TO RPT-LINE
WRITE RPT-LINE
ADD 1 TO LINE-COUNT
MOVE BRANCH-TOTAL-LINE TO RPT-LINE
WRITE RPT-LINE
ADD 1 TO LINE-COUNT
MOVE SPACES TO RPT-LINE
WRITE RPT-LINE
ADD 1 TO LINE-COUNT
.