PR

【ABAP】3分で学ぶCONCATENATE命令:文字列結合

ABAP

ABAPで文字列結合を行うCONCATENATE命令について解説します。

CONCATENATE命令は、文字列を結合する命令です。基本的にはExcelの「concatenate」関数と同じような働きをするため難しい内容ではありません。

このページで学べる内容
  • CONCATENATE命令の基本
    • 構文ルール
    • CONCATENATE命令を利用したサンプルコード
    • SEPARATEDオプション
  • 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.

参考 DATA命令 / WRITE命令

上記のプログラムは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.

上記のサンプルコードでは、HelloWorldをスペースで区切って結合し、結果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. データ型の制限
  2. データ長(桁長)の制限

注意点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を使用する前に適切な型変換を行い、異なるデータ型間での問題を防ぐことが重要です。

参考 ABAPのデータ型 / TYPES命令

留意事項②:データ長(桁長)の制限

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命令のまとめ

使用方法

  1. 基本的な使用法: CONCATENATE <source1> <source2> ... INTO <target>.
    • <source1>, <source2>などの部分には結合したいデータを、<target>の部分には結果を格納したい変数を指定します。
  2. 区切り文字を指定する: CONCATENATE <source1> <source2> ... INTO <target> SEPARATED BY <separator>.
    • <separator>には区切り文字を指定します。

注意点

  1. データ型の制限:結果は文字列として扱われ、数値など非文字列型のデータは自動的に文字列に変換されます。これは予期しない結果を引き起こす可能性があるため、適切な型変換を先に行うことが重要です。
  2. データ長(桁長)の制限:結果として得られる文字列が格納先のフィールドに収まるように、その長さに注意する必要があります。必要に応じて結果を切り捨てるか、格納先のフィールドを適切な長さにするなどの対応が必要です。
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.

初めて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をコピーしました