1. なぜこのTipsが重要なのか
COBOL開発において、複数のデータ項目をまとめて転記する「MOVE CORRESPONDING(以下、MOVE CORR)」は非常に便利な命令です。しかし、フィールド名が同じであっても「なぜか転記されない」という事態に陥ったことはありませんか?その原因は、実はデータ定義の「レベル番号」にあるかもしれません。今回は、MOVE CORRの挙動を左右する特殊レベル番号(66/77/88)の役割と、バグを防ぐためのデータ設計の作法を解説します。
2. 基礎知識:特殊レベル番号とは
COBOLには、通常のデータ項目(01〜49)とは別に、特別な役割を持つレベル番号が存在します。
レベル66(RENAMES):既存のデータ項目の範囲を別の名前で参照するために使われます。
レベル77(独立項目):グループ項目に属さない、独立したデータ項目です。
レベル88(条件名):特定のデータの値に名前を付け、真偽値(True/False)として扱うための定義です。
これらの項目は、プログラムの可読性を高めるために不可欠ですが、MOVE CORRの「名前の一致を探して自動転記する」という仕組みの対象外となっています。
3. 実装と解決策
MOVE CORRを実行する際、コンパイラは01から49までの階層構造を持つデータ項目のみを検索対象とします。つまり、66、77、88の各項目は、どれほど名前が一致していても無視されます。
現場でよくある失敗は、「データ項目を整理しようとして、誤って独立項目(77)を多用し、結果としてMOVE CORRが期待通りに動かない」というケースです。自動転記を利用したいデータ項目は、必ずグループ項目(01〜49)の中に配置するように設計しましょう。
4. サンプルプログラム
以下のコードは、MOVE CORRの対象となる項目と、無視される項目を明確にした例です。
<コード例>
IDENTIFICATION DIVISION.
PROGRAM-ID. MOVE-CORR-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- — 転記元グループ —
01 INPUT-DATA.
05 EMP-ID PIC X(05).
05 EMP-NAME PIC X(20).
88 IS-VALID VALUE ‘Y’. > レベル88:MOVE CORR対象外
- — 転記先グループ —
01 OUTPUT-DATA.
05 EMP-ID PIC X(05).
05 EMP-NAME PIC X(20).
01 WORK-VAR-77 PIC X(10). > レベル77:MOVE CORR対象外
PROCEDURE DIVISION.
MOVE ‘12345’ TO EMP-ID.
MOVE ‘TANAKA’ TO EMP-NAME.
> ここでMOVE CORRを実行
> EMP-IDとEMP-NAMEは転記されるが、88や77は無視される
MOVE CORRESPONDING INPUT-DATA TO OUTPUT-DATA.
DISPLAY “転記後の名前: ” EMP-NAME.
STOP RUN.
5. 応用・注意点:現場での回避策
現場で最も注意すべきは「意図しない無視」です。特に、古いプログラムを改修する際、後から追加した項目がレベル77であったために「MOVE CORRで値が反映されない」という不具合がよく発生します。
回避策のポイント:
1. 階層構造を意識する:自動転記させたい項目は、必ずグループ項目の中に収めること。
2. デバッグの視点:MOVE CORRを使っていて値が移動しない場合は、まずその項目が「77」や「66」で定義されていないか、あるいはグループの外に飛び出していないかを確認してください。
3. 保守性の向上:MOVE CORRは便利ですが、項目が増えすぎると予期せぬ転記が発生するリスクもあります。重要なデータは個別にMOVE文を書くなど、使い分けの判断がベテランの腕の見せ所です。
この仕様を理解しておけば、COBOLのデータ操作で迷うことはぐっと減るはずです。ぜひ、日々のコーディングに役立ててください。

コメント