IDENTIFICATION DIVISION.
PROGRAM-ID. PROG5.
*
ENVIRONMENT DIVISION.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STORE-FILE-IN
ASSIGN TO KEYBOARD
ORGANIZATION IS LINE SEQUENTIAL.
SELECT STORE-FILE-OUT
ASSIGN TO DISPLAY
ORGANIZATION IS LINE SEQUENTIAL.
*
*
*
*
*
DATA DIVISION.
*
*
FILE SECTION.
*
*
FD STORE-FILE-IN.
*
01 STORE-RECORD-IN PIC X(25).
*
FD STORE-FILE-OUT.
*
01 STORE-RECORD-OUT PIC X(120).
*
WORKING-STORAGE SECTION.
*
01 WS-MORE-INPUT PIC X(01) VALUE "Y".
*
01 WS-ERROR-FLAG PIC X(01) VALUE "Y".
*
01 WS-ERROR-FIELDS PIC 9(01) VALUE 0.
*
01 WS-GOOD-RECORD PIC X(01) VALUE "Y".
*
01 WS-RECORD-COUNT PIC 9(01) VALUE 0.
*
01 WS-STORE-RECORD-IN.
05 PIC X(01).
05 DISTRICT-CODE-IN PIC X(02).
88 VALID-DISTRICT-CODE VALUE "20" THRU "80".
88 DISTRICT-CODE-BLANK VALUE SPACES.
05 PIC X(01).
05 STORE-CODE-IN.
88 STORE-CODE-BLANK VALUE SPACES.
10 STORE-CODE-1-IN PIC X(01).
10 STORE-CODE-2-IN PIC X(01).
88 VALID-STORE-CODE VALUE "C" THRU "L".
10 STORE-CODE-3-IN PIC X(01).
05 PIC X(01).
05 DEPARTMENT-CODE-IN.
88 DEPARTMENT-CODE-BLANK VALUE SPACES.
10 DEPT-CODE-1-IN PIC X(02).
10 DEPT-CODE-2-IN PIC X(03).
05 PIC X(01).
05 TRANSACTION-TYPE-IN PIC X(02).
88 TRANSACTION-TYPE-BLANK VALUE SPACES.
05 PIC X(01).
05 TRANSACTION-AMOUNT-IN-X PIC X(07).
88 TRANSACTION-AMOUNT-BLANK VALUE SPACES.
05 TRANSACTION-AMOUNT-IN-9
REDEFINES
TRANSACTION-AMOUNT-IN-X PIC 9(05)V99.
*
01 WS-HEADING-LINE-1.
05 PIC X(08) VALUE "DISTRICT".
05 PIC X(01) VALUE SPACES.
05 PIC X(05) VALUE "STORE".
05 PIC X(01) VALUE SPACES.
05 PIC X(10) VALUE "DEPARTMENT".
05 PIC X(01) VALUE SPACES.
05 PIC X(11) VALUE "TRANSACTION".
05 PIC X(10) VALUE SPACES.
05 PIC X(05) VALUE "ERROR".
*
01 WS-HEADING-LINE-2.
05 PIC X(02) VALUE SPACES.
05 PIC X(04) VALUE "CODE".
05 PIC X(03) VALUE SPACES.
05 PIC X(04) VALUE "CODE".
05 PIC X(05) VALUE SPACES.
05 PIC X(04) VALUE "CODE".
05 PIC X(04) VALUE SPACES.
05 PIC X(04) VALUE "TYPE".
05 PIC X(01) VALUE SPACES.
05 PIC X(06) VALUE "AMOUNT".
05 PIC X(10) VALUE SPACES.
05 PIC X(04) VALUE "CODE".
*
01 WS-DETAIL-LINE.
05 PIC X(03) VALUE SPACES.
05 DISTRICT-OUT PIC X(03).
05 PIC X(04) VALUE SPACES.
05 STORE-OUT PIC X(03).
05 PIC X(04) VALUE SPACES.
05 DEPARTMENT-OUT PIC X(05).
05 PIC X(05) VALUE SPACES.
05 TRANSACTION-TYPE-OUT PIC X(02).
05 PIC X(02) VALUE SPACES.
05 TRANSACTION-AMOUNT-OUT PIC X(07).
05 PIC X(01) VALUE SPACES.
05 ERROR-OUT PIC X(50).
*
01 WS-ACCUMULATORS.
05 WS-GOOD-RECORDS PIC 9(03) VALUE 0.
05 WS-BAD-RECORDS PIC 9(03) VALUE 0.
05 WS-TRANSACTION-TOTAL PIC 9(10)V99 VALUE 0.
*
01 WS-SUMMARY-LINE-1.
05 PIC X(03) VALUE SPACES.
05 PIC X(05) VALUE "TOTAL".
05 PIC X(01) VALUE SPACES.
05 PIC X(04) VALUE "GOOD".
05 PIC X(01) VALUE SPACES.
05 PIC X(13) VALUE "TRANSACTIONS:".
05 PIC X(03) VALUE SPACES.
05 GOOD-RECORDS-OUT PIC ZZ9.
*
01 WS-SUMMARY-LINE-2.
05 PIC X(04) VALUE SPACES.
05 PIC X(05) VALUE "TOTAL".
05 PIC X(01) VALUE SPACES.
05 PIC X(03) VALUE "BAD".
05 PIC X(01) VALUE SPACES.
05 PIC X(13) VALUE "TRANSACTIONS:".
05 PIC X(03) VALUE SPACES.
05 BAD-RECORDS-OUT PIC ZZ9.
*
01 WS-SUMMARY-LINE-3.
05 PIC X(05) VALUE "TOTAL".
05 PIC X(01) VALUE SPACES.
05 PIC X(02) VALUE "OF".
05 PIC X(01) VALUE SPACES.
05 PIC X(04) VALUE "GOOD".
05 PIC X(01) VALUE SPACES.
05 PIC X(13) VALUE "TRANSACTIONS:".
05 PIC X(03) VALUE SPACES.
05 TRANSACTION-TOTAL-OUT PIC $$$,$$9.99.
*
*
*
*
*
PROCEDURE DIVISION.
*
*
MAIN-CONTROL-PARA.
PERFORM INITIALIZATION-PARA
PERFORM READ-PARA
PERFORM HEADINGS-PARA
PERFORM MAIN-LOOP-PARA
UNTIL WS-MORE-INPUT = "N"
PERFORM SUMMARY-PAGE-PARA
PERFORM TERMINATION-PARA
.
*
*
INITIALIZATION-PARA.
OPEN INPUT STORE-FILE-IN
OUTPUT STORE-FILE-OUT
.
*
*
READ-PARA.
READ STORE-FILE-IN
INTO WS-STORE-RECORD-IN
AT END MOVE "N" TO WS-MORE-INPUT
.
*
*
HEADINGS-PARA.
WRITE STORE-RECORD-OUT FROM WS-HEADING-LINE-1
AFTER ADVANCING 1 LINE
WRITE STORE-RECORD-OUT FROM WS-HEADING-LINE-2
AFTER ADVANCING 1 LINE
.
*
*
MAIN-LOOP-PARA.
IF WS-RECORD-COUNT = 4
PERFORM PAGE-HEADINGS-PARA
END-IF
PERFORM DETAIL-LINE-PARA
PERFORM READ-PARA
.
*
*
PAGE-HEADINGS-PARA.
MOVE SPACES TO STORE-RECORD-OUT
WRITE STORE-RECORD-OUT AFTER ADVANCING 5 LINES
PERFORM HEADINGS-PARA
MOVE 0 TO WS-RECORD-COUNT
.
*
*
DETAIL-LINE-PARA.
MOVE SPACES TO STORE-RECORD-OUT WS-DETAIL-LINE
WRITE STORE-RECORD-OUT
AFTER ADVANCING 1 LINE
MOVE DISTRICT-CODE-IN TO DISTRICT-OUT
MOVE STORE-CODE-IN TO STORE-OUT
MOVE DEPARTMENT-CODE-IN TO DEPARTMENT-OUT
MOVE TRANSACTION-TYPE-IN TO TRANSACTION-TYPE-OUT
MOVE TRANSACTION-AMOUNT-IN-X TO TRANSACTION-AMOUNT-OUT
WRITE STORE-RECORD-OUT FROM WS-DETAIL-LINE
AFTER ADVANCING 1 LINE
PERFORM CHECK-VALUES-PARA
UNTIL WS-ERROR-FIELDS = 5
PERFORM ACCUMULATE-TOTALS-PARA
.
*
*
CHECK-VALUES-PARA.
MOVE "Y" TO WS-ERROR-FLAG
MOVE SPACES TO WS-DETAIL-LINE
IF WS-ERROR-FIELDS = 0
PERFORM DISTRICT-CODE-PARA
ELSE
IF WS-ERROR-FIELDS = 1
PERFORM STORE-CODE-PARA
ELSE
IF WS-ERROR-FIELDS = 2
PERFORM DEPARTMENT-CODE-PARA
ELSE
IF WS-ERROR-FIELDS = 3
PERFORM TRANSACTION-TYPE-PARA
ELSE
IF WS-ERROR-FIELDS = 4
PERFORM TRANSACTION-AMOUNT-PARA
END-IF
END-IF
END-IF
END-IF
END-IF
PERFORM ERROR-FLAG-CHECK-PARA
ADD 1 TO WS-ERROR-FIELDS
.
*
*
DISTRICT-CODE-PARA.
MOVE DISTRICT-CODE-IN TO DISTRICT-OUT
IF VALID-DISTRICT-CODE
MOVE "N" TO WS-ERROR-FLAG
END-IF
IF DISTRICT-CODE-BLANK
MOVE "DISTRICT CODE IS BLANK" TO ERROR-OUT
ELSE
IF DISTRICT-CODE-IN NOT NUMERIC
MOVE "DISTRICT CODE IS NOT NUMERIC" TO ERROR-OUT
ELSE
MOVE "DISTRICT CODE IS INCORRECT" TO ERROR-OUT
END-IF
END-IF
.
*
*
STORE-CODE-PARA.
MOVE STORE-CODE-IN TO STORE-OUT
IF VALID-STORE-CODE
MOVE "N" TO WS-ERROR-FLAG
END-IF
IF STORE-CODE-BLANK
MOVE "STORE CODE IS BLANK" TO ERROR-OUT
ELSE
IF STORE-CODE-2-IN NOT ALPHABETIC
MOVE "SECOND POSITION OF STORE CODE IS NOT
ALPHABETIC" TO ERROR-OUT
ELSE
MOVE "SECOND POSITION OF STORE CODE IS INCORRECT" TO ERROR-OUT
END-IF
END-IF
.
*
*
DEPARTMENT-CODE-PARA.
MOVE DEPARTMENT-CODE-IN TO DEPARTMENT-OUT
IF DEPARTMENT-CODE-BLANK
MOVE "DEPARTMENT CODE IS BLANK" TO ERROR-OUT
ELSE
IF DEPARTMENT-CODE-IN NOT NUMERIC
MOVE "DEPARTMENT CODE IS NOT NUMBER" TO ERROR-OUT
ELSE
IF DEPT-CODE-1-IN = DISTRICT-CODE-IN
MOVE "N" TO WS-ERROR-FLAG
ELSE
MOVE "DEPARTMENT CODE IS INCORRECT" TO ERROR-OUT
END-IF
END-IF
END-IF
.
*
*
TRANSACTION-TYPE-PARA.
MOVE TRANSACTION-TYPE-IN TO TRANSACTION-TYPE-OUT
IF TRANSACTION-TYPE-BLANK
MOVE "TRANSACTION TYPE IS BLANK" TO ERROR-OUT
ELSE
IF TRANSACTION-TYPE-IN = "NS" OR "RT" OR "CN"
MOVE "N" TO WS-ERROR-FLAG
ELSE
MOVE "TRANSACTION TYPE IS INVALID" TO ERROR-OUT
END-IF
END-IF
.
*
*
TRANSACTION-AMOUNT-PARA.
IF TRANSACTION-AMOUNT-BLANK
MOVE "TRANSACTION AMOUNT IS BLANK" TO ERROR-OUT
ELSE
IF TRANSACTION-AMOUNT-IN-9 NOT NUMERIC
MOVE "TRANSACTION AMOUNT IS NOT NUMERIC" TO ERROR-OUT
ELSE
IF TRANSACTION-AMOUNT-IN-9 > 20000
MOVE "TRANSACTION AMOUNT IS INVALID" TO ERROR-OUT
ELSE
MOVE "N" TO WS-ERROR-FLAG
END-IF
END-IF
END-IF
.
*
*
ERROR-FLAG-CHECK-PARA.
IF WS-ERROR-FLAG = "Y"
WRITE STORE-RECORD-OUT FROM WS-DETAIL-LINE
AFTER ADVANCING 1 LINE
MOVE "N" TO WS-GOOD-RECORD
END-IF
.
*
*
ACCUMULATE-TOTALS-PARA.
IF WS-GOOD-RECORD = "Y"
ADD 1 TO WS-GOOD-RECORDS
ADD TRANSACTION-AMOUNT-IN-9 TO WS-TRANSACTION-TOTAL
ELSE
ADD 1 TO WS-BAD-RECORDS
END-IF
MOVE "Y" TO WS-GOOD-RECORD
MOVE 0 TO WS-ERROR-FIELDS
ADD 1 TO WS-RECORD-COUNT
.
*
*
SUMMARY-PAGE-PARA.
MOVE WS-GOOD-RECORDS TO GOOD-RECORDS-OUT
MOVE WS-BAD-RECORDS TO BAD-RECORDS-OUT
MOVE WS-TRANSACTION-TOTAL TO TRANSACTION-TOTAL-OUT
WRITE STORE-RECORD-OUT FROM WS-SUMMARY-LINE-1
AFTER ADVANCING 5 LINES
WRITE STORE-RECORD-OUT FROM WS-SUMMARY-LINE-2
AFTER ADVANCING 1 LINE
WRITE STORE-RECORD-OUT FROM WS-SUMMARY-LINE-3
AFTER ADVANCING 1 LINE
.
*
*
TERMINATION-PARA.
CLOSE STORE-FILE-IN
STORE-FILE-OUT
STOP RUN
.