1. 導入:なぜREPORT IS が重要なのか?
COBOLで報告書を作成する際、データの集計や整形だけでなく、それをファイルに出力する作業も必要になります。しかし、通常のファイル出力では WRITE 文を自分で記述しなければならず、コードが煩雑になりがちです。
「REPORT IS」句を使うことで、このファイル出力処理を COBOL の Report Writer 機能に任せることができ、開発効率を大幅に向上させることができます。特に、複雑なレイアウトの報告書や、複数の報告書を同時に生成するような場合に、その効果は絶大です。
2. 基礎知識:Report Writer とは?
COBOL における Report Writer 機能は、その名の通り、報告書を作成するための強力な機能群です。
主な特徴は以下の通りです。
- 自動的なフォーマット制御: ヘッダー、フッター、ページ番号、集計フィールドなどを簡単に設定できます。
- レコードの自動生成: GENERATE 文を発行するだけで、定義されたフォーマットに従ってレコードが自動的に生成されます。
- ファイル出力の簡略化: REPORT IS 句を使用することで、WRITE 文によるファイル出力処理を記述する必要がなくなります。
3. 実装/解決策:REPORT IS の使い方
REPORT IS 句は、ファイル定義 (FD) の中で使用します。
具体的には、報告書を出力するファイル定義に `REPORT IS` を指定し、その後に報告書名(RD で定義したもの)を記述します。
FD 出力ファイル名 REPORT IS 報告書名.
この指定を行うと、そのファイルに対する WRITE 文は不要になります。代わりに、Report Writer の GENERATE 文と TERMINATE 文が、この FD で定義されたファイルへの出力処理を内部的に行います。
4. サンプルプログラム:REPORT IS を使った簡単な報告書作成
ここでは、簡単な売上報告書を作成するサンプルプログラムを示します。
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-REPORT.
DATA DIVISION.
FILE SECTION.
- 報告書を出力するためのファイル定義
- REPORT IS MY-SALES-REPORT で、このファイルが MY-SALES-REPORT という
- 報告書機能の出力先であることを宣言しています。
FD SALES-REPORT-FILE REPORT IS MY-SALES-REPORT.
- Report Writer によって自動的に生成されるレコードの定義
- このレコードレイアウトは RD で定義します。
REPORT SECTION.
- 報告書の定義
RD MY-SALES-REPORT
CONTROLS ARE FOOTING 100-LINE
PAGE LIMIT IS 55 LINES
HEADING 1
FIRST DETAIL 2
LAST DETAIL 10
FOOTING 12.
- 報告書のヘッダー情報
01 RESERVED.
05 LINE PIC X(5) VALUE ‘LINE’.
05 FILLER PIC X(10) VALUE ‘ITEM’.
05 FILLER PIC X(10) VALUE ‘PRICE’.
- 報告書の詳細レコード
01 DETAIL-LINE.
05 LINE-NUMBER PIC 9(5).
05 ITEM-NAME PIC X(10).
05 ITEM-PRICE PIC $$$,$$9.99.
- 報告書のフッター情報
01 FOOTING-LINE.
05 FILLER PIC X(10) VALUE ‘TOTAL:’.
05 TOTAL-PRICE PIC $$$,$$9.99.
WORKING-SECTION.
- 報告書に書き込むデータを格納する作業変数
01 WS-ITEM-DATA.
05 WS-ITEM-NAME PIC X(10).
05 WS-ITEM-PRICE PIC 9(5)V99.
05 WS-LINE-COUNTER PIC 9(5) VALUE 0.
05 WS-TOTAL-PRICE PIC 9(7)V99 VALUE 0.
01 WS-PRINT-LINE.
05 WS-LINE-NUMBER PIC 9(5).
05 WS-ITEM-NAME-OUT PIC X(10).
05 WS-ITEM-PRICE-OUT PIC $$$$,$$9.99.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
- 報告書処理の開始
OPEN OUTPUT SALES-REPORT-FILE.
- 報告書ヘッダーの生成 (PAGE 1 のヘッダーが自動的に生成される)
- GENERATE 文で RD で定義されたヘッダー/フッター/詳細レコードが生成される
- ここでは、ヘッダーの後に詳細データを記述するために、dummy の GENERATE を呼んでいます。
GENERATE MY-SALES-REPORT.
- サンプルデータの準備と詳細レコードの生成
MOVE ‘APPLE’ TO WS-ITEM-NAME.
MOVE 123.45 TO WS-ITEM-PRICE.
PERFORM WRITE-DETAIL-REPORT.
MOVE ‘BANANA’ TO WS-ITEM-NAME.
MOVE 50.20 TO WS-ITEM-PRICE.
PERFORM WRITE-DETAIL-REPORT.
MOVE ‘ORANGE’ TO WS-ITEM-NAME.
MOVE 75.80 TO WS-ITEM-PRICE.
PERFORM WRITE-DETAIL-REPORT.
- 報告書フッターの生成
- 100-LINE (PAGE FOOTING) が発生すると、自動的にフッターが生成されます。
- ここでは、明示的にフッターを生成するために、PAGE-COUNTER を 100 に設定しています。
- REAL-FOOTING-12 は RD で定義された FOOTING 12 のセクションを指します。
- 実際には、CONTROLS句や PAGE LIMIT到達時に自動生成されます。
- この例では、単純化のために手動でTOTALを計算し、フッターを生成するイメージです。
- 最終的な合計金額をフッターにセット
MOVE WS-TOTAL-PRICE TO TOTAL-PRICE OF FOOTING-LINE.
- フッターレコードを生成
GENERATE MY-SALES-REPORT FOOTING-LINE.
- 報告書処理の終了
CLOSE SALES-REPORT-FILE.
STOP RUN.
WRITE-DETAIL-REPORT.
ADD 1 TO WS-LINE-COUNTER.
MOVE WS-LINE-COUNTER TO WS-LINE-NUMBER.
MOVE WS-ITEM-NAME TO WS-ITEM-NAME-OUT.
MOVE WS-ITEM-PRICE TO WS-ITEM-PRICE-OUT.
MOVE WS-LINE-NUMBER TO LINE-NUMBER OF DETAIL-LINE.
MOVE WS-ITEM-NAME-OUT TO ITEM-NAME OF DETAIL-LINE.
MOVE WS-ITEM-PRICE-OUT TO ITEM-PRICE OF DETAIL-LINE.
- 詳細レコードの生成
GENERATE MY-SALES-REPORT DETAIL-LINE.
- 合計金額の計算
ADD WS-ITEM-PRICE TO WS-TOTAL-PRICE.
- ページフッターを生成するトリガーのために、ページ制限に達するまで詳細を生成します。
- この例では、ページ制限は 55行ですが、サンプルデータが少ないため、
- CONTROLS句で指定した 100-LINE (PAGE FOOTING) が自動的に発生するのを待ちます。
- 実際には、データ量に応じてページ分割や集計が行われます。
- GENERATE MY-SALES-REPORT. (次の行を生成)
サンプルプログラムの解説:
- `FD SALES-REPORT-FILE REPORT IS MY-SALES-REPORT.`
「SALES-REPORT-FILE」というファイルが、「MY-SALES-REPORT」という名前の報告書機能の出力先であることを宣言しています。
- `RD MY-SALES-REPORT …`
報告書のレイアウトや制御情報を定義しています。ヘッダー、詳細、フッターの構成や、ページ制御などをここで指定します。
- `GENERATE MY-SALES-REPORT DETAIL-LINE.`
RD で定義された「DETAIL-LINE」のフォーマットに従って、レコードを生成し、SALES-REPORT-FILE に出力します。
- `GENERATE MY-SALES-REPORT FOOTING-LINE.`
RD で定義された「FOOTING-LINE」のフォーマットに従って、レコードを生成し、SALES-REPORT-FILE に出力します。
このサンプルでは、WRITE 文を使わずに GENERATE 文だけで報告書を出力できているのがわかります。
5. 応用・注意点:現場で役立つTips
- ヘッダーとフッターの自動生成: GENERATE 文を一度発行するだけで、RD で定義されたヘッダーやフッターが自動的に出力される場合があります。特に、ページヘッダー/フッターはページが変わるたびに自動で出力されます。
- 集計フィールドの活用: Report Writer には、合計や平均などを自動計算してくれる機能があります。これらを活用することで、さらにコードを簡潔にできます。
- エラーハンドリング: ファイル出力時のエラー(ディスク容量不足など)は、通常の WRITE 文と同様に、FILE STATUS 句などでチェックする必要があります。
- デバッグのコツ: Report Writer は内部で多くの処理を行っているため、デバッグが難しい場合があります。まずは、RD の定義を細かく確認し、GENERATE 文の呼び出し箇所と出力されるレコードを一つずつ照らし合わせることから始めましょう。
- 既存コードの確認: 既存の COBOL プログラムで報告書を作成している場合、FD の定義に `REPORT IS` が付いているかどうかを確認してみてください。付いている場合は、Report Writer 機能が使われている可能性が高いです。
REPORT IS 句は、COBOL で報告書を作成する際に非常に強力な機能です。ぜひマスターして、効率的な開発に役立ててください。

コメント