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文などで追跡することをお勧めします。

コメント