【COBOL学習|実務向け】可変長データ処理の要『OCCURS … DEPENDING ON』を使いこなす

導入

メインフレームでのバッチ処理において、ファイルから読み込むレコードの長さが一定ではないケースは珍しくありません。特に、可変長レコードを扱う際、あらかじめ最大サイズで配列を確保して無駄なメモリを消費したり、逆に固定長で定義して切り捨てエラーを起こしたりした経験はありませんか?『OCCURS … DEPENDING ON(以下、ODO)』を正しく理解し活用することは、柔軟かつ効率的なデータ制御を実現するための必須スキルです。

基礎知識

ODOは、テーブルの要素数がプログラム実行時に動的に決定される「可変長テーブル」を定義するための構文です。通常のOCCURS句が静的にサイズを固定するのに対し、ODOは「制御項目(DEPENDING ONの後に指定するデータ項目)」の値によって、その時々の有効な配列要素数をプログラムが認識します。これにより、レコード長が変動するファイル入出力や、動的なデータ構造の制御をスマートに行うことが可能になります。

実装・解決策

ODOを使用する際は、必ず「最大長」と「最小長」を定義し、制御項目に現在処理対象としている件数や長さをセットします。重要なのは、制御項目の値は、テーブルを参照する前に必ず最新の状態に更新されていることです。このルールを守らないと、意図しないメモリ領域を参照したり、データ転送時に誤ったバイト数が扱われたりする原因となります。

サンプルプログラム

以下のコードは、可変長の取引データを受信し、その件数に応じて処理を切り替える例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. ODO-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.

  • 制御項目: 現在の有効な件数を格納

05 WS-COUNT PIC 9(02) VALUE 0.

  • 可変長テーブルの定義

05 WS-TABLE-AREA.
10 WS-ITEM PIC X(10) OCCURS 1 TO 50
DEPENDING ON WS-COUNT.

PROCEDURE DIVISION.
MAIN-LOGIC.

  • — データ読み込み(例として3件のデータがあるとする) —

MOVE 3 TO WS-COUNT.
MOVE “DATA-01” TO WS-ITEM(1).
MOVE “DATA-02” TO WS-ITEM(2).
MOVE “DATA-03” TO WS-ITEM(3).

  • — 動的な件数に応じたループ処理 —

PERFORM VARYING WS-IDX FROM 1 BY 1
UNTIL WS-IDX > WS-COUNT
DISPLAY “処理中データ: ” WS-ITEM(WS-IDX)
END-PERFORM.

STOP RUN.

応用・注意点

現場でODOを使用する際、最も注意すべきは「データ移動(MOVE)時の挙動」です。ODOを含むレコード全体を他の領域へMOVEする場合、コンパイラや設定によっては制御項目の値に基づいて転送サイズが決定されるため、意図せずデータが切り詰められることがあります。

また、デバッグ時に「テーブルの中身が見えない」と悩むことがありますが、これはデバッガが制御項目の値を正しく認識できていないか、制御項目が未初期化であることが原因のほとんどです。ODOを使う際は、制御項目の更新と参照の整合性を徹底して管理することが、バグを未然に防ぐ最大の秘訣です。可変長処理を制する者は、堅牢なデータ処理を制します。ぜひ現場のコードで活用してください。

コメント

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