COBOLのデータ型変換&MOVE CORRESPONDING完全解説!初心者でもできる編集と移送
生徒
「COBOLで、あるデータを別の型に変えたり、同じ名前の項目だけまとめてコピーする方法ってありますか?」
先生
「ありますよ。MOVE文を使ってデータを変換したり、MOVE CORRESPONDINGという命令で同じ構造のデータをまとめて移すことができます。」
生徒
「初心者でもわかるように、やさしく説明してもらえますか?」
先生
「もちろんです!これから基本から一緒に学んでいきましょう。」
1. データ型の変換(型変換)って何?
COBOLでは、文字型(PIC X)や数値型(PIC 9)など、用途ごとに決まったデータ型を使います。型変換とは、ある型で持っている値を、別の型として扱えるように移し替えることです。
たとえば、画面入力やファイルから読み込んだ「123」のような値は文字型で扱われることが多く、そのままでは計算に使えません。このようなときに、数値型へ変換することで、加算や比較ができるようになります。
初心者向け:いちばん簡単な型変換の例
01 STR-VALUE PIC X(3) VALUE "123".
01 NUM-VALUE PIC 9(3).
PROCEDURE DIVISION.
MOVE STR-VALUE TO NUM-VALUE
やさしく解説:
・STR-VALUEは文字型、NUM-VALUEは数値型です。
・MOVE文を使うだけで、COBOLが自動的に文字→数値の変換を行います。
・特別な命令を書かなくても型変換できるのが、COBOLの特徴です。
このように、COBOLではMOVE文が「値のコピー」だけでなく、型変換の役割も担っています。まずは「MOVE=型も一緒に変わることがある」と覚えておくと理解しやすくなります。
2. 型変換のMOVE文の使い方
型変換の基本はとてもシンプルで、MOVE文で「文字型→数値型」へ移すだけです。入力データは文字として入ってくることが多いので、計算や大小比較をしたいときは、まず数値型へ移し替えるのが定番です。
たとえば、文字列で保存された「1234」を数値として扱いたい場合は、次のように書きます。
01 STR-NUM PIC X(4) VALUE "1234".
01 INT-NUM PIC 9(4).
PROCEDURE DIVISION.
MOVE STR-NUM TO INT-NUM
実はこれだけで、COBOLが自動で型を判断し、文字→数値という型変換を行ってくれます。変換後のINT-NUMは数値なので、足し算・引き算や、>=のような比較にも使えるようになります。
初心者向け:数字じゃない文字が混ざるとどうなる?
注意点として、元の文字列に「12A4」のような数字以外が混ざると、変換結果が想定とずれることがあります。だからこそ、実務では「入力が数字だけか」を意識するのが大切です。
初心者向け:変換できたか確認するミニ例
01 STR-NUM PIC X(4) VALUE "1234".
01 INT-NUM PIC 9(4).
PROCEDURE DIVISION.
MOVE STR-NUM TO INT-NUM
DISPLAY "STR=" STR-NUM
DISPLAY "NUM=" INT-NUM
やさしく解説:
・最初に文字列を数値へMOVEしてから、DISPLAYで中身を見ます。
・「文字としての1234」と「数値としての1234」を分けて持てるのがポイントです。
・まずはDISPLAYで確認するクセをつけると、型変換のミスに気づきやすくなります。
3. 文字列の編集(編集記号付きMOVE)
COBOLでは、編集用記号を使って、数値を見やすく表示することもできます。例えば「1234」を「1,234」とカンマ付きで出力することができます。
01 SOURCE-NUM PIC 9(4) VALUE 1234.
01 EDITED-NUM PIC Z,ZZ9.
PROCEDURE DIVISION.
MOVE SOURCE-NUM TO EDITED-NUM
DISPLAY EDITED-NUM
実行すると「1,234」と表示されます。Zはゼロ非表示、カンマは桁区切りという意味です。これが編集機能付きピクチャ句です。
4. MOVE CORRESPONDINGとは?構造化データを一括移送
COBOLでは、レコードやテーブルのように、構造化されたデータを扱うことがあります。同じフィールドをまとめて移す命令がMOVE CORRESPONDINGです。
例えば、以下のように部品ごとに名前と年齢を持つ構造があったとします。
01 SRC-RECORD.
05 NAME PIC X(10).
05 AGE PIC 99.
01 TGT-RECORD.
05 NAME PIC X(10).
05 AGE PIC 99.
このとき、
MOVE CORRESPONDING SRC-RECORD TO TGT-RECORD
と書くと、SRCの中の同じ名前の項目(ここではNAMEとAGE)が一括でTGTにコピーされます。
5. MOVE CORRESPONDINGの便利な使いどころ
この命令は、複数のフィールドを一つずつ書く必要がないので、コードが短くなってスッキリします。特にレコードの更新や複製処理で役立ちます。
ただし、フィールド名がずれていたり存在しない場合は、その項目だけ無視されます。構造が全く同じか確認してから使うのがポイントです。
6. 型や編集に注意!使うときのポイント
- 文字列→数値をする場合は、元がちゃんと数字か確認する。
- 編集記号付きピクチャ句は、表示用で使う。計算には向かない。
- MOVE CORRESPONDINGを使うときは、構造が揃っているかよくチェック。
7. サンプル:型変換&一括移送
以下は、文字列から数値へ移す&構造化レコードを一括移す例です。
01 STR PIC X(4) VALUE "2025".
01 NUM PIC 9(4).
01 SRC.
05 NAME PIC X(10) VALUE "YAMADA".
05 AGE PIC 99 VALUE 30.
01 TGT.
05 NAME PIC X(10).
05 AGE PIC 99.
PROCEDURE DIVISION.
MOVE STR TO NUM
MOVE CORRESPONDING SRC TO TGT
DISPLAY NUM
DISPLAY TGT
STOP RUN.
まとめ
COBOLにおけるデータ型変換やMOVE CORRESPONDING命令の使い方は、実務の中でも特に頻出でありながら、初学者にとってはつまずきやすいポイントでもあります。この記事では、文字列から数値への変換や、編集記号付きピクチャ句を活用した表示の工夫、さらに構造化データの一括移送に関する基本と実践例を紹介しました。
型変換では、MOVE文を使うだけで自動的にCOBOLが判断してくれますが、データの中身が正しく数値として認識できることが前提となります。また、編集記号付きピクチャ句(Z,ZZ9など)を使うことで、ユーザに見やすい形でデータを表示する工夫も可能でした。ただし、このような表示専用の項目を計算処理にそのまま用いるとエラーや予期せぬ結果を招くため注意が必要です。
さらに、MOVE CORRESPONDING命令は、同じ構造を持つデータ間での移送処理を効率化できる便利な命令です。たとえば帳票の出力やマスタデータの更新など、大量のフィールドを扱う場面で役立ちます。ただし、フィールド名が完全一致していないと移送されないため、レコード構造の設計段階から名前の統一が重要です。
下記に、復習用のサンプルを示しておきます。
サンプル:編集記号付きの型変換とMOVE CORRESPONDING併用例
01 STR-NUM PIC X(5) VALUE "04567".
01 INT-NUM PIC 9(5).
01 EDITED-NUM PIC Z,ZZZ9.
01 SRC-DATA.
05 FULL-NAME PIC X(20) VALUE "TANAKA TARO".
05 AGE PIC 99 VALUE 28.
01 TGT-DATA.
05 FULL-NAME PIC X(20).
05 AGE PIC 99.
PROCEDURE DIVISION.
MOVE STR-NUM TO INT-NUM
MOVE INT-NUM TO EDITED-NUM
MOVE CORRESPONDING SRC-DATA TO TGT-DATA
DISPLAY "数値:" INT-NUM
DISPLAY "編集後:" EDITED-NUM
DISPLAY "名前:" TGT-DATA
STOP RUN.
上記の例では、編集記号付きで数値を表示するだけでなく、構造化データのコピーを行うことで、COBOLらしい強力かつ簡潔な記述を実現しています。実務では、日付や金額、住所などのレコードを扱う際にこのような処理が不可欠となるでしょう。
生徒
「MOVEって単にコピーするだけかと思ってましたが、型も変換してくれるんですね!」
先生
「そうなんです。COBOLのMOVE文はとても柔軟で、内部的に型変換もこなしてくれます。ただし、正しいデータが入っていないと正しく変換されないので、注意が必要ですね。」
生徒
「編集記号ってちょっと難しかったけど、使うと見た目がすごく整って便利ですね!」
先生
「その通り。Zやカンマを使えば、ゼロを隠したり桁区切りを入れたりできます。帳票印刷やユーザーへの表示にピッタリです。」
生徒
「MOVE CORRESPONDINGは特に便利だなと思いました。構造が揃っていればまとめてコピーできるなんて、すごく時短になりそう。」
先生
「実際のシステム開発では、同じ名前のフィールドを意識してレコード設計するのが基本です。こういったCOBOLの特性を活かすための設計力も身につけていきましょうね。」
生徒
「はい!次はREDEFINESとかも使ってみたいです!」
先生
「いいですね。それもまた強力な機能ですよ。順番にステップアップしていきましょう。」