LoginSignup
1
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-10-22

マッチングは、複数ファイルのレコードを特定のキーで照合し、条件に従った操作を行う。

機能仕様

売り上げ累積ファイルと売り上げトランザクションファイルは、売り上げレコード(顧客コード、売り上げ金額)から構成される。

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

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

入出力構成図

[cob03_02.png]

プログラム構造図

[cob03_01.png]

ソースコード

       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.

処理前後のファイルの内容

[cob03_03.png]

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

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

関連記事
COBOL 処理パターン 多段階集計
COBOL 処理パターン テーブル展開
COBOL 処理パターン 外部サブプログラム呼ぶ
COBOL 処理パターン C言語で作成した外部サブプログラムを呼ぶ

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0