ABAP

【ABAP】1分でわかるCONDENSE命令

ABAPにおける文字列操作命令「CONDENSE」の使い方、「NO-GAPS」オプションについて解説します。

CONDENSEを日本語に直すと「濃縮する」「凝縮する」といった意味となり、ABAPのCONDENSE命令では変数(データオブジェクト)に含まれるブランクを削除し、文字列だけを残す処理を行います。

このページでは・・・

  • CONDENSE命令の処理内容
  • NO-GAPSオプションの利用方法
  • CONDENSE命令利用時の注意点

について解説しています。ABAPerであれば知らないと恥ずかしい内容ばかりですので、是非最後までご覧ください。

CONDENSE命令とは

CONDENSE命令とは、ABAPにおける文字列の処理命令です。

冒頭でも解説した通り「CONDENSE」とは日本語で「凝縮する」という意味で、その意味の通り文字列を凝縮(縮める)処理を行います。早速、構文ルールと、実際の処理内容を見てみましょう。

構文ルール:CONDENSE命令

CONDENSE (変数).


対象の文字列が格納されている変数をオペランドに指定するだけで、変数に含まれる文字列の①先頭と末尾に存在する空白と、②その他の「連続するブランク」が消去され、ブランクが1つだけに変更されます。

実際のサンプルコードを用いて、どういうことか具体的なイメージを持てるよう確認していきましょう。

サンプルコード①:CONDENSE命令

DATA TEST(30).
TEST+10(10)  = ‘sample’.
CONDENSE TEST.
WRITE TEST.


変数TESTは30桁長であるのに対して、実際は「sample」という6桁の値以外はすべてブランクです。

CONDENSE命令では、①先頭と末尾に存在するブランクを削除するため、結果は以下のようになります。

データオブジェクトがstring型の場合には、変数の長さも合わせて圧縮してくれます。string型でなければ、右側にブランクが格納されます。

サンプルコード②:CONDENSE命令

DATA TEST(30).
TEST(10)     = ‘I am’.
TEST+10(10) = ‘BIZonline’.
TEST+20(10) = ‘Author’.
CONDENSE TEST.
WRITE TEST.


サンプルコードの2つ目を見てみましょう。こちらを動かした結果が、こちらです。

CONDENSE命令の実行結果①

CONDENSE命令を行う前の処理は、変数をオフセット処理していますので以下のように連続するブランクが存在しています。

CONDENSE命令では「連続するブランク」が消去され、ブランクが1つだけに変更されるため、最終的な結果は以下のようにすっきりとした形になります。

2文字以上のブランクのみを消去するのがCONDENSE命令で理解が難しい点ですので、以下の通りきちんと整理して理解しておきましょう。

  • ブランクが連続で存在する場合  ⇒ 連続するブランクを削除し1つのブランクに変更する
  • ブランクが連続で存在しない場合 ⇒ 何もしない

CONDENSE命令は、MESSAGE命令を用いてテキストを動的に表示したい場合などに用いる場合などに応用できます。

※上記サンプルコードを理解するためには、以下の知識も必要になります。サンプルコードの意味が分からない方は以下のリンクからDATA命令、WRITE命令についても合わせてご覧ください。

① DATA命令―変数の定義について

② WRITE命令―文字列の出力

NO-GAPSオプション

CONDENSE (変数) NO-GAPS.

「NO-GAPS」オプションを指定すると、すべてのブランクを削除するようになります。ここは混乱しやすい部分でもあるので、オプションを利用する場合とオプションを利用しない場合を丁寧に整理しておきましょう。

NO-GAPSオプションを利用しない

⇒ 2文字以上のブランクが削除され、1つのブランクになる

NO-GAPSオプションを利用する

⇒ すべてのブランクが削除される

つまり、NO-GAPSオプションを利用するとすべてのブランクが削除され文字列が左詰めされることになります。

こちらも具体的に処理の内容がイメージできるようサンプルコードを用いて具体的なイメージを持てるようにしておきましょう。

サンプルコード:NO-GAPS

DATA TEST(30).
         TEST(10)     = ‘I am’.
         TEST+10(10) = ‘BIZonline’.
         TEST+20(10) = ‘Author’.
CONDENSE TEST NO-GAPS.
WRITE TEST.


こちらを実行した結果がこちらです。

CONDENSE命令実行結果②

ブランクがすべてなくなり、左詰めされました。NO-GAPSオプションを適切に利用できると、メッセージ出力系の処理に強くなれます。この機会に覚えておきましょう。

CONDENSE命令の注意点

CONDENSE命令で指定する変数(データオブジェクト)は、文字型でなければいけません。

文字型以外の場合は、おそらく構文チェックにひっかかるはずです。その場合は、変数のデータ型を変換して解決します。

データ型について詳しく知りたい方は、こちらのページをご覧ください。

これで、CONDENSE命令についての理解はOKです。特に文字列の操作については、WRITE命令と合わせて帳票出力系のプログラムで用いられることが多くありますので、何度か復習しておきましょう。