導入:なぜTERMINATE文が重要なのか?
COBOLで報告書を作成している皆さん、こんにちは!ベテランCOBOL技術者の〇〇です。
今回は、皆さんが作成する報告書を「完璧に締めくくる」ための重要な命令、TERMINATE文についてお話しします。
報告書作成機能では、集計や小計など、様々なレベルでの集計結果をレポートに出力することがよくあります。しかし、プログラムの処理が終了する直前に、これらの集計結果をきちんと出力し忘れてしまうと、せっかく作成した報告書が不完全なものになってしまいます。
TERMINATE文は、このような「締め忘れ」を防ぎ、全ての集計レベルのフッター(コントロール・フッターやレポート・フッター)を強制的に出力してくれる、まさに報告書作成の「最後の一締め」に欠かせない命令なのです。
基礎知識:コントロール・フッターとレポート・フッターとは?
TERMINATE文を理解するために、まずは報告書における「フッター」について簡単に説明しましょう。
- コントロール・フッター (CF: Control Footer)
特定のグループ(例えば、部署別や商品カテゴリ別など)の集計が終わった後に出力される行です。小計などがここに表示されます。
- レポート・フッター (RF: Report Footer)
報告書全体の処理が終了した最後に出力される行です。総合計などがここに表示されます。
これらのフッターは、報告書を読む人にとって、集計結果や全体のまとめを理解する上で非常に重要な情報です。
実装/解決策:TERMINATE文の使い方
TERMINATE文は、報告書作成処理の最後に記述します。
構文は非常にシンプルで、`TERMINATE` の後に、終了させたい報告書の名前を指定します。
例えば、「MY-REPORT」という名前の報告書を終了させたい場合は、以下のように記述します。
TERMINATE MY-REPORT.
この文が実行されると、現在処理中の「MY-REPORT」に関連する全てのコントロール・フッターとレポート・フッターが、プログラムの終了処理とは独立して、強制的に出力されます。
これにより、たとえプログラムの途中で予期せぬエラーが発生した場合でも、これまで集計されてきたデータに基づくフッター情報が出力される可能性が高まります。
サンプルプログラム:TERMINATE文を使った報告書作成
それでは、TERMINATE文を使った簡単なサンプルプログラムを見てみましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. REPORT-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATA.
05 WS-ITEM-ID PIC X(5) VALUE ‘A0001’.
05 WS-ITEM-NAME PIC X(20) VALUE ‘りんご’.
05 WS-PRICE PIC 9(5) VALUE 150.
05 WS-QUANTITY PIC 9(3) VALUE 10.
05 WS-AMOUNT PIC 9(8) COMP-3.
01 WS-TOTAL-AMOUNT PIC 9(10) VALUE 0.
01 WS-GRAND-TOTAL PIC 9(10) VALUE 0.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
PERFORM INITIALIZE-REPORT.
PERFORM PROCESS-DATA UNTIL WS-ITEM-ID = ‘99999’.
PERFORM TERMINATE-REPORT.
STOP RUN.
INITIALIZE-REPORT.
DISPLAY “— 報告書開始 —“.
MOVE 0 TO WS-TOTAL-AMOUNT.
MOVE 0 TO WS-GRAND-TOTAL.
- ここで、報告書ヘッダーなどを出力する処理が入ります。
- 例: DISPLAY “品目ID 品目名 金額”.
PROCESS-DATA.
- 実際の処理では、ファイルからデータを読み込みます。
- ここではダミーデータを使用します。
COMPUTE WS-AMOUNT = WS-PRICE WS-QUANTITY.
ADD WS-AMOUNT TO WS-TOTAL-AMOUNT.
ADD WS-AMOUNT TO WS-GRAND-TOTAL.
- 報告書明細行の出力
DISPLAY WS-ITEM-ID, WS-ITEM-NAME, WS-AMOUNT.
- 仮に、特定の条件(例:WS-ITEM-IDが’A0002’)で小計を出力する
IF WS-ITEM-ID = ‘A0002’ THEN
PERFORM OUTPUT-SUBTOTAL.
END-IF.
- 次のデータへ進む(ダミー)
IF WS-ITEM-ID = ‘A0001’ THEN
MOVE ‘A0002’ TO WS-ITEM-ID
MOVE ‘みかん’ TO WS-ITEM-NAME
MOVE 100 TO WS-PRICE
MOVE 5 TO WS-QUANTITY
ELSE IF WS-ITEM-ID = ‘A0002’ THEN
MOVE ‘B0001’ TO WS-ITEM-ID
MOVE ‘バナナ’ TO WS-ITEM-NAME
MOVE 80 TO WS-PRICE
MOVE 20 TO WS-QUANTITY
ELSE
MOVE ‘99999’ TO WS-ITEM-ID
END-IF.
OUTPUT-SUBTOTAL.
- コントロール・フッター(小計)の出力
DISPLAY “— 小計: “, WS-TOTAL-AMOUNT.
MOVE 0 TO WS-TOTAL-AMOUNT. > 小計をリセット
TERMINATE-REPORT.
- ここでTERMINATE文を実行します。
- MY-REPORT は、この報告書を指す論理的な名前です。
- 実際のCOBOL環境では、FILE-CONTROL段落などで定義された
- SELECT句のファイル名や、REPORT WRITER機能の
- REPORT-NAME句で指定された名前が該当します。
- この例では、便宜上 ‘MY-REPORT’ としています。
TERMINATE MY-REPORT.
DISPLAY “— 報告書終了 —“.
END PROGRAM REPORT-DEMO.
【コードのポイント】
- `PROCESS-DATA`内で、本来はファイルからデータを読み込む処理が入ります。ここでは、ダミーデータで代用しています。
- `OUTPUT-SUBTOTAL`で、小計を出力する例を示しています。これはコントロール・フッターに相当します。
- `TERMINATE-REPORT`セクションで `TERMINATE MY-REPORT.` を実行しています。
- このサンプルでは、`MY-REPORT`という名前は便宜上のものです。実際のCOBOLプログラムでは、`FILE-CONTROL`段落で定義されたファイル名や、`REPORT WRITER`機能を使用している場合の`REPORT-NAME`句で指定された名前を`TERMINATE`文で指定することになります。
応用・注意点:現場で役立つ補足情報
- REPORT WRITER機能との連携
COBOLの`REPORT WRITER`機能を使うと、報告書のフォーマット定義や集計処理をより効率的に記述できます。`REPORT WRITER`を使用している場合、`TERMINATE`文は、定義されたレポート名に対して使用します。
REPORT SECTION.
CD MY-REPORT.
PAGE FOOTING 10.
AT END OF MY-REPORT
DISPLAY “総合計: “, GRAND-TOTAL-FIELD.
…
PROCEDURE DIVISION.
…
TERMINATE MY-REPORT.
…
- エラー発生時の挙動
`TERMINATE`文は、プログラムの異常終了時にも、可能な限りフッターを出力しようと試みます。これにより、デバッグや状況把握に役立つ情報が残されることがあります。
- 処理順序の重要性
`TERMINATE`文は、報告書に関連する全ての処理が完了した後、かつプログラムが完全に終了する前に実行されるように配置することが重要です。通常は、メイン処理のループが終わった後、最後の片付け処理の前に記述します。
- ファイルクローズとの関係
`TERMINATE`文は、報告書ファイル(出力先ファイル)をクローズする処理とは異なります。`TERMINATE`文はあくまで報告書のフッターを出力する命令であり、ファイルのクローズは別途行う必要があります(通常は`STOP RUN`や`CLOSE`文で行われます)。
これで、TERMINATE文を使った報告書作成の基本と応用が理解できたかと思います。
皆さんの報告書作成が、TERMINATE文によってより完璧なものになることを願っています!

コメント