【COBOL学習|実務向け】報告書作成の要!CF集団における「CONTROL FOOTING FINAL」の活用術

導入

COBOLのREPORT SECTIONを使用して帳票を作成する際、もっとも頭を悩ませるのが「集計」の管理です。特に、明細行の積み上げを行い、最後に「総合計」を出力する処理は、バッチ処理における帳票作成の基本と言えます。今回解説する「CONTROL FOOTING FINAL」は、制御項目(キー)を明示せずに「報告書の最後」というタイミングを捉えるための非常に重要なテクニックです。これを使えば、複雑なフラグ制御なしで、クリーンな総合計行を実装できます。

基礎知識

REPORT SECTIONにおいて、REPORT WRITER機能(REPORT-WRITER)を使用している場合、集計の区切りを定義するために「CONTROL」句を使用します。通常は「CONTROL IS 部署コード」のように項目を指定しますが、ここで「FINAL」を指定すると、そのレポート全体が終了する瞬間にトリガーが引かれます。これが「CONTROL FOOTING FINAL」です。プログラム側で「総合計用の変数を定義して、最後に印字する」といったロジックを自前で組む必要がなくなり、REPORT WRITERが自動的にタイミングを制御してくれるのが最大のメリットです。

実装/解決策

実装のポイントは、REPORT SECTION内のFD定義で「CONTROL IS FINAL」を含めることと、BODYグループとは別に、REPORT FOOTINGまたはCONTROL FOOTING FINALのグループを定義することです。この記述を行うことで、REPORT WRITERは「レポートの終端(TERMINATE文の実行時)」に、自動的にこのグループを出力します。

サンプルプログラム

以下に、最低限の構成で総合計を出力するサンプルを提示します。

01 REPORT-FILE-LINE.
02 TYPE IS REPORT FOOTING.
03 LINE PLUS 1.
03 COLUMN 10 PIC X(10) VALUE “総合計:”.
03 COLUMN 20 PIC ZZZ,ZZZ,ZZ9 SOURCE TOTAL-SALES.

  • 制御項目にFINALを指定したフッター行

01 TYPE IS CONTROL FOOTING FINAL.
03 LINE PLUS 1.
03 COLUMN 10 PIC X(20) VALUE “— 終了 —“.

  • プログラム本体の制御イメージ

PROCEDURE DIVISION.
OPEN INPUT INPUT-FILE.
OUTPUT REPORT-FILE.
INITIATE MY-REPORT.
PERFORM UNTIL END-OF-FILE
READ INPUT-FILE
GENERATE MY-DETAIL-LINE
END-PERFORM.

  • ここでTERMINATEを実行すると、自動的にCF FINALが呼び出される

TERMINATE MY-REPORT.
CLOSE INPUT-FILE, REPORT-FILE.

応用・注意点

現場でよくある失敗は、TERMINATE文を忘れてしまうこと、あるいはINITIATEを忘れてREPORT-WRITERが起動しないケースです。また、TOTAL-SALESのような集計項目(SUM句を使用)は、必ずCONTROL FOOTING FINALが定義されているREPORT SECTION内で正しくSUM句が設定されているか確認してください。

注意点として、FINALはレポート全体に対して一つしか指定できません。複数の階層(部署単位の合計、支店単位の合計など)がある場合は、階層順にCONTROL句を記述する必要があります。特に、合計金額の桁溢れについては、PIC句のサイズを十分に確保しておくことが、トラブルを防ぐベテランの定石です。

コメント

タイトルとURLをコピーしました