導入:なぜDETAIL句の名前付けが重要なのか
COBOLのREPORT SECTIONを使用して帳票を作成する際、もっとも注意すべき点の一つがDETAIL句の名前付けです。REPORT SECTIONでは、ページヘッダ(PH)やコントロールフッタ(CF)などは名前を省略してもコンパイルが通ることがありますが、DETAIL集団項目だけは別格です。なぜなら、PROCEDURE DIVISIONから「どの明細を出力するか」を指示する際、この名前を必ず指定しなければならないからです。名前が重複していたり、一意でなかったりすると、プログラムは意図しない箇所を出力したり、コンパイルエラーを引き起こしたりします。今回は、この「DETAIL句の重複禁止」というルールを正しく理解し、堅牢な帳票プログラムを書くためのTipsをお伝えします。
基礎知識:REPORT SECTIONの構造とDETAILの役割
COBOLの帳票作成機能では、帳票のレイアウトをREPORT SECTIONで定義します。
・PH (PAGE HEADING): ページごとの見出し。
・DETAIL: レコードごとに繰り返し出力される明細行。
・CF (CONTROL FOOTING): グループごとの合計行。
この中で、DETAILは「PROCEDURE DIVISIONからのGENERATE文によって呼び出される」という特徴があります。GENERATE文は「どのDETAILを印刷せよ」という命令を送るため、DETAILには必ず「一意(ユニーク)な名前」が必要なのです。
実装と解決策
DETAIL句を定義する際は、必ず01レベルに一意の名前を付けます。例えば、同一帳票内で「商品明細」と「合計明細」を分けたい場合、以下のように明確に識別可能な名称を付与します。
・DETAIL-LINE-PRODUCT
・DETAIL-LINE-SUMMARY
このように接尾辞や役割を名前に含めることで、重複を回避し、かつPROCEDURE DIVISION側でどの行を操作しているのかが直感的にわかるように設計するのが、ベテランの流儀です。
サンプルプログラム
以下のコードは、DETAIL句を明示的に定義し、PROCEDURE DIVISIONから適切に呼び出す例です。
REPORT SECTION.
01 REPORT-HEADER TYPE IS PAGE HEADING.
05 LINE 1 COLUMN 1 PIC X(10) VALUE “売上報告書”.
- DETAIL句には一意の名前を必ず付ける
01 DETAIL-LINE-SALES TYPE IS DETAIL.
05 COLUMN 1 PIC X(10) SOURCE WS-ITEM-NAME.
05 COLUMN 15 PIC Z(8)9 SOURCE WS-ITEM-PRICE.
PROCEDURE DIVISION.
- GENERATE文でDETAIL名を指定して出力する
GENERATE DETAIL-LINE-SALES.
応用・注意点:現場で陥りやすいバグの回避策
現場でよくあるミスとして、コピーブック(COPY句)を使用してREPORT SECTIONを共通化する際に、名前が重複してしまうケースがあります。
例えば、複数のプログラムで同じレイアウトのDETAILを読み込んでいると、メインのプログラムでDETAIL名が衝突し、「一意ではありません」というコンパイルエラーが発生します。
これを回避するためには、COPY句にREPLACING指定を使用するか、プロジェクト全体でDETAIL名の命名規則(例:レポートID_DETAIL_役割)を厳格に定めることを強く推奨します。また、GENERATE文で指定する名前は、論理的な役割を反映したものにしてください。「DETAIL-01」「DETAIL-02」のような連番だと、後からコードを見たときに「どの行を出力しているのか」が分からず、保守性が著しく低下します。
帳票作成はCOBOLの醍醐味です。DETAIL名の管理を徹底し、保守性の高いプログラムを目指しましょう。

コメント