技術とか戦略とか

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

コントロールブレイクのロジックの説明

今回は、バッチプログラムで使われるロジックの一つである「コントロールブレイク」について説明します。
「コントロールブレイク」とは特にCOBOLではよく目にするロジックであり、キー項目(「商品番号」「顧客番号」「カード番号」等)順にソートされたデータに対して、キー項目が変わる度にタイトル出力や改ページ等を行うロジックです。
トランザクションファイルトランザクションテーブル(履歴ファイル・履歴テーブル)を読み込み、帳票やハガキ等を出力する時に使われることが多いです。
 
フローチャートと例は以下の通りです。
 
フローチャート

f:id:akira2kun:20181006150241j:plain

 
【例】
・要件
商品の販売実績のデータをまとめたファイルを読み込み、商品毎にタイトルを付与して、別のファイルに出力したい。
 
・入力ファイルのフォーマット
カンマ区切りの固定長ファイル。
商品コード・販売日でレコードを一意に特定できるようにデータをセットする。
 
商品コード(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