カテゴリ: COBOL 更新日: 2026/03/12

COBOLのCORRESPONDING句を徹底解説!初心者でもわかる同名項目のまとめ処理

CORRESPONDING句で同名項目をまとめて処理する方法
CORRESPONDING句で同名項目をまとめて処理する方法

先生と生徒の会話形式で理解しよう

生徒

「先生、COBOLで同じ名前のデータ項目をまとめて処理したいんですが、1つずつ書くのが面倒です。」

先生

「いいところに気づきましたね。そんなときに便利なのが、CORRESPONDING句(コレスポンディング句)です。」

生徒

「コレスポンディング句?それは何をしてくれるんですか?」

先生

「同じ名前を持つ項目を自動的に対応させて、一括で加算や代入ができる便利な機能なんですよ。それでは、実際の使い方を見てみましょう!」

1. CORRESPONDING句とは?

1. CORRESPONDING句とは?
1. CORRESPONDING句とは?

CORRESPONDING句(略してCORRとも書けます)は、COBOLの中で「異なるグループ間にある、同じ名前のデータ項目を自動的に紐づけて処理する」ための非常に強力な命令です。

例えば、会社で「社員の名簿」と「給与の振込先リスト」の2つのデータがあるとします。どちらにも「社員名」という項目がある場合、1つずつ手作業でコピーするのは大変ですよね。CORRESPONDING句を使えば、COBOLが「あ、こっちとあっちに同じ『社員名』という箱があるな!」と自動で見つけ出し、一瞬で中身を移し替えてくれるのです。

プログラミング未経験者向けのイメージ例

もっと身近な例で考えてみましょう。「野菜セットA」と「野菜セットB」という2つの段ボール箱があるとします。


01 野菜セットA.
   05 キャベツ  PIC 9(3) VALUE 1.
   05 レタス    PIC 9(3) VALUE 2.
   05 トマト    PIC 9(3) VALUE 3.

01 野菜セットB.
   05 キャベツ  PIC 9(3) VALUE 0.
   05 トマト    PIC 9(3) VALUE 0.
   05 ニンジン  PIC 9(3) VALUE 0.

ここでMOVE CORRESPONDING 野菜セットA TO 野菜セットBを実行すると、COBOLは自動的に「キャベツ」と「トマト」だけを探し出してコピーします。「レタス」はセットBにないので無視され、「ニンジン」はセットAにないのでそのままです。

このように、「名前が一致するものだけをスマートに処理する」のがCORRESPONDING句の役割です。これにより、プログラムの行数を大幅に削減し、記述ミスを防ぐことができるため、膨大なデータを扱う業務システムでは欠かせない機能となっています。

2. CORRESPONDING句の基本構文

2. CORRESPONDING句の基本構文
2. CORRESPONDING句の基本構文

CORRESPONDING句は、主にMOVE文とADD文で使われます。構文はとてもシンプルです。


MOVE CORRESPONDING グループA TO グループB
ADD CORRESPONDING グループX TO グループY

意味:

  • MOVEの場合:グループAとグループBの中で「同じ名前の項目」を見つけ、Aの値をBにコピーします。
  • ADDの場合:グループXとグループYの中で「同じ名前の項目」を見つけ、Xの値をYに加えます。

3. MOVE CORRESPONDINGの実例

3. MOVE CORRESPONDINGの実例
3. MOVE CORRESPONDINGの実例

まずは、MOVE CORRESPONDINGを使って、同名項目をまとめてコピーする例を見てみましょう。


IDENTIFICATION DIVISION.
PROGRAM-ID. MOVE-CORR-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 GROUP-A.
   05 NAME       PIC A(10) VALUE "TANAKA".
   05 AGE        PIC 9(2)  VALUE 25.
   05 ADDRESS    PIC A(20) VALUE "TOKYO".

01 GROUP-B.
   05 NAME       PIC A(10) VALUE SPACES.
   05 AGE        PIC 9(2)  VALUE 0.
   05 ADDRESS    PIC A(20) VALUE SPACES.
   05 PHONE      PIC 9(10) VALUE 0.

PROCEDURE DIVISION.
    MOVE CORRESPONDING GROUP-A TO GROUP-B.
    DISPLAY "名前:" NAME OF GROUP-B.
    DISPLAY "年齢:" AGE OF GROUP-B.
    DISPLAY "住所:" ADDRESS OF GROUP-B.
    DISPLAY "電話:" PHONE OF GROUP-B.
    STOP RUN.

このプログラムの実行結果は次のようになります。


    名前:TANAKA
    年齢:25
    住所:TOKYO
    電話:0000000000

GROUP-AGROUP-Bの中で「同じ名前(NAME・AGE・ADDRESS)」の項目だけが自動的にコピーされています。 電話番号(PHONE)はGROUP-Aには存在しないため、移動されません。

4. ADD CORRESPONDINGの実例

4. ADD CORRESPONDINGの実例
4. ADD CORRESPONDINGの実例

