COBOL 処理パターン　マッチング

マッチングは、複数ファイルのレコードを特定のキーで照合し、条件に従った操作を行う。
### 機能仕様
売り上げ累積ファイルと売り上げトランザクションファイルは、売り上げレコード（顧客コード、売り上げ金額）から構成される。

トランザクションファイルを読み込み、累積ファイルに同じ顧客コードのレコードがあれば売り上げ金額をそこに加算する。

累積ファイルに同じ顧客コードのレコードがなければ、新しい売り上げレコードとして追加する。新しい累積ファイルは、トランザクションレコードによる変更・追加を反映したものになる。

### 入出力構成図
<img class="lm100 tm10 bm0" src="http://mikomokaru.sakura.ne.jp/cobol/3/cob03_02.png" alt="[cob03_02.png]" width="300">

### プログラム構造図
<img class="lm100 tm10 bm0" src="http://mikomokaru.sakura.ne.jp/cobol/3/cob03_01.png" alt="[cob03_01.png]" width="500">

ソースコード

```
       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.
```

### 処理前後のファイルの内容
<img class="lm100 tm10 bm0" src="http://mikomokaru.sakura.ne.jp/cobol/3/cob03_03.png" alt="[cob03_03.png]" width="500">

この処理パターンは、マスターファイルの更新とみなすことができる。マスターのメンテナンスとしてコードの追加、削除、マスター項目の変更といった操作を行うとき、この処理パターンを利用する。なお、既存レコードに対する変更と削除の違いは、トランザクションレコードにフラグを持たせて切り分けるようにする。

順編成ファイルにおけるデータの削除とは、一度ファイルを読み込み、それを書き出すとき、特定のレコードを書き出さないことによって実現する。


関連記事
[COBOL 処理パターン　多段階集計](https://qiita.com/mikomokaru-jpn/items/09f6b0f056e329550854)
[COBOL 処理パターン　テーブル展開](https://qiita.com/mikomokaru-jpn/items/ffb340cb0d647fc56597)
[COBOL 処理パターン　外部サブプログラム呼ぶ](https://qiita.com/mikomokaru-jpn/items/967036b9bd3a11af601f)
[COBOL 処理パターン　C言語で作成した外部サブプログラムを呼ぶ](https://qiita.com/mikomokaru-jpn/items/85bb6a3b15dfe845b3e4)