1. 導入:なぜTERMINATE文は一つずつ書かなければならないのか
COBOLの報告書作成機能(Report Writer)を使っていると、複数のレポートを同時に出力したくなる場面がありますよね。さて、処理の最後に帳票を閉じようとして「TERMINATE RPT-A RPT-B.」と一行で書こうとしていませんか?実は、これでは期待通りに動きません。なぜなら、TERMINATE文はそれぞれのレポートに対して「合計行の出力」や「ページフッターの処理」を個別に行う必要があるからです。この仕組みを理解していないと、帳票のデータが欠落したり、計算結果が正しく出力されなかったりするバグを生む原因となります。
2. 基礎知識:TERMINATE文の役割
COBOLのReport Writer機能は、データの読み込みから集計、ページ制御までを自動化してくれる便利な機能です。ここで重要なのが、TERMINATE文は単なる「終了命令」ではないということです。
TERMINATE文が実行されると、COBOLは以下の処理を自動で行います。
・最終的な合計行(Control Footing)の出力
・最終ページのページフッターの出力
・内部バッファのクリア
つまり、それぞれのレポートには独自の「締めの処理」があるため、個別に命令を送る必要があるのです。
3. 実装/解決策:正しい終了処理の手順
解決策はシンプルです。TERMINATE文は、必ず1つのREPORT記述に対して1つずつ記述します。複数の帳票を扱っている場合は、それぞれを個別のステートメントとして並べるのが鉄則です。
4. サンプルプログラム
以下は、売上レポートと在庫レポートという2つの帳票を正しく終了させるためのコード例です。コピーして、ご自身の環境で試してみてください。
PROCEDURE DIVISION.
MAIN-LOGIC.
- — 処理本体 —
- (ここにデータ読み込みとWRITE文などの処理が入ります)
- — 正しい終了処理 —
- 複数の帳票がある場合は、必ず個別にTERMINATEを発行します。
- 売上レポートの締め処理(最終合計の印字など)
TERMINATE SALES-REPORT.
- 在庫レポートの締め処理
TERMINATE INVENTORY-REPORT.
- 処理の終了
STOP RUN.
5. 応用・注意点:現場で役立つポイント
現場でよくある失敗として、プログラムの途中でエラーが発生し、TERMINATE文を飛ばして終了してしまうケースがあります。これを行うと、最終合計行が出力されないまま帳票が不完全な状態で終わってしまいます。
「異常終了時でも必ずTERMINATEが通るか?」という観点で、エラーハンドリング(DECLARATIVES句など)を見直すことをお勧めします。また、TERMINATE文を呼び出す前に、直前のWRITE文が成功しているかを確認するロジックを組み込むと、より堅牢なプログラムになりますよ。ベテランの現場では、こうした「後処理の確実性」がプログラムの信頼性に直結します。ぜひ意識してみてください。

コメント