ADD CORRESPONDINGを使うと、同じ名前の数値項目をまとめて加算できます。銀行の残高や集計処理などでよく使われます。


IDENTIFICATION DIVISION.
PROGRAM-ID. ADD-CORR-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SALES-MONTH1.
   05 ITEM-A PIC 9(5) VALUE 100.
   05 ITEM-B PIC 9(5) VALUE 200.
   05 ITEM-C PIC 9(5) VALUE 300.

01 SALES-MONTH2.
   05 ITEM-A PIC 9(5) VALUE 400.
   05 ITEM-B PIC 9(5) VALUE 500.
   05 ITEM-C PIC 9(5) VALUE 600.

PROCEDURE DIVISION.
    ADD CORRESPONDING SALES-MONTH1 TO SALES-MONTH2.
    DISPLAY "1月と2月の合計売上:".
    DISPLAY "商品A:" ITEM-A OF SALES-MONTH2.
    DISPLAY "商品B:" ITEM-B OF SALES-MONTH2.
    DISPLAY "商品C:" ITEM-C OF SALES-MONTH2.
    STOP RUN.

実行結果は次のようになります。


    1月と2月の合計売上:
    商品A:500
    商品B:700
    商品C:900

このように、同名項目が自動で対応づけられて加算されます。 個別に「ADD ITEM-A OF SALES-MONTH1 TO ITEM-A OF SALES-MONTH2」と書く必要がなくなります。

5. CORRESPONDING句のルールと注意点

5. CORRESPONDING句のルールと注意点
5. CORRESPONDING句のルールと注意点

とても便利なCORRESPONDING句ですが、使うときはいくつかのルールと注意点があります。

  • 同じ階層(レベル番号)の項目でなければ一致しません。
  • 名前が完全に一致している項目だけが対象になります(スペル違いもNG)。
  • 項目の型(数値か文字か)が異なると正しく動作しません。
  • REDEFINESOCCURSを含む項目には注意が必要です。

特に、現場のCOBOLシステムでは、変数名に少しの違い(例:TOTAL-AMTとTOTAL-AMOUNT)があるだけで対応できないことがあるため、設計段階から命名規則を統一しておくことが重要です。

6. CORRの省略形について

6. CORRの省略形について
6. CORRの省略形について

COBOLでは、CORRESPONDINGを短くしてCORRと書くことができます。意味はまったく同じです。


MOVE CORR GROUP-A TO GROUP-B
ADD CORR SALES-MONTH1 TO SALES-MONTH2

プログラムの可読性(読みやすさ)を重視する場合は、CORRESPONDINGと書くほうがわかりやすいですが、短くしたいときはCORRを使っても問題ありません。

7. まとめて処理できる便利さ

7. まとめて処理できる便利さ
7. まとめて処理できる便利さ

CORRESPONDING句の最大のメリットは、「同名項目を一括で処理できる」ということです。これにより、プログラムがスッキリして読みやすくなり、入力ミスも減らせます。

特に、給与計算・売上集計・データ移行などのように、同じ構造のデータを扱う業務システムでは非常に役立ちます。 COBOLの強力な特徴である「構造化されたデータ操作」を活かす代表的な機能のひとつと言えるでしょう。

まとめ

まとめ
まとめ

ここまで、COBOLプログラミングにおける非常に強力な効率化機能であるCORRESPONDING句(コレスポンディング句)について詳しく解説してきました。この機能は、特に大量のデータ項目を扱う業務システムにおいて、コーディングの記述量を劇的に削減し、ソースコードの可読性を向上させるための重要なテクニックです。

CORRESPONDING句を使いこなすための重要ポイント

今回の内容を振り返る上で、以下の3つのポイントは必ず押さえておきましょう。

  • 名称の一致が絶対条件: 転記元と転記先のグループ項目内で、データ名が1文字でも異なれば対象外となります。
  • 記述の簡略化: MOVE CORRADD CORRを使うことで、10項目、20項目とあるデータ移動をわずか1行で完結させることができます。
  • メンテナンス性の向上: 項目が増えた際、両方のグループに同名で追加するだけで、ロジック部分(MOVE文など)を修正せずに処理を拡張できる場合があります。

応用編:計算処理での活用例

記事内では加算(ADD)について触れましたが、減算(SUBTRACT)でも同様に使用可能です。例えば、在庫管理システムにおいて「現在の在庫」から「出荷数」を引く際、項目名が一致していれば一括で在庫更新処理を行うことができます。


IDENTIFICATION DIVISION.
PROGRAM-ID. SUB-CORR-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CURRENT-STOCK.
   05 ITEM-001 PIC 9(4) VALUE 1000.
   05 ITEM-002 PIC 9(4) VALUE 2000.
   05 ITEM-003 PIC 9(4) VALUE 1500.

01 SHIPMENT-QTY.
   05 ITEM-001 PIC 9(4) VALUE 100.
   05 ITEM-002 PIC 9(4) VALUE 500.
   05 ITEM-003 PIC 9(4) VALUE 200.

