IDENTIFICATION DIVISION.
PROGRAM-ID. CTRLBRK1.
AUTHOR. JIRO SUZUKI.
*------------------------------------------------------------
* コントロールブレイク サンプル
* 購入日付・商品コードをキーにして金額を合計する。
*------------------------------------------------------------
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN01 ASSIGN TO IN01NAME
ACCESS MODE IS SEQUENTIAL.
SELECT OUT1 ASSIGN TO OUT1NAME
ACCESS MODE IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD IN01.
COPY I-PRDCTDTL.
FD OUT1.
COPY O-PRDCTTTL.
WORKING-STORAGE SECTION.
01 IN01NAME.
03 PIC X(16) VALUE "/HOME/OWNER/DAT/".
03 NAME PIC X(12) VALUE "CTRLBRK1IN01".
03 PIC X(04) VALUE ".DAT".
01 OUT1NAME.
03 PIC X(16) VALUE "/HOME/OWNER/DAT/".
03 NAME PIC X(12) VALUE "CTRLBRK1OUT1".
03 PIC X(04) VALUE ".DAT".
01 CNS-AREA.
03 CNS-INIT-MSG.
05 PIC X(10) VALUE "----- PGM=".
05 PIC X(08) VALUE "CTRLBRK1".
05 PIC X(11) VALUE "START -----".
03 CNS-TERM-MSG.
05 PIC X(10) VALUE "----- PGM=".
05 PIC X(08) VALUE "CTRLBRK1".
05 PIC X(11) VALUE "END -----".
03 CNS-SW-OFF PIC 9(01) COMP-3 VALUE ZERO.
03 CNS-SW-ON PIC 9(01) COMP-3 VALUE 1.
01 CNT-AREA.
03 CNT-IN01 PIC 9(12) COMP-3 VALUE ZERO.
03 CNT-OUT1 PIC 9(12) COMP-3 VALUE ZERO.
01 SW-AREA.
03 SW-ABEND PIC 9(01) COMP-3 VALUE ZERO.
01 WORK-AREA.
03 W-KEY-OLD.
05 W-OLD-PCHASEDATE PIC X(08).
05 W-OLD-PRDCTCD PIC X(08).
03 W-KEY-NEW.
05 W-NEW-PCHASEDATE PIC X(08).
05 W-NEW-PRDCTCD PIC X(08).
03 W-QUANTITY-SUM PIC 9(09) COMP-3.
03 W-TTLAMOUNT PIC 9(13) COMP-3.
*------------------------------------------------------------
PROCEDURE DIVISION.
MAIN SECTION. *>全体処理
PERFORM INIT-PROC THRU INIT-EXIT.
PERFORM MAIN-PROC THRU MAIN-EXIT.
PERFORM TERM-PROC THRU TERM-EXIT.
STOP RUN.
*------------------------------------------------------------
INIT-PROC. *>初期処理
DISPLAY CNS-INIT-MSG.
OPEN INPUT IN01
OUTPUT OUT1.
MOVE LOW-VALUE TO W-KEY-OLD W-KEY-NEW.
INIT-EXIT.
*------------------------------------------------------------
MAIN-PROC. *>主処理
PERFORM READ-IN01.
PERFORM UNTIL W-KEY-NEW = HIGH-VALUE
EVALUATE TRUE
WHEN W-KEY-NEW = W-KEY-OLD
PERFORM SUM-TOTAL-PROC
PERFORM READ-IN01
WHEN W-KEY-NEW > W-KEY-OLD
PERFORM WRITE-OUT1
PERFORM FIRST-KEY-PROC
PERFORM READ-IN01
WHEN OTHER
PERFORM ABEND-PROC
END-EVALUATE
END-PERFORM.
MAIN-EXIT.
*------------------------------------------------------------
TERM-PROC. *>終了処理
IF SW-ABEND = CNS-SW-OFF
IF CNT-IN01 NOT = 0
PERFORM WRITE-OUT1
END-IF
END-IF.
*
CLOSE IN01
OUT1.
DISPLAY "IN01=" CNT-IN01.
DISPLAY "OUT1=" CNT-OUT1.
DISPLAY CNS-TERM-MSG.
TERM-EXIT.
*------------------------------------------------------------
READ-IN01. *>IN01読込処理
READ IN01 INTO I-PRDCTDTL
AT END
MOVE HIGH-VALUE TO W-KEY-NEW
NOT AT END
MOVE I-PCHASEDATE TO W-NEW-PCHASEDATE
MOVE I-PRDCTCD TO W-NEW-PRDCTCD
ADD 1 TO CNT-IN01
END-READ.
*------------------------------------------------------------
WRITE-OUT1. *>OUT1書込処理
IF W-KEY-OLD NOT = LOW-VALUE
INITIALIZE O-PRDCTTTL
MOVE SPACE TO O-PRDCTTTL
*
MOVE W-OLD-PRDCTCD TO O-PRDCTCD
MOVE ZERO TO O-PRICE
MOVE W-QUANTITY-SUM TO O-QUANTITY
MOVE W-OLD-PCHASEDATE TO O-PCHASEDATE
MOVE W-TTLAMOUNT TO O-TTLAMOUNT
WRITE O-PRDCTTTL
ADD 1 TO CNT-OUT1
END-IF.
*------------------------------------------------------------
FIRST-KEY-PROC. *>同一キー1件目処理
*
MOVE W-KEY-NEW TO W-KEY-OLD.
MOVE ZERO TO W-QUANTITY-SUM W-TTLAMOUNT.
*
MOVE I-QUANTITY TO W-QUANTITY-SUM.
COMPUTE W-TTLAMOUNT = I-PRICE * I-QUANTITY.
*------------------------------------------------------------
SUM-TOTAL-PROC. *>金額合計処理
*
COMPUTE W-QUANTITY-SUM = W-QUANTITY-SUM + I-QUANTITY.
COMPUTE W-TTLAMOUNT = W-TTLAMOUNT + ( I-PRICE * I-QUANTITY ).
*------------------------------------------------------------
ABEND-PROC. *>異常発生時処理
DISPLAY "----- IN01 DATA NOT SORTED -----".
DISPLAY " THIS PROCEDURE ENDED ABNORMALY." .
MOVE CNS-SW-ON TO SW-ABEND.