1. 導入:なぜODOの理解が重要なのか
COBOL開発において、可変長データを取り扱う場面は少なくありません。特に複雑なファイル定義や通信電文の解析において、OCCURS句にDEPENDING ON(以下、ODO)を指定した可変長項目は必須の技術です。しかし、この仕組みを正しく理解していないと、意図しないデータ転記が発生したり、メモリ領域の予期せぬ破壊を招いたりします。本記事では、ODOによるサイズ計算規則を整理し、安全に扱うための勘所を解説します。
2. 基礎知識:ODOの仕組み
ODO(OCCURS … DEPENDING ON)は、配列の要素数を実行時に動的に制御するための句です。
通常、OCCURS句は固定長ですが、ODOを指定することで「最大要素数」と「現在の要素数」を分離できます。重要なのは、集団項目のサイズ計算は、常にその時点でのDEPENDING ON項目の値に基づいているという点です。MOVE文でこの集団項目を転記する際、コンパイラは動的に計算された長さだけを転記対象とします。
3. 実装と解決策
ODOを使用する際は、以下の二点を徹底してください。
・DEPENDING ON項目は、必ず集団項目よりも前に定義する。
・MOVE実行前に、必ず正しい要素数をDEPENDING ON項目にセットする。
このルールを守ることで、データ転記時の切り出しサイズが正しく制御されます。
4. サンプルプログラム
以下は、可変長テーブルを定義し、現在値に応じて転記を行う実用的なサンプルです。
IDENTIFICATION DIVISION.
PROGRAM-ID. ODO-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 01. 要素数を管理する制御変数
01 TBL-COUNT PIC 9(02) VALUE 0.
- 02. 可変長テーブルを含む集団項目
01 GROUP-ITEM.
05 MAX-VAL PIC 9(02) OCCURS 5 TIMES DEPENDING ON TBL-COUNT.
01 TARGET-BUFFER PIC X(10) VALUE SPACES.
PROCEDURE DIVISION.
MAIN-LOGIC.
- 要素数を3に設定(サイズは3要素分として計算される)
MOVE 3 TO TBL-COUNT.
MOVE 11 TO MAX-VAL(1).
MOVE 22 TO MAX-VAL(2).
MOVE 33 TO MAX-VAL(3).
- 集団項目を転記(ODOにより3要素分のみが評価される)
MOVE GROUP-ITEM TO TARGET-BUFFER.
DISPLAY “転記完了。現在の要素数: ” TBL-COUNT.
STOP RUN.
5. 応用・注意点:現場で陥りやすい罠
現場で最も注意すべきは、「DEPENDING ON項目を書き換えるタイミング」です。
MOVE文を実行する直前にDEPENDING ON項目を更新し忘れると、前回の値(古いサイズ)に基づいてデータが転記され、最悪の場合はバッファオーバーフローやデータ化けを引き起こします。また、別の領域へ MOVE した際に、転記先の領域が転記元の「最大サイズ」を保持できる大きさであるか、常に確認してください。
特に、通信電文の送受信では、計算された長さと実際の受信長が一致しているか、事前にバリデーションを行うのがベテランの作法です。

コメント