これも3本のマッチング(MATDV3)と殆ど同じですが、相互のキーの条件によって、基本となるファイルの最後のキー値を認識しておく必要があるので『読込』Moduleの中で読み飛ばしの制御をしています。この部分を『制御Module』の中に含めるべきかどうかは議論がわかれるかもしれません。
***** (併合処理ドライバパターン) ***** [MRGDV3] (20 F9) * [ 3本のファイルの併合 file-end は high-value で制御 ] * * [ f1=f2 は f2をerrに f1=f3 は f3をerrに f2=f3 は f3をerrにする ] * [ データファイル f2 f3 とも キーの重複・分散がある場合も可 ] * ( ) 内に命令等を記述する procedure division. ********** [ 制御-MODULE ] ********** open input (f1) (f2) (f3) output (f4) perform f1-rtn thru f1-ext perform f2-rtn thru f2-ext perform f3-rtn thru f3-ext perform until (f1キー = high-value) and (f2キー = high-value) and (f3キー = high-value) evaluate true * **** [f1 が一番小さい場合] ***** when (f1キー < f2キー) and (f1キー < f3キー) perform 処理f1 thru 出口f1 perform f1-rtn thru f1-ext * **** [f2 が一番小さい場合] ***** when (f2キー < f1キー) and (f2キー < f3キー) perform 処理f2 thru 出口f2 perform f2-rtn thru f2-ext * **** [f3 が一番小さい場合] ***** when (f3キー < f1キー) and (f3キー < f2キー) perform 処理f3 thru 出口f3 perform f3-rtn thru f3-ext * **** [f1 = f2 の場合] ***** when (f1キー = f2キー) perform f2-err thru f2-ext perform f2-rtn thru f2-ext * **** [f1 = f3 の場合] ***** when (f1キー = f3キー) perform f3-err thru f3-ext perform f3-rtn thru f3-ext * **** [f2 = f3 の場合] ***** when (f2キー = f3キー) perform f3-err thru f3-ext perform f3-rtn thru f3-ext end-evaluate end-perform close (f1) (f2) (f3) (f4) stop run. ********** [ 機能-MODULE ] ********** 処理f1. (f1 を書き出す). 出口f1. exit. 処理f2. (f2 を書き出す f2キー を h0キー に保存する). 出口f2. exit. 処理f3. (f3 を書き出す f3キー を h0キー に保存する). 出口f3. exit. f2-err. (f2 を error にする). f2-ext. exit. f3-err. (f3 を error にする). f3-ext. exit. ********** [ 読込-MODULE ] ********** f1-rtn. read (f1) end move high-value to (f1キー) not end continue end-read. f1-ext. exit. f2-rtn. read (f2) end move high-value to (f2キー) not end if (f2キー) = (h0キー) then perform f2-err thru f2-ext else continue end-if end-read. f2-ext. exit. f3-rtn. read (f3) end move high-value to (f3キー) not end if (f3キー) = (h0キー) then perform f3-err thru f3-ext else continue end-if end-read. f3-ext. exit.