導入
COBOLでのシステム開発において、可変長レコードや動的な電文処理は避けて通れない場面です。特に「OCCURS DEPENDING ON(以下ODO)」句を使ったテーブルは、メモリ効率を最適化する上で非常に重要です。しかし、この可変長テーブルに対して単にLENGTH関数を使うだけでは、期待通りの値が取れないと悩む若手技術者も少なくありません。今回は、ODO句で定義されたテーブルの「現在の実サイズ」を正確に取得するテクニックを解説します。
基礎知識
ODO句は、データ項目の繰り返し回数を実行時に可変させるための機能です。例えば、通信電文のヘッダーに「明細件数」があり、その後に明細が続くような構造を定義する際に用いられます。
ここで重要なのは、COBOLが「テーブルの最大サイズ」と「現在の実サイズ」をどう区別しているかです。LENGTH関数は通常、定義された最大長を返しますが、ODO句と組み合わせることで、DEPENDING ON項目に格納された数値に基づいた、その時点での動的な長さを取得できるようになります。
実装/解決策
LENGTH関数をODO句を含むグループ項目に対して実行すると、コンパイラはDEPENDING ON項目を参照し、現在使用されている要素数分だけの長さを計算します。これにより、ハードコーディングされた最大長ではなく、実際にデータが存在する範囲のバイト数を正確に得ることができます。これは、外部インターフェースとのデータ送受信時や、可変長ファイルへの書き出し時の長さを特定する際に非常に有用です。
サンプルプログラム
以下に、明細件数に応じて動的に変化するグループ項目のサイズを取得するプログラム例を提示します。
IDENTIFICATION DIVISION.
PROGRAM-ID. DYNAMIC-LEN-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- — 可変長テーブルの定義 —
01 WS-DATA-AREA.
05 WS-COUNT PIC 9(02) VALUE 3.
05 WS-TABLE OCCURS 1 TO 10 TIMES DEPENDING ON WS-COUNT.
10 WS-ITEM PIC X(05).
01 WS-CUR-SIZE PIC 9(04).
PROCEDURE DIVISION.
- — 現在のWS-COUNTは3なので、5バイト×3=15バイトが返る —
COMPUTE WS-CUR-SIZE = FUNCTION LENGTH(WS-TABLE).
DISPLAY “現在の実サイズは: ” WS-CUR-SIZE ” バイトです。”
- — 件数を変更して再度取得 —
MOVE 5 TO WS-COUNT.
COMPUTE WS-CUR-SIZE = FUNCTION LENGTH(WS-TABLE).
DISPLAY “変更後の実サイズは: ” WS-CUR-SIZE ” バイトです。”
GOBACK.
応用・注意点
実務でこの技術を使う際、注意すべき点が2つあります。
1つ目は、DEPENDING ON項目自体の更新タイミングです。LENGTH関数は「関数が評価される瞬間のDEPENDING ON項目の値」を見に行きます。ロジックの途中で件数を変更した場合は、必ずLENGTH関数を呼び出す直前に正しい件数を設定するようにしてください。
2つ目は、再定義(REDEFINES)との組み合わせです。ODO句を含む項目をREDEFINESで上書きしている場合、コンパイラによっては期待したサイズが取れないことがあります。設計の段階で、可変長データは独立したグループ項目として扱い、必要に応じてMOVEや参照を行う設計にするのが、ベテランの現場では推奨されるクリーンな実装です。

コメント