PR

【ABAP】MOVE命令(CORRESPONDING)を3分でわかりやすく解説

ABAP

MOVE命令は、1つの変数(データオブジェクト)から別の変数(データオブジェクト)へ値をコピー(移動)するための命令です。

MOVE <source> TO <destination>.

* <source>は値を取得する変数
* <destination>は値を設定する変数

このページではMOVE命令の基本を解説しつつ、より実践的なコーディング(MOVE-CORRESPONDING)方法をABAP初心者向けに解説します。

このページで学べる内容
  • MOVE命令の処理内容
  • MOVE命令利用時の注意点
  • MOVE-CORRESPONDING命令とは?

ABAPerを目指す方であれば知らないと恥ずかしい基本知識の1つです。是非最後までご覧ください。

スポンサーリンク

ABAP:MOVE命令

MOVE命令は、変数や構造などのデータオブジェクトの内容を別のデータオブジェクトに代入する処理を実行します。

参考 変数/構造-データオブジェクトの基本

基本的な構文は以下の通り。

MOVE <source> TO <destination>.

* <source>は値を取得する変数
* <destination>は値を設定する変数

MOVE(動く、移動する)という意味につられて、データオブジェクトを移動する(=移動元の変数からはデータが削除される)と誤解する方がいますが、データオブジェクトをコピーするというのがMOVE命令の正しいイメージです。

簡単なサンプルコードを以下に記載します。

DATA: v1 TYPE i VALUE 5,
      v2 TYPE i.

MOVE v1 TO v2.

参考 DATA命令 / VALUEオプション

このコードは、変数v1から変数v2へ値を移動します。実行後、v2の値も5となります。

ただし、ABAPの新しいバージョンでは、このMOVE命令はあまり使用されません。代わりに、直接代入演算子(=)がより一般的に使用されます。

DATA: v1 TYPE i VALUE 5,
      v2 TYPE i.

v2 = v1.

MOVE命令を利用しなくても、”=” を用いてデータオブジェクトの代入が可能なので、基本的に単純な変数代入の場面ではMOVE命令が活躍することはありません。

注意すべきは、MOVE命令の場合とAとBが逆になることです。ABAPではデータオブジェクトを ”=” で結んだ場合には、必ず右から左へ値がコピーされる点を押さえておきましょう。

複数の変数に値を同時に代入する→MOVE命令ではできない

MOVE命令は基本的に1つのソース変数から1つのデスティネーション変数への値のコピーを行います。そのため、1つのMOVE命令で複数のデスティネーション変数に同時に値を代入することは基本的にはできません。

同じ値を複数の変数に代入する必要がある場合、次のように複数のMOVE命令を使用すれば一応は可能です。

DATA: v1 TYPE i VALUE 5,
      v2 TYPE i,
      v3 TYPE i.

MOVE v1 TO v2.
MOVE v1 TO v3.

* この例では、v1の値(5)がv2とv3の両方にコピーされます。

が、しかしわざわざMOVE命令を利用せずとも、直接代入演算子(=)を使用すれば、次のように一行で複数の変数に同じ値を代入することもできるため、その意味でもMOVE命令はあまり威力を発揮しません。

DATA: v1 TYPE i VALUE 5,
      v2 TYPE i,
      v3 TYPE i.

v2 = v3 = v1.

* この例でも、v1の値(5)がv2とv3の両方にコピーされます。
* こちらの方がコードが短くなるため、より読みやすいコードになるでしょう。

MOVE命令の注意点

MOVE命令を使用する際には、以下のような点に注意する必要があります。

MOVE命令の注意点
  • 型の互換性: MOVE命令はソース変数の値をデスティネーション変数にコピーしますが、これら二つの変数の型が互換性を持つ必要があります。互換性がない場合、例えば数値を文字列型の変数に移動しようとした場合などには、ランタイムエラーが発生する可能性があります。
  • 命令の置換: ABAPの新しいバージョンでは、MOVE命令はあまり使用されません。代わりに直接代入演算子(=)が推奨されています。この直接代入演算子を使用することでコードがよりシンプルで読みやすくなります。
  • ディープコピー: MOVE命令は浅いコピー(Shallow Copy)を行います。つまり、参照型の変数をコピーする場合、参照先のオブジェクト自体はコピーされず、その参照だけがコピーされます。これは参照型の変数を扱う際には注意が必要です。
  • フィールドシンボルとデータ参照: ABAPでは、フィールドシンボルやデータ参照といった特殊なデータ型を使用することがあります。これらの型を扱う際にはMOVE命令の振る舞いが少し異なるため、これらの型を使用する場合には注意が必要です。

MOVE命令の注意点1:型の互換性

DATA: v1 TYPE i VALUE 5,
      v2 TYPE string.

MOVE v1 TO v2. " この行でエラーが発生する可能性があります。

上記の例では、整数型の変数v1の値を文字列型の変数v2に移動しようとしています。このため、ランタイムエラーが発生する可能性があります。

MOVE命令を利用する際は互換性のあるデータ型を使用することが重要です。

参考 データ型とは?

MOVE命令の注意点2:型の互換性

DATA: v1 TYPE i VALUE 5,
      v2 TYPE i.

v2 = v1. " MOVE命令の代わりに直接代入演算子を使用

これまでにも説明した通りです。

