【COBOL学習|実務向け】REPORT SECTIONで88レベル条件名が使えない!帳票作成の定石と回避策

1. 導入:なぜこの制約が現場で問題になるのか

COBOLの報告書作成機能(REPORT SECTION)を使用している際、「フラグの状態(ON/OFF)をそのまま帳票に出したい」と考え、88レベルの条件名をSOURCE句に記述してコンパイルエラーに遭遇したことはありませんか?
REPORT SECTIONは、手続き部でMOVE文を多用することなく、定義に基づいた自動的な帳票出力を行う強力な機能ですが、その仕様上、条件名を直接参照できないという制約があります。本記事では、この「なぜ印字できないのか」という理由を紐解き、実務で使えるスマートな代替案を解説します。

2. 基礎知識:88レベル条件名とREPORT SECTIONの仕様

88レベル条件名(条件名項目)は、特定の変数が特定の値を持っているかどうかを「真(TRUE)または偽(FALSE)」として判定するための論理的な定義です。これはあくまで「判定用のラベル」であり、データ領域そのものに保持される値ではありません。
一方、REPORT SECTIONのSOURCE句は、データ項目(PICTURE句を持つ変数)の内容を直接参照して印字する仕組みです。そのため、実体を持たない条件名をSOURCE句に指定しても、コンパイラは「何を印字すればよいか」を判断できず、エラーとなります。

3. 実装・解決策:親項目を活用した「編集」のテクニック

解決策はシンプルです。条件名ではなく、その「親項目(フラグ変数)」をSOURCE句に指定し、編集用の項目(EDITED-ITEM)を使用して表示を制御します。
もし「1なら『有効』、0なら『無効』」のように表示を変えたい場合は、REPORT SECTION内に評価用の項目を用意するか、手続き部であらかじめ表示用の項目に値をセットしておくのが定石です。

4. サンプルプログラム:条件名を適切に扱う実装例

IDENTIFICATION DIVISION.
PROGRAM-ID. REPORT-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
  • フラグ項目の定義
01 WS-STATUS-FLAG PIC X. 88 STATUS-ACTIVE VALUE '1'. 88 STATUS-INACTIVE VALUE '0'.
  • 帳票出力用の編集項目
01 WS-STATUS-PRINT PIC X(6). REPORT SECTION. RD SAMPLE-REPORT. 01 TYPE DETAIL. 03 LINE 1.
  • 誤: SOURCE IS STATUS-ACTIVE. (コンパイルエラーになる)
  • 正: 手続き部で編集済みの項目をそのまま印字する
03 COLUMN 1 PIC X(6) SOURCE WS-STATUS-PRINT. PROCEDURE DIVISION.
  • 帳票出力前の準備
IF STATUS-ACTIVE MOVE '有効 ' TO WS-STATUS-PRINT ELSE MOVE '無効 ' TO WS-STATUS-PRINT END-IF.
  • この後、GENERATE文等で帳票を出力する
GOBACK.

5. 応用・注意点:現場で役立つ回避策とデバッグ

・複雑な条件の場合:
帳票上の印字ロジックが複雑(複数の条件が絡む)な場合は、REPORT SECTION内のSOURCE句で無理に変換しようとせず、手続き部で「出力用データ項目」を完全に構築してから出力処理に渡す「前処理方式」を強く推奨します。これにより、帳票定義がシンプルになり、将来的なレイアウト変更時のデバッグも容易になります。

・陥りやすいバグ:
88レベル条件名を使用していて「値が入っていない(初期化漏れ)」というバグがよく発生します。条件名判定は値が未定義でもエラーになりにくいため、数値や文字を扱う際は、必ず初期値(VALUE句)を明示的に設定する癖をつけましょう。

実務においては、コードの綺麗さも重要ですが、後任者が「どこで値が変換されているか」をすぐに追える設計にすることが、最も障害を減らす近道です。

コメント

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