マッチングは、複数ファイルのレコードを特定のキーで照合し、条件に従った操作を行う。
機能仕様
売り上げ累積ファイルと売り上げトランザクションファイルは、売り上げレコード(顧客コード、売り上げ金額)から構成される。
トランザクションファイルを読み込み、累積ファイルに同じ顧客コードのレコードがあれば売り上げ金額をそこに加算する。
累積ファイルに同じ顧客コードのレコードがなければ、新しい売り上げレコードとして追加する。新しい累積ファイルは、トランザクションレコードによる変更・追加を反映したものになる。
入出力構成図
プログラム構造図
ソースコード
IDENTIFICATION DIVISION.
PROGRAM-ID. MTC001.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*累積ファイル1 行順編成ファイル(テキストファイル)
SELECT IN1 ASSIGN TO "/Users/itohisao/Desktop/COBOL/R001.txt"
ORGANIZATION IS LINE SEQUENTIAL
ACCESS MODE IS SEQUENTIAL STATUS FST1.
*トランザクッションファイル 行順編成ファイル(テキストファイル)
SELECT IN2 ASSIGN TO "/Users/itohisao/Desktop/COBOL/T001.txt"
ORGANIZATION IS LINE SEQUENTIAL
ACCESS MODE IS SEQUENTIAL STATUS FST2.
*累積ファイル2 行順編成ファイル(テキストファイル)
SELECT OUT1 ASSIGN TO "/Users/itohisao/Desktop/COBOL/R002.txt"
ORGANIZATION IS LINE SEQUENTIAL
ACCESS MODE IS SEQUENTIAL STATUS FST3.
DATA DIVISION.
FILE SECTION.
* 入力ファイル1
FD IN1.
01 R001.
05 CUST PIC 9(04).
05 SALES PIC 9(10).
* 入力ファイル2
FD IN2.
01 T001.
05 CUST PIC 9(04).
05 SALES PIC 9(10).
* 出力ファイル
FD OUT1.
01 R002 PIC X(14).
WORKING-STORAGE SECTION.
01 END-FLG PIC 9(01).
01 FST1 PIC X(02).
01 FST2 PIC X(02).
01 FST3 PIC X(02).
*計算用
01 WK-SALES PIC 9(10).
* 出力レコード
01 WK-REC.
05 CUST PIC 9(04).
05 SALES PIC ZZZZZZZZZ9.
PROCEDURE DIVISION.
******************************************************************
* 主処理
******************************************************************
PERFORM INIT-RTN
PERFORM LOOP-RTN UNTIL END-FLG > 2
PERFORM END-RTN
STOP RUN.
******************************************************************
* 前処理
******************************************************************
INIT-RTN.
* 初期化
MOVE 0 TO END-FLG
OPEN INPUT IN1 IN2
OPEN OUTPUT OUT1
* 1件目の累積レコード
PERFORM READ-RTN1
* 1件目のトランザクションレコード
PERFORM READ-RTN2.
INIT-RTN-EX.
EXIT.
******************************************************************
* 繰り返し処理
******************************************************************
LOOP-RTN.
IF CUST OF R001 < CUST OF T001 THEN
* 累積レコードの編集
MOVE CUST OF R001 TO CUST OF WK-REC
MOVE WK-SALES TO SALES OF WK-REC
* 累積レコードの出力
PERFORM WRITE-RTN1
* 累積レコードの入力
PERFORM READ-RTN1
ELSE IF CUST OF R001 = CUST OF T001 THEN
* トランザクションレコードの金額を加算
ADD SALES OF T001 TO WK-SALES
* トランザクションレコードの入力
PERFORM READ-RTN2
ELSE
* トランザクションレコードの出力
PERFORM WRITE-RTN2
* トランザクションレコードの入力
PERFORM READ-RTN2
END-IF.
LOOP-RTN-EX.
EXIT.
******************************************************************
* 後処理
******************************************************************
END-RTN.
* ファイルクローズ
CLOSE IN1 IN2 OUT1.
END-RTN-EX.
EXIT.
******************************************************************
* 入力処理1
******************************************************************
READ-RTN1.
READ IN1
AT END
ADD 1 TO END-FLG
MOVE HIGH-VALUE TO CUST OF R001
NOT AT END
MOVE SALES OF R001 TO WK-SALES
END-READ.
READ-RTN1-EX.
EXIT.
******************************************************************
* 入力処理2
******************************************************************
READ-RTN2.
READ IN2
AT END
ADD 2 TO END-FLG
MOVE HIGH-VALUE TO CUST OF T001
END-READ.
READ-RTN2-EX.
EXIT.
******************************************************************
* 出力処理1
******************************************************************
WRITE-RTN1.
* DISPLAY "1 " R001
WRITE R002 FROM WK-REC.
WRITE-RTN1-EX.
EXIT.
******************************************************************
* 出力処理2
******************************************************************
WRITE-RTN2.
* DISPLAY "2 " T001
WRITE R002 FROM T001.
WRITE-RTN2-EX.
EXIT.
処理前後のファイルの内容
この処理パターンは、マスターファイルの更新とみなすことができる。マスターのメンテナンスとしてコードの追加、削除、マスター項目の変更といった操作を行うとき、この処理パターンを利用する。なお、既存レコードに対する変更と削除の違いは、トランザクションレコードにフラグを持たせて切り分けるようにする。
順編成ファイルにおけるデータの削除とは、一度ファイルを読み込み、それを書き出すとき、特定のレコードを書き出さないことによって実現する。
関連記事
COBOL 処理パターン 多段階集計
COBOL 処理パターン テーブル展開
COBOL 処理パターン 外部サブプログラム呼ぶ
COBOL 処理パターン C言語で作成した外部サブプログラムを呼ぶ