コントロールブレイクのロジックと実装方法

COBOL

今回の記事では、バッチプログラムで使われるロジックの一つである「コントロールブレイク」について説明します。
「コントロールブレイク」とは特に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

以上、「コントロールブレイク」でした。
このロジックを覚えておくと、バッチ処理を設計するのが楽になります。
プログラミングだけでなくExcelの資料作りにも役立つことがあり、意外と応用も効きます。

これまでも週1でブログを更新してきましたが、今後もこのような記事を週1ペースで書いていきたいと思います。
では、また来週!

コメント

タイトルとURLをコピーしました