本文へスキップ
BecomeCoder

COBOLコース · 第7章 ファイル処理の基本 ― 順編成ファイル · レッスン39

典型的なバッチパターン ― マスターファイルの更新・マージ処理

ローカル実施

導入

ここまで学んだ読み込み・書き込みを組み合わせると、実務でよく登場する「バッチ処理の定番パターン」が書けるようになります。代表的な2つ、マスターファイルの更新マージ処理 を見てみましょう。

説明

マスターファイルの更新 … 「基本となる台帳データ(マスターファイル)」を、「その日発生した変更データ(トランザクションファイル)」で更新する、バッチ処理の王道パターンです。

flowchart TD
    M["マスターファイル<br/>(現在の口座残高など)"] --> U[更新処理]
    T["トランザクションファイル<br/>(当日の入出金データ)"] --> U
    U --> NM["新しいマスターファイル<br/>(更新後の残高)"]

多くの場合、マスターファイルもトランザクションファイルもキー(口座番号など)順にあらかじめ並んでいることを前提に、両方を同時に読み進めながらキーを比較していきます。

      *> 考え方のイメージ(実際にはキー比較のロジックがもっと複雑になる)
           PERFORM UNTIL WS-MASTER-EOF = "Y"
               IF MASTER-KEY = TRANS-KEY
                   ADD TRANS-AMOUNT TO MASTER-BALANCE
                   WRITE NEW-MASTER-RECORD FROM MASTER-RECORD
                   READ TRANS-FILE
                       AT END MOVE "Y" TO WS-TRANS-EOF
                   END-READ
               ELSE
                   WRITE NEW-MASTER-RECORD FROM MASTER-RECORD
               END-IF
               READ MASTER-FILE
                   AT END MOVE "Y" TO WS-MASTER-EOF
               END-READ
           END-PERFORM.

マージ処理 … 2つ以上の、あらかじめソート済みのファイルを、キー順を保ったまま1つに統合する処理です。

flowchart LR
    A["ファイルA(ソート済み)<br/>1, 3, 5, 7"] --> M[マージ]
    B["ファイルB(ソート済み)<br/>2, 4, 6, 8"] --> M
    M --> C["統合後のファイル<br/>1, 2, 3, 4, 5, 6, 7, 8"]

マージ処理では、両方のファイルの現在のレコードのキーを比較し、小さいほう(または大きいほう)から順に出力ファイルへ書き出していきます。GnuCOBOLを含む多くのCOBOL処理系には、この並び替え・統合処理を専用に行う SORT 文・MERGE 文も用意されていますが、まずは「複数のファイルをキー順に処理しながら統合する」という考え方を押さえておきましょう。

これらのパターンに共通するのは、「キーで比較しながら、複数のファイルを同時に、順番を保って処理する」という発想です。夜間バッチでの残高更新、请求データの突き合わせなど、金融・保険の基幹システムの根幹を支えているのが、まさにこのパターンです。

試すには

「今日の残高(マスター)」と「今日の入出金(トランザクション)」という2つの簡単な表(第6章のOCCURSでも代用できます)を頭の中で用意し、同じ口座番号のデータを見つけたら残高を更新する、という流れを紙に書き出してイメージしてみましょう。