はじめに
COBOLでの帳票作成において、報告書の最後に必ず表示したい情報、例えば最終的な合計値や終了メッセージなどは、その重要性から正確に、そして確実に印字する必要があります。しかし、単純なPRINT文だけでは、報告書のどこで、どのように印字されるのかを制御するのが難しい場合があります。
「TYPE IS REPORT FOOTING (RF)」は、まさにこの課題を解決するための機能です。報告書の終了時に一度だけ、かつ最終的な集計結果が出力された後に印字されることを保証してくれるため、帳票の締めくくりとして非常に役立ちます。例えば、最終的な総計(FINAL)の出力後に、”— 処理終了 —” といったエンドマークを印字する際に、このRF句が活躍します。
基礎知識:TYPE IS REPORT FOOTING (RF) とは
COBOLの報告書作成機能(Report Writer)において、`TYPE IS REPORT FOOTING` は、報告書のフッター部分を定義するための句です。これは、報告書の終了時に一度だけ出力されるレコードタイプとして扱われます。
具体的には、`TERMINATE` 文が実行される過程で、総合計(FINAL)が出力された後に印字されます。これにより、帳票の最終ページの下部に、常に一定の情報を配置することが可能になります。
`01` レベルのデータ項目に `TYPE IS REPORT FOOTING` を指定することで、そのデータ項目がRFレコードとして定義されます。
実装/解決策:RF句を使った最終集計と終了メッセージの印字
RF句を使うことで、報告書の最後に総合計と終了メッセージをまとめて印字する処理を実装できます。
まず、総合計を格納するためのデータ項目を定義します。これは、通常、`SD` (Sort Description) や `FD` (File Description) の中で定義される集計用のデータ項目となります。
次に、`01` レベルのデータ項目に `TYPE IS REPORT FOOTING` を指定し、その中に総合計を表示するための `PIC` 句を持つデータ項目と、終了メッセージを表示するための `PIC` 句を持つデータ項目を定義します。
これらのデータ項目に、適切な値を設定することで、報告書の最後に期待通りの情報を印字させることができます。
サンプルプログラム
以下に、`TYPE IS REPORT FOOTING` を使用して、総合計と終了メッセージを印字する簡単なサンプルプログラムを示します。
IDENTIFICATION DIVISION.
PROGRAM-ID. REPORT-FOOTING-SAMPLE.
DATA DIVISION.
FILE SECTION.
FD REPORT-FILE.
01 REPORT-RECORD.
05 FILLER PIC X(80).
SD SUMMARY-DATA.
01 SUMMARY-RECORD.
05 SUM-AMOUNT PIC 9(10) VALUE 0.
WORKING-SECTION.
01 DETAIL-LINE.
05 DL-ITEM-CODE PIC X(5).
05 DL-ITEM-NAME PIC X(20).
05 DL-AMOUNT PIC 9(10).
01 REPORT-CONTROLS.
05 PAGE-HEADING-FLAG PIC X VALUE ‘Y’.
01 REPORT-FOOTING-RECORD TYPE IS REPORT FOOTING.
05 FILLER PIC X(30) VALUE SPACES.
05 FINAL-TOTAL-LABEL PIC X(15) VALUE ‘総合計:’.
05 FINAL-TOTAL-VALUE PIC ZZZZZZZZ9.
05 FILLER PIC X(10) VALUE SPACES.
05 END-MESSAGE PIC X(20) VALUE ‘— 処理正常終了 —‘.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
PERFORM INIT.
PERFORM PROCESS-RECORDS.
PERFORM FINALISE.
STOP RUN.
INIT.
OPEN OUTPUT REPORT-FILE.
- 報告書ヘッダーの初期化処理などは省略
PROCESS-RECORDS.
- ダミーデータの生成と集計
MOVE ‘A001’ TO DL-ITEM-CODE.
MOVE ‘商品A’ TO DL-ITEM-NAME.
MOVE 12345 TO DL-AMOUNT.
ADD DL-AMOUNT TO SUM-AMOUNT.
PERFORM WRITE-DETAIL-LINE.
MOVE ‘B002’ TO DL-ITEM-CODE.
MOVE ‘商品B’ TO DL-ITEM-NAME.
MOVE 67890 TO DL-AMOUNT.
ADD DL-AMOUNT TO SUM-AMOUNT.
PERFORM WRITE-DETAIL-LINE.
- … 他のレコード処理 …
WRITE-DETAIL-LINE.
- DETAIL句で定義されたレコードをWRITEする想定
- ここでは簡略化のため、直接REPORT-FILEへ出力
MOVE SPACES TO REPORT-RECORD.
MOVE DL-ITEM-CODE TO REPORT-RECORD(1:5).
MOVE DL-ITEM-NAME TO REPORT-RECORD(6:20).
MOVE DL-AMOUNT TO REPORT-RECORD(26:10).
WRITE REPORT-RECORD.
FINALISE.
- 総合計をRFレコードにセット
MOVE SUM-AMOUNT TO FINAL-TOTAL-VALUE.
- RFレコードをWRITE
WRITE REPORT-FOOTING-RECORD.
CLOSE REPORT-FILE.
コード解説:
- `SD SUMMARY-DATA`: 総合計を格納するための `SD` セクションを定義しています。
- `01 REPORT-FOOTING-RECORD TYPE IS REPORT FOOTING`: ここでRFレコードを定義しています。
- `FINAL-TOTAL-VALUE PIC ZZZZZZZZ9`: 総合計を表示するための項目です。`ZZZZZZZ9` はゼロ抑制を行い、最上位のゼロをスペースに置き換えます。
- `END-MESSAGE PIC X(20) VALUE ‘— 処理正常終了 —‘`: 終了メッセージを直接指定しています。
- `FINALISE` パラグラフ: 総合計を `FINAL-TOTAL-VALUE` に移動し、`WRITE REPORT-FOOTING-RECORD` でRFレコードを出力しています。`REPORT WRITER` の制御下では、`TERMINATE` 文が実行される際に自動的にRFレコードが印字されますが、ここでは簡略化のため直接 `WRITE` しています。実際のReport Writer使用時には、`INIT`, `BUILD`, `TERMINATE` などの制御文と連携します。
応用・注意点
- 複数RF句の利用: 報告書全体に適用されるRF句の他に、特定のグループ(例:ページフッター)に適用されるRF句も定義可能です。これにより、より複雑な帳票レイアウトに対応できます。
- `TERMINATE` 文との連携: `TYPE IS REPORT FOOTING` は、`TERMINATE` 文の実行過程で出力されるため、`TERMINATE` 文を正しく記述することが重要です。
- データ項目の初期化: RF句で定義されたデータ項目に値を設定するタイミングに注意が必要です。通常は、全レコード処理が完了し、最終的な集計値が確定した後に設定します。
- `PAGE` 句との違い: `PAGE FOOTING` は各ページの最後に印字されますが、`REPORT FOOTING` は報告書全体の最後に一度だけ印字されるという違いがあります。目的応じて使い分けることが重要です。
- エラーハンドリング: 報告書作成処理中にエラーが発生した場合、RF句が意図した通りに印字されない可能性があります。エラー発生時のメッセージをRF句に含めるなど、エラーハンドリングを考慮した設計も検討しましょう。
`TYPE IS REPORT FOOTING` を理解し、適切に活用することで、COBOLでの帳票作成がより堅牢で、かつ分かりやすいものになります。

コメント