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