【ABAP】3分で学ぶMOVE命令―値の代入

ABAP

このページでは、MOVE命令による値の代入方法について解説します。値の代入とは、変数に別の変数の値を入れたり、直接文字や数字などの値を入れたりして変数の値を変えることを言います。

ページ後半では、MOVE命令の応用編「MOVE-CORRESPONDING命令」についても解説しています。よくある質問などを1ページにまとめて解説していますので、最後までお読みください。

このページでは、変数とは何かが分かっていることを前提としています。DATA命令について解説したページに詳しく記載がありますので、不安な方はそちらを先にお読みいただくことをお勧めします。

このページで学べる内容

  • MOVE命令の処理内容
  • MOVE命令利用時の注意点
  • MOVE-CORRESPONDING命令とは?

ABAPerであれば、絶対に知っておきたい内容ばかりですので、是非最後までご覧ください。

MOVE命令

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

構文ルール:MOVE命令

MOVE A TO B.


構文ルールはこれだけです。データオブジェクトAの値をデータオブジェクトBへ格納します。Aの値を、そのままBに入れる、というイメージでOKです。

MOVE(動く、移動する)という意味につられて、データオブジェクトを移動すると誤解してしまう人がいますが、データオブジェクトをコピーするというのがMOVE命令の正しい理解です。

MOVEを利用しない場合:=

B = A.


MOVE命令を利用しなくても、”=” を用いてデータオブジェクトの代入が可能です。

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

複数の代入(MOVE命令では不可)

"=" を利用すれば、データオブジェクトAの値を「B」「C」「D」・・・の複数のデータオブジェクトに格納することもできます。以下のように複数のデータオブジェクトを”=”で結んでみます。

B = C = D = A.

この処理は、以下の処理と全く同じように動きます。すなわち、変数Aに「MOVE」という値が入っていれば、変数B・変数C・変数Dにも「MOVE」という値が格納されることになります。

D = A.
C = D.
B = C.

ただし、値の複数代入の利用頻度はそれほど高くないため、実際に利用するシーンはないかもしれません。同じ値を格納するデータオブジェクトであれば、そもそもデータオブジェクトを分ける必要性が無いためです。実際のコードで見かけることは恐らくない形かと思います。

MOVE命令では、上記のように一気に複数の変数に値をコピーすることができませんので注意が必要です。

データ型が異なる場合

応用知識として、データオブジェクトAとBのデータ型が異なる場合の処理について補足します。

変数Aが日付型で、変数Bが数値型の場合―。こんな場合に、MOVE命令はどのような処理となるか?を解説します。

※データ型について詳しく知っておきたい!という方は、以下の記事からご覧ください。

データ型が異なるが互換性がある場合(INTとNUMCなど)

互換性がある異なるデータ同士であれば、値の内容は代入される側のデータ型に自動的に変換されます。

A ⇒ ”2” INT2

B ⇒ ”2” NUMC

の場合に「B = A.」とすれば、値はそのまま”2”となりますが、データ型はBの「NUMC」に変換されます。

データ型の互換性がない場合

データ型の互換性がない場合には、データオブジェクトの代入は不可となります。

コンパイル時に構文エラーではじかれるか、プログラム実行時にエラーとなります。

MOVE-CORRESPONDING命令

ここからは、MOVE命令の派生形―。MOVE-CORRESPONDING命令について解説します。後から解説しますが、MOVE-CORRESPONDING命令はパフォーマンスの観点からあまり推奨されない命令ですが、知っておくべき大切な知識の1つです。

MOVE-CORRESPONDING命令を一言で説明すると、構造内の同じ名前の項目へ値を代入する命令です。

以下のイメージ図をご覧ください。

MOVE-CORRESPONDING命令では構造Aと構造Bの同名項目に値が代入される

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

同名の項目がない場合は、項目は無視され処理は行われません。特に構文エラーやプログラム実行エラーにならないため、本当に値が代入されているかどうかは、デバッグをしながら注意深く確認する必要があります。

構文ルール:MOVE-CORRESPONDING命令

MOVE-CORRESPONDING (構造A) TO (構造B).


MOVE-CORRESPONDING命令では必ず構造を指定します。変数やテーブルを指定することはできません。以下の画像のように、項目名に応じて値が自動的に代入されます。

MOVE-CORRESPONDING命令では構造Aと構造Bの同名項目に値が代入される

※変数・構造・内部テーブルの違いをイマイチ理解できていないという方はこちらの記事をどうぞ!

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

MOVE-CORRESPONDING命令の注意点

冒頭でも説明した通り、MOVE-CORRESPONDING命令はSAP非推奨の命令です。

その大きな理由が「パフォーマンスの問題」です。結論から言うと、MOVE-CORRESPONDING命令はパフォーマンス的に良い効果をもたらしません。

MOVE-CORRESPONDING命令は、①指定された構造の同じ名称を持つ項目を探し、②対応する項目に値を代入するという2ステップの処理が内部的に行われています。

MOVE-CORRESPONDING命令の内部処理

  1. 同じ名称を持つ項目を探索する
  2. 対応する項目が見つかれば値を代入する
    対応する項目がなければ、何もしない。

上記のように、単なるMOVE命令と比較して処理の内容が複雑です。

基本的には、当該命令はLOOP処理の中で利用される想定(指定するのが構造であるため)ですので、対象となるレコード数が複数件存在する場合が多いです。それが100件以上のレコードになる場合は、他の手段を検討したほうが良いでしょう。

※LOOP処理については、こちらの記事をご覧ください。

MOVE命令とMOVE-CORRESPONDING命令については、ここまでの知識を持っていれば実際の現場で困ることはありません。

タイトルとURLをコピーしました