【COBOL学習|豆知識】LINE-COUNTER特殊レジスタの活用術 ~報告書作成の効率化~

はじめに

COBOLで報告書を作成する際、ページごとに印字した行数を把握し、適切なタイミングで改ページやヘッダー/フッターの印字を行いたい場面は多いかと思います。そんな時に役立つのが、COBOLの特殊レジスタ「LINE-COUNTER」です。この特殊レジスタを理解し、活用することで、報告書作成の効率を格段に向上させることができます。

LINE-COUNTERとは?

LINE-COUNTERは、Report Writer機能において、現在処理しているページで印字された行数を保持する特殊なレジスタです。RD (Report Description) ごとに自動的に生成され、そのRDで出力された行数が増えるたびに自動的にカウントアップされます。

通常、Report WriterはこのLINE-COUNTERを内部的に使用して、ページ区切りや特定の行数に達した際の処理を制御しています。しかし、このLINE-COUNTERは手続き部 (PROCEDURE DIVISION) からも参照することが可能です。これにより、Report Writerの標準機能だけでは実現できない、より柔軟で動的な印字制御が可能になります。

例えば、「ある条件を満たすデータ行が50行を超えたら、特別なメッセージを印字する」といった処理や、「ページの下限からN行以内になったら、注意喚起メッセージを表示する」といった制御が、LINE-COUNTERを参照することで実現できます。

LINE-COUNTERを使った動的な印字制御の実装

LINE-COUNTERを参照して動的な印字制御を行う基本的な流れは以下のようになります。

1. RDの定義: 報告書を定義するRDセクションにおいて、LINE-COUNTERを使用したい報告書に該当するRDを特定します。LINE-COUNTERはRDごとに自動生成されるため、特別な宣言は必要ありません。
2. 手続き部での参照: PROCEDURE DIVISION内で、IF文などの条件分岐を用いてLINE-COUNTERの値を参照します。

以下に、LINE-COUNTERを使って、ある条件を満たすデータ行が50行を超えた場合に、特別なメッセージを印字する例を示します。

サンプルプログラム

IDENTIFICATION DIVISION.
PROGRAM-ID. LINE-COUNTER-SAMPLE.
DATA DIVISION.
REPORT SECTION.
RD REPORT-RD.
PAGE HEADING
CONTROL HEADING 01
CONTROL FOOTING 01
PAGE FOOTING.
01 FILLER PIC X(80) VALUE ALL ”.
01 LINE-BREAK-MSG PIC X(80).
01 DETAIL-LINE.
05 DETAIL-DATA PIC X(20).
05 DETAIL-VALUE PIC 9(10).

PROCEDURE DIVISION USING REPORT-RD.
MAIN-PROCEDURE.
PERFORM INITIALIZE-DATA.
PERFORM PROCESS-RECORDS.
PERFORM WITH-TEST AFTER UNTIL END-OF-DATA
PERFORM PROCESS-RECORDS
END-PERFORM.
CLOSE REPORT REPORT-RD.
STOP RUN.

INITIALIZE-DATA.
OPEN OUTPUT REPORT.
MOVE SPACES TO DETAIL-LINE.
MOVE SPACES TO LINE-BREAK-MSG.

PROCESS-RECORDS.
IF LINE-COUNTER > 50 THEN
MOVE ‘— 50行を超えました! —‘ TO LINE-BREAK-MSG
WRITE LINE-BREAK-MSG AFTER 2 > 2行空けて印字
ELSE
MOVE SPACES TO LINE-BREAK-MSG
END-IF.

ADD 1 TO DETAIL-VALUE. > データ例の値をインクリメント
MOVE ‘Sample Data’ TO DETAIL-DATA.
WRITE DETAIL-LINE FROM DETAIL-LINE AFTER 1. > 1行空けてデータ行を印字

> 以下の処理は、実際のデータ入力やファイル読み込みに置き換えてください。
> ここでは、便宜上、60レコード処理したら終了とする例です。
IF DETAIL-VALUE > 60 THEN
MOVE ‘Y’ TO END-OF-DATA
ELSE
MOVE ‘N’ TO END-OF-DATA
END-IF.

END-OF-DATA PIC X VALUE ‘N’.

END PROGRAM LINE-COUNTER-SAMPLE.

このサンプルプログラムでは、`PROCESS-RECORDS`実行時に、まず`LINE-COUNTER`が50を超えているかチェックしています。もし50を超えていれば、特別なメッセージ`LINE-BREAK-MSG`に設定し、2行空けて印字しています。その後、データ行を1行空けて印字しています。`LINE-COUNTER`はデータ行が`WRITE`されるたびに自動的にカウントアップされます。

応用と注意点

  • 改ページとの連携: LINE-COUNTERは、`AFTER PAGE`句や`AFTER n LINES`句と組み合わせて使うことで、より高度なページレイアウト制御が可能です。例えば、「ページの下から5行以内になったら、フッター情報を印字する」といった制御も、LINE-COUNTERの値をチェックすることで実現できます。
  • RDの特定: 複数のRDを持つ報告書の場合、LINE-COUNTERはRDごとに独立してカウントされます。どのRDのLINE-COUNTERを参照しているのかを意識することが重要です。
  • 初期値: LINE-COUNTERの初期値は0です。ページヘッダーやページフッターの印字も行数としてカウントされるため、実際のデータ行数とは若干ずれが生じる場合があります。必要に応じて、印字処理の前後でLINE-COUNTERの値を調整するロジックを組み込むことも検討してください。
  • パフォーマンス: 大量のデータを処理する場合、手続き部で頻繁にLINE-COUNTERを参照するロジックは、パフォーマンスに影響を与える可能性があります。処理の要否を慎重に検討し、最適化を図ることが重要です。

LINE-COUNTER特殊レジスタを使いこなすことで、報告書作成の自由度が増し、より洗練された出力が可能になります。ぜひ、皆さんの開発でも活用してみてください。

コメント

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