MOVE命令は、1つの変数(データオブジェクト)から別の変数(データオブジェクト)へ値をコピー(移動)するための命令です。
MOVE <source> TO <destination>. * <source>は値を取得する変数 * <destination>は値を設定する変数
このページではMOVE命令の基本を解説しつつ、より実践的なコーディング(MOVE-CORRESPONDING)方法をABAP初心者向けに解説します。
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命令の注意点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
にコピーしています。しかし、これはcopy
がoriginal
と同じオブジェクトを指すようになるだけで、新たなオブジェクトは作られません。これは浅いコピー(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では、自動的に同名の項目を参照し値を代入します。
サンプルとして以下のコードをご覧ください。
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
となります。ただし、v1
のfield2
はv2
に存在しないので、このフィールドの値はコピーされません。また、v2
のfield3
はv1
に存在しないので、このフィールドの値は変更されません。
MOVE-CORRESPONDING命令は、大量のフィールドを持つ構造体間で値をコピーする場合に特に有用です。しかし、同名のフィールドが異なる型であった場合などには注意が必要です。
MOVE-CORRESPONDINGの注意点
MOVE-CORRESPONDINGを利用する際にもいくつか注意が必要です。
これらの点を意識しながら、MOVE-CORRESPONDING命令を使用してプログラミングを行うことが重要です。
SAP/ABAPを1から勉強したい方は
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!