COBOL 処理パターン　テーブル展開

### 機能仕様
顧客マスターファイルをテーブルに展開する。トラザクションレコードの顧客コードから顧客マスターテーブルを検索し、あれば顧客名称をトランザクションレコードに追加する。

### 入出力構成図

<img src="http://mikomokaru.sakura.ne.jp/cobol/4/cob04_01.png" alt="[cob04_01.png]" width="300">

### ソースコード

```
 IDENTIFICATION              DIVISION.
 PROGRAM-ID.                 TBL001.

 ENVIRONMENT                 DIVISION.
 INPUT-OUTPUT                SECTION.
 FILE-CONTROL.
*入力ファイル 行順編成ファイル(テキストファイル)  
 SELECT  F1  ASSIGN  TO  "./R002.txt"
 ORGANIZATION IS LINE SEQUENTIAL
 ACCESS  MODE  IS  SEQUENTIAL.  
*出力ファイル 行順編成ファイル(テキストファイル)  
 SELECT  F2  ASSIGN  TO  "./R003.txt"
 ORGANIZATION IS LINE SEQUENTIAL
 ACCESS  MODE  IS  SEQUENTIAL.  
*マスターファイル 
 SELECT  M1  ASSIGN  TO  "./M001.txt"
 ORGANIZATION IS LINE SEQUENTIAL
 ACCESS  MODE  IS  SEQUENTIAL.  

 DATA                        DIVISION.
 FILE                        SECTION.
* 入力ファイル
 FD  F1.
 01  F1R.
     05  CUST-CODE           PIC 9(04). 
     05  SALES               PIC 9(10).
* 出力ファイル
 FD  F2.
 01  F2R.
     05  CUST-CODE           PIC 9(04). 
     05  SALES               PIC 9(10).
     05  CUST-NAME           PIC X(20).
* 顧客マスターファイル
 FD  M1.
 01  M1R.
     05 CUST-CODE            PIC 9(04).
     05 CUST-NAME            PIC X(20).       
 WORKING-STORAGE             SECTION.
 01  END-FLG1                PIC 9(01).
 01  END-FLG2                PIC 9(01).
* 顧客マスターテーブル
 01 CUST-TABLE.
     05 CUSTOMER OCCURS 10 TIMES.
         10 CUST-CODE        PIC 9(04).
         10 CUST-NAME        PIC X(20).
* 顧客マスターテーブル件数
 01 CUST-COUNT               PIC 9(02).
* 添え字
 01 I                        PIC 9(02).

 PROCEDURE                   DIVISION.
******************************************************************
* 主処理 
****************************************************************** 
 PERFORM INIT-RTN
 PERFORM LOOP-RTN UNTIL END-FLG2 NOT = 0
 PERFORM END-RTN
 STOP RUN.
******************************************************************
* 前処理 
******************************************************************
 INIT-RTN.
*    変数の初期化
     INITIALIZE END-FLG1 END-FLG2 CUST-COUNT CUST-TABLE
*    ファイルオープン
     OPEN INPUT F1 M1
     OPEN OUTPUT F2
*    顧客マスターの読み込み
     PERFORM UNTIL END-FLG1 > 0
         READ  M1 
             AT END
                 ADD 1 TO END-FLG1
             NOT AT END
                 ADD 1 TO CUST-COUNT 
                 MOVE CUST-CODE OF M1R 
                     TO CUST-CODE OF CUSTOMER(CUST-COUNT) 
                 MOVE CUST-NAME OF M1R 
                     TO CUST-NAME OF CUSTOMER(CUST-COUNT)  
         END-READ
     END-PERFORM
*    1件目のレコードの入力
     PERFORM READ-RTN.
 INIT-RTN-EX. 
     EXIT.
******************************************************************
* 繰り返し処理 
******************************************************************
 LOOP-RTN.
*    出力レコードの編集 
     INITIALIZE F2R
     MOVE CUST-CODE OF F1R TO CUST-CODE OF F2R 
     MOVE SALES OF F1R TO SALES OF F2R 
*    顧客マスターの検索 
     PERFORM VARYING I FROM 1 BY 1 UNTIL I > CUST-COUNT
         IF CUST-CODE OF F1R = CUST-CODE OF CUSTOMER(I)
             MOVE CUST-NAME OF CUSTOMER(I) TO CUST-NAME OF F2R     
             MOVE 99 TO I
         END-IF
     END-PERFORM
*    レコードの出力     
     WRITE F2R
*    次のレコードの読み込み 
     PERFORM READ-RTN.
 LOOP-RTN-EX. 
     EXIT.
******************************************************************
* 後処理 
******************************************************************
 END-RTN.
     CLOSE  F1 F2 M1.
 END-RTN-EX.
     EXIT.
******************************************************************
* 入力処理  
******************************************************************
 READ-RTN.
     READ  F1 
         AT END
             ADD 2 TO END-FLG2
     END-READ.
 READ-RTN-EX.
     EXIT.
```

### 入出力ファイルの内容
####入力・売り上げ累積ファイル

```
0001    110000
0002      2500
0003    200000
0005    301000
0006    400000
0007     45500
0008     25000
0009     20000
```

####入力・顧客マスターファイル

```
0001AAAAA
0002BBBBB
0003CCCCC
0004DDDDD
0005EEEEE
0006桃太郎商事   
0007金太郎産業
0009オフィス浦島 
```

####出力・売り上げ累積ファイル

```
0001    110000AAAAA
0002      2500BBBBB
0003    200000CCCCC
0005    301000EEEEE
0006    400000桃太郎商事
0007     45500金太郎産業
0008     25000
0009     20000オフィス浦島
```

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