1. 導入:なぜCONTROL IS FINALの順序が重要なのか
COBOLの報告書作成機能(Report Writer)は、一度使いこなせば大量のデータから美しい帳票を自動生成できる非常に強力なツールです。しかし、初心者が最もつまずきやすいのが「集計の階層制御」です。特に、報告書の最後に表示する「総合計(グランドトータル)」を正しく出力するためには、CONTROL IS FINALという記述が不可欠です。この記事では、なぜFINALを先頭に書かなければならないのか、そのルールと実装のコツを解説します。
2. 基礎知識:CONTROLS句と階層の仕組み
CONTROLS句は、報告書の中でどの項目が変わったときに「合計(制御ブレイク)」を出力するかを定義する場所です。
ここで重要なのは、COBOLは「左から右へ、大きい順(外側から内側へ)」に制御項目を認識するという点です。
FINALは「報告書全体」という、最も大きな階層を指します。これを最後の方に書いてしまうと、コンピュータは「どの項目よりも外側の枠」を正しく認識できず、総合計の計算がスキップされたり、意図しないタイミングで出力されたりするバグの原因となります。
3. 実装/解決策:FINALは「特等席」に配置する
解決策はシンプルです。CONTROLS句の記述ルールを厳守すること、これに尽きます。
常に「FINAL」を一番左(最初)に配置してください。
記述例:CONTROLS ARE FINAL, DEPT-CODE, EMP-ID.
このように記述することで、「総合計(FINAL)>部署合計(DEPT-CODE)>個人合計(EMP-ID)」という明確な階層構造がシステム内部に構築されます。
4. サンプルプログラム
以下は、報告書作成機能を用いた簡単な構成例です。そのままコピーして、ロジックの流れを確認してみてください。
- 報告書定義部(REPORT SECTION)の記述イメージ
REPORT SECTION.
RD SALES-REPORT
- FINALを最初に配置することで、総合計が常に最上位で制御されます
CONTROLS ARE FINAL, DEPT-CODE.
01 TYPE IS PAGE HEADING.
...
01 TYPE IS CONTROL HEADING FINAL.
05 COLUMN 1 PIC X(20) VALUE '総合計レポート'.
01 TYPE IS CONTROL FOOTING FINAL.
- FINALに対応する合計出力
05 COLUMN 10 PIC Z(9)9 SOURCE TOTAL-SALES.
01 TYPE IS CONTROL FOOTING DEPT-CODE.
- 部署ごとの合計出力
05 COLUMN 10 PIC Z(9)9 SOURCE DEPT-SALES.
5. 応用・注意点:現場でハマる罠
現場でよくある失敗は、「後から集計項目を追加した際に、FINALの位置を修正し忘れる」ことです。
例えば、「CONTROLS ARE DEPT-CODE, FINAL.」と書いてしまうと、コンパイルエラーになるか、最悪の場合、警告が出ずに実行時に総合計が正しく印字されないという非常に厄介な状態になります。
注意点まとめ:
・FINALは常にCONTROLS句の先頭に書く。
・Report Writerを使用する場合、FINALの制御ブレイクに対応する「CONTROL FOOTING FINAL」を忘れずに定義する。
・階層の深さを意識し、常に「外側から内側へ」の順序を意識して設計する。
この「FINALの先頭配置」というルールさえ守れば、複雑な階層を持つ帳票もCOBOLなら驚くほど簡単に作成できます。ぜひ今日から意識してみてください!

コメント