今回は、バッチプログラムで使われるロジックの一つである「コントロールブレイク」について説明します。
「コントロールブレイク」とは特にCOBOLではよく目にするロジックであり、キー項目(「商品番号」「顧客番号」「カード番号」等)順にソートされたデータに対して、キー項目が変わる度にタイトル出力や改ページ等を行うロジックです。
トランザクションファイル・トランザクションテーブル(履歴ファイル・履歴テーブル)を読み込み、帳票やハガキ等を出力する時に使われることが多いです。
フローチャートと例は以下の通りです。
【フローチャート】
【例】
・要件
商品の販売実績のデータをまとめたファイルを読み込み、商品毎にタイトルを付与して、別のファイルに出力したい。
・入力ファイルのフォーマット
カンマ区切りの固定長ファイル。
商品コード・販売日でレコードを一意に特定できるようにデータをセットする。
商品コード(7桁)
カンマ(1桁)
販売日(8桁)
カンマ(1桁)
販売個数(5桁)
カンマ(1桁)
販売金額(9桁)
・入力ファイルのレコード
0000001,20180401,00100,00010000
0000001,20180402,00200,00020000
0000002,20180401,00001,00001000
0000003,20180402,00002,00002000
・タイトル行のフォーマット
アスタリスク(2桁)
商品コード(7桁)
アスタリスク(22桁)
・処理の流れ
①変数「旧キー」に初期値として7桁のスペースを入れる。
(商品コードで使われていない値を初期値として使用する)
②1レコード目「0000001,20180401,00100,00010000」を読み込む。
③読み込んだレコードの商品コードと変数「旧キー」が一致するか判定する。
一致しないため、ブレイク処理として下記タイトルを出力する。
「**0000001**********************」
変数「旧キー」に現在の商品コード「0000001」をセットする。
④1レコード目のデータを出力ファイルへ出力する。
⑤2レコード目「0000001,20180402,00200,00020000」を読み込む。
⑥読み込んだレコードの商品コードと変数「旧キー」が一致するか判定する。
一致するため、ブレイク処理は行わない。
⑦2レコード目のデータを出力ファイルへ出力する。
⑧3レコード目「0000002,20180401,00001,00001000」を読み込む。
⑨読み込んだレコードの商品コードと変数「旧キー」が一致するか判定する。
一致しないため、ブレイク処理として下記タイトルを出力する。
「**0000002**********************」
変数「旧キー」に現在の商品コード「0000002」をセットする。
⑩3レコード目のデータを出力ファイルへ出力する。
⑪4レコード目「0000003,20180402,00002,00002000」を読み込む。
⑫読み込んだレコードの商品コードと変数「旧キー」が一致するか判定する。
一致しないため、ブレイク処理として下記タイトルを出力する。
「**0000003**********************」
変数「旧キー」に現在の商品コード「0000003」をセットする。
⑬4レコード目のデータを出力ファイルへ出力する。
⑭EOFのため処理を終了する。
・出力ファイル
**0000001**********************
0000001,20180401,00100,00010000
0000001,20180402,00200,00020000
**0000002**********************
0000002,20180401,00001,00001000
**0000003**********************
0000003,20180402,00002,00002000