技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

opensource COBOL:マッチング処理サンプル

マッチング処理(マスタとトランザクションを突き合わせる処理)のロジックについて、以前の記事で紹介しました。

https://akira2kun.hatenablog.com/entry/2018/10/13/155427
 
COBOLでサンプルプログラムを作成しましたので、参考までに紹介します。
 
【サンプルプログラム】
       IDENTIFICATION    DIVISION.
       PROGRAM-ID.       MATCHING.
       ENVIRONMENT       DIVISION.
       INPUT-OUTPUT      SECTION.
       FILE-CONTROL.   
           SELECT  F1  ASSIGN  TO  "C:\tmp\a.txt".
           SELECT  F2  ASSIGN  TO  "C:\tmp\b.txt".
           SELECT  F3  ASSIGN  TO  "C:\tmp\c.txt".
      *
       DATA                  DIVISION.
       FILE                  SECTION.
       FD  F1.
       01  F1R.
           03  F1-REC        PIC X(30).
       FD  F2.
       01  F2R.
           03  F2-REC        PIC X(33).
       FD  F3.
       01  F3R.
           03  F3-REC        PIC X(31).
      *
       WORKING-STORAGE       SECTION.
       01  WORK.
           03  F1-KEY        PIC X(07).
           03  F2-KEY        PIC X(07).
       01  F1-REC-WORK.
           03  F1-SYOHIN-CODE
                             PIC X(07).
           03  F1-COMMA1     PIC X(01).
           03  F1-SYOHIN-NAME
                             PIC X(20).
           03  F1-CRLF       PIC X(02).
       01  F2-REC-WORK.
           03  F2-SYOHIN-CODE
                             PIC X(07).
           03  F2-COMMA1     PIC X(01).
           03  F2-HANBAI-YMD PIC X(08).
           03  F2-COMMA2     PIC X(01).
           03  F2-HANBAI-KOSUU
                             PIC X(05).
           03  F2-COMMA3     PIC X(01).
           03  F2-HANBAI-KINGAKU
                             PIC X(09).
           03  F2-CRLF       PIC X(02).
       01  F3-REC-WORK.
           03  F3-SYOHIN-NAME
                             PIC X(20).
           03  F3-COMMA1     PIC X(01) VALUE ','.
           03  F3-HANBAI-YMD PIC X(08).
           03  F3-CRLF       PIC X(02) VALUE X'0D0A'.
      *
       PROCEDURE         DIVISION.
      *
      * 各種処理の呼び出し
      *
       000-CONTROLLER-S.
           PERFORM  100-START-S THRU 100-START-E.
           PERFORM  200-MAIN-S  THRU 200-MAIN-E
               UNTIL F1-KEY = HIGH-VALUE
               AND   F2-KEY = HIGH-VALUE.
           PERFORM  300-END-S   THRU 300-END-E.
           STOP RUN.
       000-CONTROLLER-E.
      *
      * 前処理
      *
       100-START-S.
           OPEN  INPUT  F1.
           OPEN  INPUT  F2.
           OPEN  OUTPUT F3.
           PERFORM 210-MASTER-READ-S THRU 210-MASTER-READ-E.
           PERFORM 220-TRAN-READ-S   THRU 220-TRAN-READ-E.
       100-START-E.
      *
      * 主処理
      *
       200-MAIN-S.
           IF     F1-KEY < F2-KEY
                  PERFORM 230-MASTER-ONLY-S THRU 230-MASTER-ONLY-E
           ELSE
               IF F1-KEY = F2-KEY
                  PERFORM 240-MATCH-S       THRU 240-MATCH-E
               ELSE
                  PERFORM 250-TRAN-ONLY-S   THRU 250-TRAN-ONLY-E
               END-IF
           END-IF.
       200-MAIN-E.
      *
      * READ処理(マスタファイル
      *
       210-MASTER-READ-S.
           READ F1
           AT END
               MOVE HIGH-VALUE TO F1-KEY
               GO TO 210-MASTER-READ-E
           END-READ.
           MOVE F1-REC         TO F1-REC-WORK.
           MOVE F1-SYOHIN-CODE TO F1-KEY.
       210-MASTER-READ-E.
      *
      * READ処理(トランザクションファイル
      *
       220-TRAN-READ-S.
           READ F2
           AT END
               MOVE HIGH-VALUE TO F2-KEY
               GO TO 220-TRAN-READ-E
           END-READ.
           MOVE F2-REC         TO F2-REC-WORK.
           MOVE F2-SYOHIN-CODE TO F2-KEY.
       220-TRAN-READ-E.
      *
      * マスタのみ処理
      *
       230-MASTER-ONLY-S.
           PERFORM 210-MASTER-READ-S THRU 210-MASTER-READ-E.
       230-MASTER-ONLY-E.
      *
      * マッチ時処理
      *
       240-MATCH-S.
           PERFORM UNTIL F1-KEY < F2-KEY
               MOVE    F1-SYOHIN-NAME  TO F3-SYOHIN-NAME
               MOVE    F2-HANBAI-YMD   TO F3-HANBAI-YMD
               MOVE    F3-REC-WORK     TO F3-REC
               WRITE   F3R
               PERFORM 220-TRAN-READ-S THRU 220-TRAN-READ-E
           END-PERFORM.
           PERFORM 210-MASTER-READ-S THRU 210-MASTER-READ-E.
       240-MATCH-E.
      *
      * トランザクションのみ処理
      *
       250-TRAN-ONLY-S.
           DISPLAY 'TRAN ONLY ' F2-KEY.
           PERFORM 220-TRAN-READ-S   THRU 220-TRAN-READ-E.
       250-TRAN-ONLY-E.
      *
      * 後処理
      *
       300-END-S.
           CLOSE  F1.
           CLOSE  F2.
           CLOSE  F3.
       300-END-E.
 
マスタファイル
・C:\tmp\a.txt
0000001,hoge               
0000002,fuga               
0000004,piyo               
 
トランザクションファイル
・C:\tmp\b.txt
0000001,20180401,00100,00010000
0000001,20180402,00200,00020000
0000003,20180401,00001,00001000
0000004,20180401,00002,00002000
 
【出力ファイル】
・C:\tmp\c.txt
hoge                ,20180401
hoge                ,20180402
piyo                ,20180401
 
【標準出力】
TRAN ONLY 0000003