【COBOL学習|初心者向け】【COBOL入門】報告書作成機能の基本!REPORT IS でファイル出力を自動化しよう

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 で報告書を作成する際に非常に強力な機能です。ぜひマスターして、効率的な開発に役立ててください。

コメント

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