この例では、MOVE命令の代わりに直接代入演算子(=)を使用しています。これによりコードがよりシンプルで読みやすくなります。

MOVE命令の注意点3:ディープコピー

MOVE命令は浅いコピー(Shallow Copy)を行います。

つまり、参照型の変数をコピーする場合、参照先のオブジェクト自体はコピーされず、その参照だけがコピーされます。

TYPES: BEGIN OF t_mytype,
         field1 TYPE i,
       END OF t_mytype.
DATA: original TYPE REF TO t_mytype,
      copy     TYPE REF TO t_mytype.

CREATE OBJECT original.
original->field1 = 5.

MOVE original TO copy. 
* copyはoriginalの参照を持つだけで、新たなオブジェクトは作られない

この例では、originalという参照型の変数をcopyにコピーしています。しかし、これはcopyoriginalと同じオブジェクトを指すようになるだけで、新たなオブジェクトは作られません。これは浅いコピー(Shallow Copy)と呼ばれます。

MOVE命令の注意点4:フィールドシンボルとデータ参照

DATA: v1 TYPE i VALUE 5.
FIELD-SYMBOLS: <fs> TYPE i.

MOVE v1 TO <fs>. 
* この行ではエラーが発生します。フィールドシンボルは先にBINDしておく必要があります。

この例では、フィールドシンボル<fs>に変数v1の値をコピーしようとしていますが、エラーが発生します。これは、フィールドシンボルは先にBIND命令を使用して変数にバインドしておく必要があるからです。

参考 フィールドシンボルとは?

MOVE-CORRESPONDING

ここからは、MOVE命令の派生形―。MOVE-CORRESPONDINGについて解説します。

こちらは、単純なMOVE命令と比較して、少しだけ利用頻度が上がりますので、頭に入れておくと良いでしょう。

MOVE-CORRESPONDINGは、二つの構造体間で同名のフィールドの値をコピーするための命令です。

MOVE-CORRESPONDING <source> TO <destination>.

以下のようなイメージです。

MOVE-CORRESPONDING命令では構造Aと構造Bの同名項目に値が代入される
図1:MOVE-CORRESPONDINGのイメージ

MOVE-CORRESPONDINGでは、自動的に同名の項目を参照し値を代入します。

サンプルとして以下のコードをご覧ください。

TYPES: BEGIN OF t_mytype1,
         field1 TYPE i,
         field2 TYPE string,
       END OF t_mytype1,
       BEGIN OF t_mytype2,
         field1 TYPE i,
         field3 TYPE string,
       END OF t_mytype2.

DATA: v1 TYPE t_mytype1,
      v2 TYPE t_mytype2.

v1-field1 = 5.
v1-field2 = 'Hello'.

MOVE-CORRESPONDING v1 TO v2.

参考 TYPES命令

このコードは、構造体v1から構造体v2同名のフィールドの値を移動します。

実行後、v2-field1の値は5となります。ただし、v1field2v2に存在しないので、このフィールドの値はコピーされません。また、v2field3v1に存在しないので、このフィールドの値は変更されません。

MOVE-CORRESPONDING命令は、大量のフィールドを持つ構造体間で値をコピーする場合に特に有用です。しかし、同名のフィールドが異なる型であった場合などには注意が必要です。

内部テーブル/構造/変数―ABAPの3つの基本

MOVE-CORRESPONDINGの注意点

MOVE-CORRESPONDINGを利用する際にもいくつか注意が必要です。

MOVE-CORRESPONDINGの注意点
  • 同名のフィールドの型の互換性: MOVE-CORRESPONDING命令は同名のフィールド間で値をコピーしますが、これらのフィールドの型が互換性を持つ必要があります。互換性がない場合、例えば数値フィールドを文字列フィールドに移動しようとした場合などには、ランタイムエラーが発生する可能性があります。
  • フィールドの存在: MOVE-CORRESPONDING命令は同名のフィールドのみをコピーします。そのため、一方の構造体に存在するフィールドが他方には存在しない場合、そのフィールドの値はコピーされません。
  • 深い構造体とテーブル: MOVE-CORRESPONDING命令は浅い構造体(つまり、他の構造体やテーブルを含まない構造体)でのみ正しく動作します。深い構造体(他の構造体やテーブルを含む構造体)を扱う場合や、テーブル間でMOVE-CORRESPONDING命令を使用する場合には注意が必要です。

これらの点を意識しながら、MOVE-CORRESPONDING命令を使用してプログラミングを行うことが重要です。

SAP/ABAPを1から勉強したい方は

初めてABAPを勉強するのは結構難しいですよね。

でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。

ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?

あなたの技術、もっと価値ある場所で活かしませんか?
SAPエンジニアのキャリア支援はこちらから↓

No.1 > 外資系・IT業界などハイクラスの転職なら【アクシスコンサルティング】blank
4人に1人のコンサルタントが選ぶパートナー!
ビッグ4やアクセンチュアへの転職を実現し年収1000万へ。

No.2 > IT・Web転職特化エージェント【レバテックキャリアblank
blank
サービス利用者数20万人突破。

平均年収アップ率77%であなたの転職成功を保証します。

No.3 > blankリクルートエージェント
blank
\転職支援実績NO.1/

応募が殺到しすぎるが故に・・・非公開にせざるを得ない魅力的な求人が多数!

読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
ABAPSAP
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました