【COBOL学習|初心者向け】COBOL Report Writerの落とし穴:REPORT SECTIONでOCCURS句を使いこなすコツ

1. 導入:なぜこの知識が必要なのか

COBOLの「Report Writer(報告書作成機能)」は、複雑な帳票を簡潔に書くための強力な武器です。しかし、ベテランの私でも初心者の頃に一度は悩むのが「REPORT SECTION内でのOCCURS句の扱い」です。特に、配列データを横に並べて出力しようとした際、思い通りの位置に印字されず途方に暮れることがあります。今回は、Report WriterでOCCURS句を扱う際の制限と、現場で通用する賢い書き方について解説します。

2. 基礎知識:Report WriterとOCCURS句の関係

通常、DATA DIVISIONで定義するOCCURS句は、メモリ上の繰り返し領域を指します。しかし、REPORT SECTIONでこれを使用する場合、注意が必要です。Report Writerは「行」と「列」をあらかじめ定義して出力する仕組みですが、OCCURS句で定義した配列をそのまま配置すると、システムは「どこに何番目を置くか」という動的な制御を自動では行いません。つまり、「OCCURSで定義した項目は、原則として固定の列位置に配置される」という制約があるのです。

3. 実装/解決策:固定位置定義のテクニック

動的に列位置をずらす機能が限定的なため、現場での定石は「個別に項目を定義する」か「OCCURS句のインデックスを制御してプログラム側で調整する」かの二択です。最も安全でバグを生みにくいのは、あらかじめ最大要素数分の項目をREPORT SECTIONに静的に並べて定義しておく方法です。これにより、Report Writer特有の複雑な制御に悩まされることなく、整然とした帳票を作成できます。

4. サンプルプログラム

以下に、3つの要素を持つ配列を横に並べて出力する実用的な例を示します。

REPORT SECTION.
RD SAMPLE-REPORT.
01 DETAIL-LINE TYPE DETAIL.
05 COLUMN 1 PIC X(10) VALUE “売上データ:”.

  • OCCURS句をバラして定義することで、列位置を確実に固定する

05 COLUMN 15 PIC Z(9)9 SOURCE SALES-DATA(1).
05 COLUMN 25 PIC Z(9)9 SOURCE SALES-DATA(2).
05 COLUMN 35 PIC Z(9)9 SOURCE SALES-DATA(3).

WORKING-STORAGE SECTION.
01 SALES-TABLE.
05 SALES-DATA PIC 9(9) OCCURS 3 TIMES.

5. 応用・注意点:現場で陥りやすいバグの回避策

現場でよくある失敗は、OCCURS句をそのままREPORT SECTIONに記述し、期待した列位置に印字されずに出力が重なってしまうケースです。
注意すべきポイントは以下の通りです。

列位置の重複を避ける:COLUMN句で指定する位置が重なると、コンパイルエラーや予期せぬ印字結果の原因になります。必ず各項目の幅を計算し、隙間を開けるように設計してください。
要素数の固定:配列の要素数が可変である場合、REPORT SECTIONだけで対応しようとせず、一度WORKING-STORAGEで編集用領域(画面イメージ)を作成してから、それをREPORT SECTIONに渡す手法が最も保守性が高いです。

Report Writerは便利ですが、万能ではありません。今回のように「あえて静的に書く」という選択ができるようになることが、ベテランへの第一歩ですよ。

コメント

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