1. 導入:なぜ相対行指定が重要なのか
COBOLで帳票を出力する際、もっとも頭を悩ませるのが「行位置の制御」です。例えば、明細行を詰めて表示したい場合や、特定の条件で間隔を広げたい場合、絶対位置(固定行)で指定しているとプログラムの修正が非常に大変になります。そんな時に役立つのが「LINE NUMBER IS PLUS」という相対指定です。これを使うことで、「今の行から何行分進めるか」という直感的な制御が可能になり、帳票レイアウトの変更に強いコードを書くことができます。
2. 基礎知識:相対指定とは何か
COBOLのREPORT SECTIONでは、印刷する行の位置を定義します。通常、LINE NUMBER IS 5のように指定すると「5行目に印刷」という絶対位置になりますが、これだと行の挿入や削除のたびに数値を書き換えなければなりません。
一方、「LINE NUMBER IS PLUS 1」と記述すると、「現在の印字位置の次の行(1行改行)」という意味になります。PLUS 2なら「1行空けて次の行」という意味になり、帳票の動的な制御には欠かせない仕組みです。
3. 実装と解決策
実装のポイントは、REPORT SECTION内の明細行(DETAIL)でこの記述を使うことです。
例えば、「明細行は詰めて印字するが、合計行の前だけは1行空けたい」といった要件がある場合、明細行にはPLUS 1を指定し、合計行にはPLUS 2を指定することで、コードを書き換えることなく柔軟なレイアウトが実現できます。
4. サンプルプログラム
以下は、明細行を連続して出力し、最後に1行空けてから合計を表示するシンプルな例です。
01 DETAIL-LINE TYPE IS DETAIL.
05 LINE NUMBER IS PLUS 1.
10 COLUMN 5 PIC X(20) SOURCE ITEM-NAME.
10 COLUMN 30 PIC ZZZ,ZZ9 SOURCE ITEM-PRICE.
01 TOTAL-LINE TYPE IS CONTROL FOOTING FINAL.
- ここでPLUS 2を指定することで、前の行から1行空けて合計を出力します
05 LINE NUMBER IS PLUS 2.
10 COLUMN 5 PIC X(05) VALUE ‘合計’.
10 COLUMN 30 PIC ZZZ,ZZ9 SOURCE TOTAL-PRICE.
5. 応用・注意点:現場で陥りやすい罠
ベテランとして一つアドバイスしておきます。「ページ制御との兼ね合い」には注意してください。
PAGE LIMIT(1ページの最大行数)を指定している場合、PLUS指定を多用すると、意図せず改ページが発生するタイミングがずれることがあります。特に、PLUSの数値が大きい場合、ページ境界をまたいでしまうと、予期せぬ空白行が先頭に入ってしまうことがあります。
また、PLUSはあくまで「直前の印字位置」が基準です。条件分岐で「この項目を印字しない」という処理を入れると、PLUS 1でも結果的に行が詰まって見えなくなることがあります。帳票の「最後がどこで終わるか」を常に意識して、複雑な条件分岐がある場合は、必ず印字テストを行うようにしましょう。

コメント