技術とか戦略とか

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

マッチング処理のロジックの説明

今回は、バッチプログラムで使われるロジックの一つである「マッチング処理」について説明します。
「マッチング処理」とは特にCOBOLではよく目にするロジックであり、マスタデータ(業務の基盤となるデータ。商品一覧、取引先一覧等。)とトランザクションデータ(業務で日々発生するデータ。販売履歴、入金履歴等。)を突き合わせる処理です。
マッチング処理を覚えておけば、実業務でバッチプログラムを作る時のヒントになりますし、開発者同士のコミュニケーションもスムーズになります。
 
突き合わせを行う時は、マスタデータとトランザクションデータで同じキー項目(商品コード、取引先コード等)を使用し、そのキー項目で昇順にソートした後、マスタデータとトランザクションデータを1件ずつ読み、キー項目が一致するかどうかで突き合わせを行います。
マスタデータとトランザクションデータでキー項目が一致した場合(マスタで管理しているもので取引が発生した)と、マスタのみキー項目が存在している場合(マスタで管理しているが取引は発生しなかった)は正常ケースですが、トランザクションのみキー項目が存在している場合(マスタで管理していないものが取引された)は異常ケースとなります。
 
マスタデータの一つのキー項目に対して、トランザクションデータの0~1つのレコードが対応する場合は、1対1マッチングと呼ばれます。2つ以上のレコードが対応することがある場合は1対nマッチングと呼ばれ、処理が少しだけ複雑になります。
 
フローチャートと例は以下の通りとなります。
 
フローチャート

f:id:akira2kun:20181013155231j:plain 
【例】
・要件
商品名が管理されている商品マスタと、商品の販売履歴(トランザクション)をファイル形式で読み込み、商品名と販売日を別ファイルで出力したい。
 
・商品マスタのフォーマット
カンマ区切りの固定長ファイル。
商品コードでレコードを一意に特定できるようにデータをセットする。
 
商品コード(7桁)
カンマ(1桁)
商品名(20桁)
 
・販売履歴のフォーマット
カンマ区切りの固定長ファイル。
商品コード・販売日でレコードを一意に特定できるようにデータをセットする。
 
商品コード(7桁)
カンマ(1桁)
販売日(8桁)
カンマ(1桁)
販売個数(5桁)
カンマ(1桁)
販売金額(9桁)
 
・出力ファイルのフォーマット
商品名(20桁)
カンマ(1桁)
販売日(8桁)
 
・商品マスタのレコード
0000001,hoge               
0000002,fuga               
0000004,piyo               
 
・販売履歴のレコード
0000001,20180401,00100,00010000
0000001,20180402,00200,00020000
0000003,20180401,00001,00001000
0000004,20180401,00002,00002000
 
・処理の流れ
 ①商品マスタ1レコード目と販売履歴1レコード目を読みこむ
 ②キー項目がマスタ(0000001)=トラン(0000001)のため、マッチ時処理実行
  出力ファイルを1レコード出力する
 ③販売履歴2レコード目を読みこむ
 ④キー項目がマスタ(0000001)=トラン(0000001)のため、マッチ時処理続行
  出力ファイルを1レコード出力する
 ⑤販売履歴3レコード目を読みこむ
 ⑥キー項目がマスタ(0000001)<トラン(0000003)のため、マッチ時処理終了
 ⑦商品マスタ2レコード目を読みこむ
 ⑧キー項目がマスタ(0000002)<トラン(0000003)のため、マスタのみ処理実行
  何もしない
 ⑨商品マスタ3レコード目を読みこむ
 ⑩キー項目がマスタ(0000004)>トラン(0000003)のため、トランのみ処理実行
  エラー出力
 ⑪販売履歴4レコード目を読みこむ
 ⑫キー項目がマスタ(0000004)=トラン(0000004)のため、マッチ時処理実行
  出力ファイルを1レコード出力する
 ⑬販売履歴EOFを読み込む
 ⑭キー項目がマスタ(0000004)<トラン(最大値)のため、マッチ時処理終了
 ⑮商品マスタEOFを読みこむ
 ⑯マスタもトランもEOFになったため処理終了
 
・出力ファイル
hoge                ,20180401
hoge                ,20180402
piyo                ,20180401