PROCEDURE DIVISION.
    SUBTRACT CORRESPONDING SHIPMENT-QTY FROM CURRENT-STOCK.
    
    DISPLAY "在庫更新後の結果:".
    DISPLAY "商品001: " ITEM-001 OF CURRENT-STOCK.
    DISPLAY "商品002: " ITEM-002 OF CURRENT-STOCK.
    DISPLAY "商品003: " ITEM-003 OF CURRENT-STOCK.
    STOP RUN.

実行結果は以下の通りです。


在庫更新後の結果:
商品001: 0900
商品002: 1500
商品003: 1300

このように、CORRESPONDING句は単なるコピーだけでなく、業務ロジックの核となる計算部分でも威力を発揮します。ただし、便利な反面、意図しない項目まで計算されてしまうリスクを避けるため、データ設計の段階で「どの項目を同名にするか」を明確に決めておくことが、プロのCOBOLエンジニアとしての腕の見せ所と言えるでしょう。

C#での類似アプローチとの比較

現代的な言語であるC#を使っているエンジニアの方からすると、「これはAutoMapperのようなオブジェクトマッピングに似ている」と感じるかもしれません。C#で手動でプロパティを詰め替える場合と、COBOLのCORRESPONDING句のイメージを比較してみましょう。


// C#で手動で詰め替える場合(COBOLでいうMOVE文を並べる状態)
var target = new UserDto();
target.Name = source.Name;
target.Age = source.Age;
target.Address = source.Address;

// COBOLのCORRESPONDING句は、これらを暗黙的に「名前が合うから」という理由で
// まとめて処理してくれるイメージです。

C#ではリフレクションや外部ライブラリを用いて実現するような挙動を、COBOLは言語仕様として標準で備えているのです。これは、COBOLがいかに「事務処理・帳票処理」に特化して進化してきたかを示す面白い特徴ですね。

先生と生徒の振り返り会話

生徒

「先生、ありがとうございました!CORRESPONDING句を使うと、あんなに長かったMOVE文の羅列がたった一行になって感動しました。プログラムがすごくスッキリしますね。」

先生

「そうでしょう。特に何百項目もある電算処理の現場では、この一行がデバッグのしやすさや開発スピードに大きく貢献するんですよ。でも、何か気になったことはありませんでしたか?」

生徒

「はい。もし、グループの中に同じ名前があるけれど、そこだけはコピーしたくない!という場合はどうすればいいんですか?」

先生

「いい質問ですね。その場合は、残念ながらCORRESPONDINGは使わずに個別に書くか、あるいは項目名を変える必要があります。この句は『名前が一致するものはすべて処理する』という潔い命令ですから。便利さと正確性のトレードオフですね。」

生徒

「なるほど。だからこそ、設計書を書く段階で、どの変数を同じ名前にするかが重要になるんですね。ただコードを書くだけじゃなくて、全体の構造を考える大切さがわかりました。」

先生

「その通りです。また、大規模なプロジェクトだと、後から誰かが項目を追加したときに、意図せず名前が被ってしまってCORRESPONDINGで予期せぬ上書きが起きてしまう……なんてトラブルも稀にあります。ですから、便利さに甘えすぎず、影響範囲をしっかり把握して使うのがコツですよ。」

生徒

「分かりました!基本を大切にしつつ、スマートなコードが書けるように練習してみます。次は、OCCURS句を使った配列のようなデータ構造でも使えるのか、もっと深く調べてみたいです。」

先生

「その意気です。COBOLは古い言語だと思われがちですが、事務処理の合理性に関しては本当によく練られています。ぜひ、他の句との組み合わせもマスターして、一流のプログラマーを目指してくださいね!」

カテゴリの一覧へ
新着記事
New1
C#
C#で条件分岐をネストする方法!入れ子構造の書き方を基礎から学ぼう
New2
COBOL
COBOLの文字列検索を完全ガイド!初心者でもわかるINSPECTとUNSTRINGの使い方
New3
C#
C#でXMLバリデーションを完全マスター!XSDスキーマを使ったチェック方法を初心者向けに解説
New4
COBOL
COBOLのEDITING記述子を完全解説!初心者でもわかるPIC Z・\*・\$による整形出力
人気記事
No.1
Java&Spring記事人気No1
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.2
Java&Spring記事人気No2
C#
C#の引数と戻り値の基本!値を受け渡し・返す仕組みを理解しよう
No.3
Java&Spring記事人気No3
C#
C#のstaticクラスとstaticメソッドの基本と使い方をやさしく解説!
No.4
Java&Spring記事人気No4
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説
No.5
Java&Spring記事人気No5
C#
C#のLINQでFirstとFirstOrDefaultの違いと使い方を完全解説!初心者向けガイド
No.6
Java&Spring記事人気No6
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.7
Java&Spring記事人気No7
C#
C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
No.8
Java&Spring記事人気No8
C#
C#の文字列を数値に変換する方法(int.Parse・TryParse)をわかりやすく解説!