今回の記事では、バッチプログラムで使われるロジックの一つである「コントロールブレイク」について説明します。
「コントロールブレイク」とは特にCOBOLではよく目にするロジックであり、キー項目(「商品番号」「顧客番号」「カード番号」等)順にソートされたデータに対して、キー項目が変わる度にタイトル出力や改ページ等を行うロジックです。
トランザクションファイル・トランザクションテーブル(履歴ファイル・履歴テーブル)を読み込み、帳票やハガキ等を出力する時に使われることが多いです。
フローチャートと例は以下の通りです。
【フローチャート】
【例】
・要件
商品の販売実績のデータをまとめたファイルを読み込み、商品毎にタイトルを付与して、別のファイルに出力したい。
・入力ファイルのフォーマット
カンマ区切りの固定長ファイル。
商品コード・販売日でレコードを一意に特定できるようにデータをセットする。
1 2 3 4 5 6 7 |
商品コード(7桁) カンマ(1桁) 販売日(8桁) カンマ(1桁) 販売個数(5桁) カンマ(1桁) 販売金額(9桁) |
・入力ファイルのレコード
1 2 3 4 |
0000001,20180401,00100,00010000 0000001,20180402,00200,00020000 0000002,20180401,00001,00001000 0000003,20180402,00002,00002000 |
・タイトル行のフォーマット
1 2 3 |
アスタリスク(2桁) 商品コード(7桁) アスタリスク(22桁) |
・処理の流れ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
①変数「旧キー」に初期値として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のため処理を終了する。 |
・出力ファイル
1 2 3 4 5 6 7 |
**0000001********************** 0000001,20180401,00100,00010000 0000001,20180402,00200,00020000 **0000002********************** 0000002,20180401,00001,00001000 **0000003********************** 0000003,20180402,00002,00002000 |
以上、「コントロールブレイク」でした。
このロジックを覚えておくと、バッチ処理を設計するのが楽になります。
プログラミングだけでなくExcelの資料作りにも役立つことがあり、意外と応用も効きます。
これまでも週1でブログを更新してきましたが、今後もこのような記事を週1ペースで書いていきたいと思います。
では、また来週!
コメント