1. 導入:なぜこのテクニックが重要なのか
COBOLで報告書や帳票を作成する際、配列(テーブル)に格納されたデータを1行ずつ出力する処理は頻繁に行われます。通常、報告書作成機能(Report Writer)を使うと記述が楽になりますが、配列の中身を動的に出力したい場合、単なる変数指定ではうまくいきません。そこで登場するのが「SOURCE句と添字の併用」です。このテクニックを習得すれば、複雑な繰り返し処理を手動で書く手間を省き、スマートに帳票を出力できるようになります。
2. 基礎知識:添字(Subscript)とは
COBOLにおける「添字」とは、配列(テーブル)内の特定の要素を指し示すための「インデックス」のことです。例えば、10個のデータを持つ配列の3番目を取り出したいとき、配列名(3)のように記述します。この(3)の部分が添字です。報告書作成機能においてSOURCE句に添字を記述すると、その行が出力される瞬間に、その添字が指すデータが読み取られます。
3. 実装のポイント
最も重要な注意点は「タイミング」です。SOURCE句に書かれた変数は、報告書作成機能が内部で自動的に出力処理を行うタイミングで評価されます。そのため、手続き部(PROCEDURE DIVISION)でループを回して添字を操作する場合、報告書の出力命令(GENERATE)と添字の更新タイミングがずれると、予期せぬデータが出力されてしまいます。必ず「データをセットしてからGENERATEする」という順序を徹底しましょう。
4. サンプルプログラム
以下のコードは、配列内のデータを報告書へ出力する例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. REPORT-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-VAL PIC X(10) OCCURS 5 TIMES.
01 WS-IDX PIC 9(1) VALUE 1.
REPORT SECTION.
RD MY-REPORT.
01 DETAIL-LINE TYPE DETAIL.
05 COL 10 SOURCE IS WS-VAL(WS-IDX). 「WS-IDX」の値によって出力内容が変わる
PROCEDURE DIVISION.
MOVE “データ1” TO WS-VAL(1).
MOVE “データ2” TO WS-VAL(2).
PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > 2
GENERATE DETAIL-LINE ここで現在指している添字のデータが出力される
END-PERFORM.
STOP RUN.
5. 応用・注意点:現場で陥りやすい罠
現場でよくあるミスは「添字の初期化忘れ」と「範囲外参照」です。
添字の初期化忘れ:ループを抜けた後、添字の値が最終値のまま残ります。次の処理で同じ配列を使う際、意図せず古い添字から始まってしまうことがあるため、再利用時は必ず初期化してください。
範囲外参照:添字がテーブルのOCCURS回数を超えると、プログラムが異常終了するか、メモリ上の不正な領域を読み取ってしまいます。必ず「UNTIL」条件などで、添字が配列サイズを超えないよう厳密に制御しましょう。
このテクニックを使いこなせれば、複雑な配列データもすっきりとしたコードで帳票化できるようになります。ぜひ現場のロジックに組み込んでみてください。

コメント