新規記事の投稿を行うことで、非表示にすることが可能です。
2020年02月10日
【ABAP】MOVE命令―値の代入
このページでは、MOVE命令による値の代入方法について解説します。
値の代入とは、変数に別の変数の値を入れたり、直接文字や数字などの値を入れたりして変数の値を変えることを言います。
ページ後半では、MOVE命令の応用編「MOVE-CORRESPONDING命令」についても解説しています。
目次
1 MOVE命令
1.1 構文ルール:MOVE命令
1.2 MOVEを利用しない場合:=
1.3 複数の代入(MOVE命令では不可)
1.4 データ型が異なる場合
2 MOVE-CORRESPONDING命令
2.1 構文ルール:MOVE-CORRESPONDING命令
2.2 MOVE-CORRESPONDING命令の注意点
1 MOVE命令
1.1 構文ルール:MOVE命令
1.2 MOVEを利用しない場合:=
1.3 複数の代入(MOVE命令では不可)
1.4 データ型が異なる場合
2 MOVE-CORRESPONDING命令
2.1 構文ルール:MOVE-CORRESPONDING命令
2.2 MOVE-CORRESPONDING命令の注意点
1 MOVE命令
MOVE A TO B.
構文ルールはこれだけです。
データオブジェクトAの値をデータオブジェクトBへ格納します。
Aの値を、そのままBに入れる、というイメージでOKです。
MOVE(動く、移動する)という意味につられて、データオブジェクトを移動すると誤解してしまう人がいますが、データオブジェクトをコピーするというのがMOVE命令の正しい理解です。
1.1 MOVEを利用しない場合:=
B = A.
MOVE命令を利用しなくても、”=” を用いてデータオブジェクトの代入が可能です。
注意すべきは、MOVE命令の場合とAとBが逆になることです。
ABAPではデータオブジェクトを ”=” で結んだ場合には、必ず右から左へ値がコピーされます。
1.2 複数の代入(MOVE命令では不可)
"=" を利用すれば、データオブジェクトAの値を「B」「C」「D」・・・の複数のデータオブジェクトに格納することもできます。
以下のように複数のデータオブジェクトを”=”で結んでみます。
B = C = D = A.
この処理は、以下の処理と全く同じように動きます。
すなわち、変数Aに「MOVE」という値が入っていれば、変数B・変数C・変数Dにも「MOVE」という値が格納されることになります。
D = A.
C = D.
B = C.
ただし、値の複数代入の利用頻度はそれほど高くないため、実際に利用するシーンはないかもしれません。
同じ値を格納するデータオブジェクトであれば、そもそもデータオブジェクトを分ける必要性が無いためです。
実際のコードで見かけることは恐らくない形かと思います。
MOVE命令では、上記のように一気に複数の変数に値をコピーすることができませんので注意が必要です。
1.4 データ型が異なる場合
応用知識として、データオブジェクトAとBのデータ型が異なる場合の処理について補足します。
変数Aが日付型で、変数Bが数値型の場合―。
こんな場合に、MOVE命令はどのような処理となるか?を解説します。
データ型が異なるが互換性がある場合(INTとNUMCなど)
互換性がある異なるデータ同士であれば、値の内容は代入される側のデータ型に自動的に変換されます。
A ⇒ ”2” INT2
B ⇒ ”2” NUMC
の場合に「B = A.」とすれば、値はそのまま”2”となりますが、データ型はBの「NUMC」に変換されます。
データ型の互換性がない場合
データ型の互換性がない場合には、データオブジェクトの代入は不可となります。
コンパイル時に構文エラーではじかれるか、プログラム実行時にエラーとなります。
2 MOVE-CORRESPONDING命令
ここからは、MOVE命令の派生形―。
MOVE-CORRESPONDING命令について解説します。
後から解説しますが、MOVE-CORRESPONDING命令はパフォーマンスの観点からあまり推奨されない命令ですが、知っておくべき大切な知識の1つです。
MOVE-CORRESPONDING命令を一言で説明すると、構造内の同じ名前の項目へ値を代入する命令です。
MOVE-CORRESPONDING命令では、自動的に同名の項目を参照し値を代入します。
同名の項目がない場合は、項目は無視され処理は行われません。
特に構文エラーやプログラム実行エラーにならないため、本当に値が代入されているかどうかは、デバッグをしながら注意深く確認する必要があります。
2.1 構文ルール:MOVE-CORRESPONDING命令
MOVE-CORRESPONDING (構造A) TO (構造B).
MOVE-CORRESPONDING命令では必ず構造を指定します。変数やテーブルを指定することはできません。
項目名に応じて値が自動的に代入されます。
2.2 MOVE-CORRESPONDING命令の注意点
冒頭でも説明した通り、MOVE-CORRESPONDING命令はSAP非推奨の命令です。
その大きな理由が「パフォーマンスの問題」です。
結論から言うと、MOVE-CORRESPONDING命令はパフォーマンス的に良い効果をもたらしません。
MOVE-CORRESPONDING命令は、@指定された構造の同じ名称を持つ項目を探し、A対応する項目に値を代入するという2ステップの処理が内部的に行われています。
MOVE-CORRESPONDING命令の内部処理
@同じ名称を持つ項目を探索する
A対応する項目が見つかれば値を代入する・対応する項目がなければ、何もしない
@同じ名称を持つ項目を探索する
A対応する項目が見つかれば値を代入する・対応する項目がなければ、何もしない
単なるMOVE命令と比較して処理の内容が複雑です。
基本的には、当該命令はLOOP処理の中で利用される想定(指定するのが構造であるため)ですので、対象となるレコード数が複数件存在する場合が多いです。
それが100件以上のレコードになる場合は、他の手段を検討したほうが良いでしょう。
タグ:ABAP