【COBOL学習|初心者向け】MOVE CORRESPONDINGの落とし穴!配列(OCCURS)との上手な付き合い方

MOVE CORRESPONDINGが重要である理由

COBOL開発において、項目名が一致するデータ項目を一括で転記できる「MOVE CORRESPONDING(以下、MOVE CORR)」は、記述量を減らし、保守性を高める強力な武器です。しかし、この便利な命令には、ベテランでもうっかり忘れてしまう重要な「制約」があります。それは、配列(OCCURS句)が含まれるデータ構造での挙動です。このルールを知らずに使うと、意図したデータが転記されず、バグの原因となるため、しっかりと押さえておきましょう。

基礎知識:なぜ配列は転記できないのか

COBOLのMOVE CORRは、グループ項目内で「名前が同じ項目」を探して転記する仕組みです。しかし、対象の項目に「OCCURS(配列)」が定義されている場合、COBOLコンパイラは「どの要素(添字)のデータを転記すべきか」を特定できません。そのため、設計仕様として、配列項目そのものはMOVE CORRの転記対象から除外される仕様になっています。この仕組みを理解せず、「グループ全体を転記すれば中身もコピーされるはず」と期待すると、予期せぬ不具合に直面することになります。

実装の解決策:ループ処理による個別転記

配列を含むグループ項目を転記したい場合、MOVE CORRに頼るのではなく、PERFORM文を用いた「ループ処理」を行うのが現場の鉄則です。転記したい配列の添字をループ変数で制御し、一つずつ要素を転記することで、確実なデータ移行が可能になります。

サンプルプログラム

以下は、配列を含むグループ項目を正しく転記するためのサンプルコードです。そのままコピーして、ロジックの参考にしてください。

IDENTIFICATION DIVISION.
PROGRAM-ID. MOVE-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.

  • 元データ構造

01 GROUP-A.
05 ITEM-NAME PIC X(10).
05 TABLE-DATA OCCURS 3 TIMES.
10 VALUE-DATA PIC 9(05).

  • 転記先データ構造

01 GROUP-B.
05 ITEM-NAME PIC X(10).
05 TABLE-DATA OCCURS 3 TIMES.
10 VALUE-DATA PIC 9(05).

01 I PIC 9(01).

PROCEDURE DIVISION.

  • 1. 名前が一致する項目のみMOVE CORRで転記

MOVE CORRESPONDING GROUP-A TO GROUP-B.

  • 2. 配列(TABLE-DATA)はMOVE CORRで転記されないため、ループで転記

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
MOVE VALUE-DATA(I) OF GROUP-A TO VALUE-DATA(I) OF GROUP-B
END-PERFORM.

GOBACK.

応用・注意点:現場で陥りやすいバグの回避策

現場で最も多いミスは、「MOVE CORRをすれば配列の中身も自動的に移動している」と誤解したままプログラムをリリースしてしまうことです。特に、後から仕様変更で項目が追加された際、既存のMOVE CORRを信用しすぎてバグを生むケースが散見されます。

回避のポイント
1. デバッグの徹底:MOVE CORRを使用した後は、転記されたはずの配列データが正しく反映されているか、単体テストで必ず確認してください。
2. 構造の単純化:複雑な階層を持つ配列に対してMOVE CORRを使うのは控え、構造体同士の代入は明示的に記述する癖をつけましょう。
3. コンパイラ警告の確認:環境によっては、MOVE CORRで除外された項目について警告が出る場合があります。警告を無視せず、仕様を確認する習慣が、トラブルを未然に防ぐ鍵となります。

「楽をするための命令」こそ、その裏側にある制約を理解して使う。これがCOBOL技術者としての正しい作法です。

コメント

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