古典的事務処理 - マッチング(matching)と upd

大容量のハードディスクが生まれる前のコンピュータは、 紙テープや磁気テープにデータを記録していましたから、 データファイルへのアクセスは シーケンシャル(sequential)になって、 この性格が往年のプログラミング言語「COBOL」に反映しています。

この条件で、 経理の試算表や生産管理の在庫ファイルなどを更新する手法として生まれたのが、 マッチング(matching)と呼ばれる手法で、 前もってソート(sort)された、 残高と合計という管理データを持つ マスターファイル(master file)と、 これらを更新するデータを持つ、 これもソートされたトランザクションファイル (transaction file)をシーケンシャルに読んで、 マスターファイルを更新する技法です。

トランザクションファイルにデータの重複がない 「1 対 1 マッチング」の場合、 やりかたは下記のとおりで、2つのファイルが前もってソートされているおかげで、 いずれのファイルも、始めから終わりまで1度読めば、すべてが終わります。

  1. 最初に、マスターとトランザクションの最初のレコードを各1件読む。
  2. マスターキーがトランザクションキーと一致すれば、 トランザクションのレコードでマスターのレコードを更新し、 更新済みのマスターレコードを出力して、 1 に戻る。
  3. マスターキーがトランザクションキーより小さければ、 更新なしとしてマスターレコードをそのまま出力し、 次のマスターレコードを1件読んで、2 に戻る。
  4. トランザクションキーがマスターキーより小さければ、 未登録レコードを更新しようとするエラーとして処理し、 次のトランザクションレコードを1件読んで、2 に戻る。
これを、両方のレコードが終わるまで繰り返します。

トランザクションにレコードの重複があって、 集計しながら更新する場合は、 マスターキーがトランザクションキーと一致している間は更新を続け、 一致しなくなったら、更新済みのマスターレコードを出力することになります。

経理とか、生産管理とか、販売管理とか、 あらゆる事務で、こういった処理を行うわけですから、 たえず同じパターンのコーディングが出てきて、 この手間を省きたくなりますが、 私が最初に考えたのはこの部分を自動生成する コードジェネレータで、 TOSBAC-1100Eという社内で使い始めた往年のオフィスコンピュータでした。 主記憶は僅か 16 語、外部記憶装置は紙テープ、 ループ状の紙テープからプログラムを読むという外部プログラム方式ですが、 これでも、自分のプログラムを自分自身でつくり出すことができます。

その後、オフィスコンピュータも、 COBOL と磁気ディスクの時代になると、 COBOL のプログラムを出力するジェネレータになりましたが、 本質的な進歩はありません。

大きな進化は、Unix 時代になってからで、 TOSBAC UX-300時代に、 awk の構文に合わせた「upd」 (up-to-date)と呼ばれるインタプリータを書いて、 今に到るまで社内で使われることになりました。 どんなものかは、 社内用テキストをご覧になってください。

今のコンピュータはメモリが大きいですから、 awk で処理するにしても、よほど大きなファイルでなければ、 最初にすべてのトランザクションファイルを読んでしまうとか、 マスタファイルを全部読んでから トランザクションの処理を始めるといったことができて、 こういった技法が要らなくなりましたが、 いまだに実用性はありますし、 初心者に事務処理の概念を理解させるにも適していると思います。

プログラミング説明書を読んで、 ご興味を持たれたかたは、 ソースコードをご利用ください。

なお、マッチングは事務処理では極めてありふれた仕事ですが、 あまりに単純ですから、コンピュータ理論では興味の対象にならず、

  EDSGER W.DIJKSTRA,- A DISCIPLINE OF PROGRAMING
	(Prentice-Hall), 1976

  和訳は

  ダイクストラ,- プログラミング原論
	(サイエンス社)
で、頭の悪い学生が、この問題の下手な解答を自慢してみせたという話ぐらいしか、 見たことがありません。

平林 浩一, 2008-07-20)