ABAPで文字列結合を行うCONCATENATE命令について解説します。
CONCATENATE命令は、文字列を結合する命令です。基本的にはExcelの「concatenate」関数と同じような働きをするため難しい内容ではありません。
SAPエンジニアやABAPerを目指す方であれば知らないと恥ずかしい超・基本知識の1つ。是非最後までご覧ください。
参考 ABAPの基本構文ルール
CONCATENATE命令の基本
CONCATENATE
命令はABAPで使用される文字列操作系の命令の1つで、文字列の結合を行うために使用されます。
CONCATENATE
命令の構文ルールは以下の通り。
CONCATENATE a1 a2 ... an INTO <result>.
a1
,a2
, ... ,an
→結合したい変数などのデータオブジェクトか文字列を指定<result>
→結合した結果を格納する変数・データオブジェクト
Excel関数のconcatenate命令とは異なり、各オブジェクト/文字列の間のカンマは不要。
ざっくりまとめると、CONCATENATE命令は、a1、a2、a3・・・と指定した順番に文字列を連結し、 "INTO" の後に指定した変数(データオブジェクト)に格納する命令だといえます。
サンプルコード
DATA: lv_string1 TYPE string VALUE 'Hello,', lv_string2 TYPE string VALUE 'World!', lv_result TYPE string. CONCATENATE lv_string1 lv_string2 INTO lv_result. WRITE: / lv_result.
上記のプログラムはHello,
とWorld!
を結合して、結果Hello,World!
を出力しているだけ。とっても簡単ですね。
SEPARATED BY(空白などで区切る)
続いて、SEPARATEDオプションについて解説します。
CONCATENATE <f1> <f2> ... <fn> INTO <result> [SEPARATED BY <separator>].
SEPARATEDオプションを利用することで、特定の文字列やブランク(=空白文字)などで結合された各変数を分割することが可能です。
先ほどのサンプルコードを少し改修してみます。
DATA: lv_string1 TYPE string VALUE 'Hello', lv_string2 TYPE string VALUE 'World', lv_result TYPE string. CONCATENATE lv_string1 lv_string2 INTO lv_result SEPARATED BY space. WRITE: / lv_result.
上記のサンプルコードでは、Hello
とWorld
をスペースで区切って結合し、結果Hello World
(←hello と Worldの間にスペースが入る)を出力します。
以下にCONCATENATE命令のサンプルコードをいくつか記載します。上記の内容を復習しつつ、実践的な内容を理解しましょう!
例1 カンマで区切られた複数の文字列を結合する例
DATA: lv_string1 TYPE string VALUE 'Mango', lv_string2 TYPE string VALUE 'Banana', lv_string3 TYPE string VALUE 'Apple', lv_result TYPE string. CONCATENATE lv_string1 lv_string2 lv_string3 INTO lv_result SEPARATED BY ', '. WRITE: / lv_result.
この例では、カンマとスペースを区切り文字として使い、'Mango', 'Banana', 'Apple' を結合して、結果 'Mango, Banana, Apple' を出力します。
例2 SAP テーブルからデータを取得し、結果を結合して表示する
DATA: lt_sflight TYPE TABLE OF sflight, ls_sflight TYPE sflight, lv_result TYPE string. SELECT * FROM sflight INTO TABLE lt_sflight UP TO 5 ROWS. LOOP AT lt_sflight INTO ls_sflight. CONCATENATE 'Flight number:' ls_sflight-fltnr ', Airline Id:' ls_sflight-carrid ', Date:' ls_sflight-fldate INTO lv_result SEPARATED BY space. WRITE: / lv_result. CLEAR: lv_result. ENDLOOP.
参考 SELECT命令 / LOOP命令 / CLEAR命令
このプログラムは SAP のフライトデータテーブル(sflight
)から最初の5行を選択し、各行についてフライト番号(fltnr
)、航空会社 ID(carrid
)、フライトの日付(fldate
)を結合して出力します。
CONCATENATE命令を利用する際の注意事項
最後に、CONCATENATE命令を利用する際の注意点について補足します。
CONCATENATE命令利用時の留意事項
- データ型の制限
- データ長(桁長)の制限
注意点1:データ型の制限
CONCATENATE
命令の結果は文字列。これは、結合される値が文字列型でない場合に注意が必要です。
例えば、数値型の項目を文字列と結合しようとした場合、数値は自動的に文字列に変換されます。しかし、この自動変換は常に期待した結果をもたらすわけではありません。
DATA: lv_number TYPE i VALUE 123, lv_string TYPE string VALUE 'Hello', lv_result TYPE string. CONCATENATE lv_number lv_string INTO lv_result. WRITE: / lv_result.
↑の例では数値型の変数 lv_number
と文字列型の変数 lv_string
を結合しようとしています。数値は自動的に文字列に変換されますが、結果として得られる文字列が予期した形式になるとは限らず、エラーを引き起こす可能性があります。
このようなエラーを回避するためにはCONCATENATE
を使用する前に適切な型変換を行い、異なるデータ型間での問題を防ぐことが重要です。
留意事項②:データ長(桁長)の制限
CONCATENATE
命令を使用する際には、結果として得られる文字列が格納先の変数に収まるようする必要があります。
文字列型のフィールドには通常、最大長が定義されています。たとえば、長さ50のフィールドに長さ60の文字列を格納しようとすると、エラーが発生します。特に、結果を固定長のフィールドに格納する場合や、結合する文字列の長さが予めわからない場合には注意が必要。
DATA: lv_string1 TYPE c LENGTH 50 VALUE 'This is a really long string. It is definitely more than 50 characters long.', lv_string2 TYPE c LENGTH 50 VALUE 'This is another really long string. It is also definitely more than 50 characters long.', lv_result TYPE c LENGTH 50. CONCATENATE lv_string1 lv_string2 INTO lv_result. WRITE: / lv_result.
↑の例では、2つの長い文字列(それぞれ50文字以上)を結合しようとしています。しかし、結果を格納するフィールド lv_result
の長さは50と定義されているため、結果の文字列がフィールドに収まらず、エラーが発生します。
このような場合には、結果の長さをチェックし、必要に応じて結果を切り捨てるか、格納先のフィールドを適切な長さにするなどの対応が必要です。
ABAP CONCATENATE命令のまとめ
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!