【COBOL学習|実務向け】COBOLのReport Writer機能:GENERATE文による効率的な帳票作成術

導入:なぜGENERATE文を使うのか

COBOLの現場で帳票作成を行う際、改ページ制御、合計行(フッター)の算出、見出しの印字といった「定型的な処理」を全て手動で記述していませんか?これらのロジックを個別に書くと、複雑な条件分岐が重なり、バグの温床になりがちです。Report Writer機能の「GENERATE文」を活用すれば、これらの制御をCOBOLコンパイラに任せることができ、保守性の高い、スッキリとしたプログラムに生まれ変わります。

基礎知識:Report Writerとは

Report Writerは、帳票出力に特化した強力な機能です。大きく分けて「定義部(REPORT SECTION)」と「実行部」に分かれます。
・REPORT SECTION:帳票のレイアウト(見出し、明細、合計)を定義します。
・GENERATE文:実行部でこの命令を呼び出すと、定義に基づき、明細行の出力や、指定したキー(CONTROL句)によるグループ制御を自動的に実行します。プログラマは「何を出力するか」を指示するだけで、制御のタイミングはシステムが判断してくれます。

実装:GENERATE文の論理的フロー

GENERATE文を実行すると、Report Writerは以下のステップを裏側で処理します。
1. キー項目の比較:前回のレコードとキー値を比較し、変化があれば「制御切れ(コントロール・ブレイク)」と判断。
2. 集計処理:定義されたSUM句に基づき、加算処理を実行。
3. 行出力:明細行(DETAIL)を出力し、必要であればヘッダーやフッターを自動挿入。
この仕組みにより、何千行という明細データも、わずか数行のロジックで制御可能になります。

サンプルプログラム

以下は、売上データから明細を出力し、得意先コードが変わった際に自動で合計を表示する例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. REPORT-SAMPLE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT SALES-FILE ASSIGN TO ‘SALES.DAT’.
SELECT PRINT-FILE ASSIGN TO ‘REPORT.TXT’.

DATA DIVISION.
FILE SECTION.
FD SALES-FILE.
01 SALES-REC.
05 CUSTOMER-ID PIC X(5).
05 SALES-AMT PIC 9(7).

REPORT SECTION.
RD SALES-REPORT
CONTROL CUSTOMER-ID.
01 TYPE PAGE-HEADING.
05 LINE 1 VALUE “売上報告書”.
01 DETAIL-LINE TYPE DETAIL.
05 LINE + 1.
10 COLUMN 1 PIC X(5) SOURCE CUSTOMER-ID.
10 COLUMN 10 PIC ZZZ,ZZ9 SOURCE SALES-AMT.
01 TYPE CONTROL FOOTING CUSTOMER-ID.
05 LINE + 1.
10 COLUMN 1 VALUE “小計:”.
10 COLUMN 10 PIC ZZZ,ZZ9 SUM SALES-AMT. > ここで自動集計

PROCEDURE DIVISION.
OPEN INPUT SALES-FILE OUTPUT PRINT-FILE.
INITIATE SALES-REPORT. > レポート開始
PERFORM UNTIL END-OF-FILE
READ SALES-FILE AT END SET END-OF-FILE TO TRUE
NOT AT END
GENERATE DETAIL-LINE > 明細出力と自動制御
END-READ
END-PERFORM.
TERMINATE SALES-REPORT. > レポート終了(最終フッター出力)
CLOSE SALES-FILE PRINT-FILE.
STOP RUN.

応用・注意点:現場で陥りやすい罠

1. INITIATEとTERMINATEを忘れないこと:
GENERATE文を呼ぶ前には必ずINITIATEで初期化し、最後にTERMINATEで締めくくる必要があります。これを忘れると、最終行の合計が出力されない等のトラブルになります。
2. SUM句の挙動:
SUM句で指定する項目は、必ず明細行で値をセットしてからGENERATEを呼び出すようにしてください。また、制御切れが発生すると、Report Writerは自動的にSUM句の内容をクリアするため、累計の持ち越し処理を自前で書く必要はありません。
3. 柔軟性の欠如:
Report Writerは定型帳票には非常に強力ですが、複雑すぎる変則レイアウトには向きません。その場合は従来のWRITE文による制御と使い分けるのが、ベテランの判断基準です。

コメント

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