導入:なぜ「0」が許されないのか?
COBOLで報告書作成機能(Report Writer)を使用する際、RD(Report Description)記述項でページサイズ(行数)を定義します。時折、テストコードや極端な帳票設計の中で「とりあえずページサイズを0にしておこう」というミスが見受けられます。しかし、これは致命的なエラーの原因となります。なぜなら、プリンタやファイルといった「物理的な出力先」には必ず物理的な境界が存在し、COBOLはそれを前提に制御を行っているからです。
基礎知識:RD記述項とページ制御の仕組み
RD記述項は、報告書のレイアウトや改ページ制御を定義する重要な箇所です。特に「PAGE LIMIT」句は、1ページあたり何行出力するかをシステムに教えるためのものです。COBOLの実行時ライブラリは、この指定値をもとに「現在の行数」をカウントし、限界に達した瞬間に自動的に改ページ(HEADINGやDETAILの制御)を行います。もしここが「0」や負の値だと、システムは「1ページに何行あるのか」を計算できず、論理エラーを引き起こしてしまいます。
実装/解決策:正しいページサイズの指定
ページサイズには、必ず「1以上の正の整数」を指定してください。現場での運用を考えるならば、出力用紙(A4など)の行数から、ヘッダー(PH)やフッター(PF)が占める行数を差し引いた、現実的な値を設定するのが鉄則です。
サンプルプログラム:安全なRD記述項の書き方
以下に、正しくページ行数を定義した報告書作成機能のサンプルを示します。
- — 報告書作成の基本定義 —
- 1ページあたり60行で制御する例
REPORT SECTION.
RD SALES-REPORT
CONTROLS ARE REGION-ID
PAGE LIMIT IS 60 LINES
FIRST DETAIL 5
LAST DETAIL 55.
01 PAGE-HEADER TYPE PAGE HEADING.
05 COLUMN 1 PIC X(20) VALUE ‘売上報告書’.
01 DETAIL-LINE TYPE DETAIL.
05 COLUMN 1 PIC X(10) SOURCE SALES-ITEM.
- — 補足:上記コードのポイント —
- PAGE LIMIT: 1ページ全体の行数(ここでは60行)
- FIRST DETAIL: 明細が出力開始される行番号
- LAST DETAIL: 明細が出力終了される行番号
- これらを適切に設定することで、自動改ページが正しく機能します。
応用・注意点:現場で陥りやすいバグ
現場でよくあるミスとして、変数(データ項目)を使って動的にページサイズを変更しようとするケースがあります。その際、初期化忘れで「0」が代入されたままRDが評価されると、即座に異常終了(ABEND)します。
1. 定数の利用: 可能であれば、リテラル(数値)で固定値を定義することをお勧めします。
2. バリデーション: もしプログラム内で動的に計算してページサイズを決める場合は、必ず「IF ページ行数 < 1 THEN ページ行数 = 60(デフォルト値)」のような防衛的なコーディングを徹底してください。
「0」は無を意味しますが、コンピュータの世界では「0による除算」や「無限ループ」といったトラブルの入り口になることが多々あります。帳票設計の際は、常に「物理的な制約」を意識した実装を心がけましょう。

コメント