【COBOL学習|実務向け】[COBOL Report Writer機能:LINE句とPAGE-LIMIT句の競合を制する「自動改ページ」の挙動]

1. 導入:なぜこの仕様を理解しておく必要があるのか

帳票出力プログラムにおいて、Report Writer(RW)機能は非常に強力なツールです。しかし、定義した行数(LINE句)が、設定したページサイズ(PAGE-LIMIT句)を超えてしまった場合、プログラムはどう振る舞うのでしょうか?「エラーで異常終了するのではないか」と不安に思う方もいるかもしれません。実は、COBOLのRWは非常に賢く、自動的に改ページを判断するロジックを持っています。この挙動を理解することで、帳票レイアウトの微調整や、動的な行制御を安心して行えるようになります。

2. 基礎知識:RWにおける行制御の仕組み

Report Writerでは、REPORT SECTIONで各行の出力位置(LINE句)を指定します。ここで重要なのが「PAGE-LIMIT句」です。これは1ページあたりの最大行数を制御するもので、これに達すると自動的に制御グループ(DETAILやFOOTINGなど)の改ページ処理が発動します。
RWエンジンは「現在出力しようとしている行」が「PAGE-LIMITで指定された境界」を越えるかどうかを常に監視しています。もし越える場合は、強制的に「ページ終了処理(PAGE FOOTING)」を呼び出し、次ページの先頭から印字を再開させる仕組みになっています。

3. 実装/解決策:自動リカバリの論理

例えば、PAGE-LIMITを60行とし、DETAIL行にLINE 65を指定したとします。この場合、コンパイラは即座にエラーを出力するのではなく、実行時に「現在のページでは65行目に到達できない」と判断します。
このとき、RWは以下のように動作します。
1. 現在のページにおいて、65行目まで到達するためのスペースがないことを検知。
2. 自動的にページ終了ルーチンを呼び出し、PAGE-FOOTINGを出力。
3. 新しいページを生成し、ヘッダー(PAGE-HEADING)を出力。
4. 新しいページの65行目に該当する位置へ印字を試行。
このように、論理的な行位置が物理的なページ制限を超えた場合、RWは「ページを跨いで印字する」というリカバリを行います。

4. サンプルプログラム:行あふれ時の動作確認用コード

以下は、意図的にPAGE-LIMITを越える行数を指定し、RWの自動改ページを確認するためのサンプルです。

REPORT SECTION.
RD SAMPLE-REPORT
PAGE LIMIT 60
FIRST DETAIL 1
LAST DETAIL 55.

01 DETAIL-LINE TYPE IS DETAIL.
05 COLUMN 10 PIC X(20) VALUE ‘テストデータ’.
05 LINE 65 COLUMN 30 PIC X(10) VALUE ‘行あふれテスト’.

  • 65行目を指定していますが、PAGE-LIMIT 60のため
  • RWの制御により、自動的に次ページへ送られます。

PROCEDURE DIVISION.
INITIATE SAMPLE-REPORT.

  • 繰り返し処理を想定

GENERATE DETAIL-LINE.
TERMINATE SAMPLE-REPORT.
STOP RUN.

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

RWの自動改ページは非常に便利ですが、注意点もあります。

無限ループの回避
もしPAGE-LIMITよりも「大きなLINE句」を指定し続け、かつ「1ページ内に必ず1行は出力しなければならない」という制約の中で、PAGE-FOOTINGやPAGE-HEADINGが大きすぎると、ページが永遠に切り替わらない「改ページループ」に陥る可能性があります。

物理的なページサイズとの整合性
RW上の行数はあくまで「論理的な位置」です。プリンタのハードウェア側の物理的な改ページコードと、RWのPAGE-LIMITが一致していないと、印字がズレる原因になります。現場では、必ず実機のプリンタ出力結果とRWのPAGE-LIMIT設定を突き合わせて検証してください。

RWの自動制御は堅牢ですが、過信せず、デバッグ時には各グループの出力タイミングをDISPLAY文などで追跡することをお勧めします。

コメント

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