ABAPにおける文字列操作命令「REPLACE命令」について1分で解説します。
REPLACE命令はその名の通り指定した文字列を別の文字列に置き換える命令。うまく利用すれば、Excel関数のTRIM関数やSUBSTITUE関数のように利用可能です。
CONSTANTS: GC_A(01) TYPE C VALUE 'A', GC_B(01) TYPE C VALUE 'B'. DATA LV_TEXT TYPE STRING. LV_TEXT = 'AAAA'. * 'A'を'B' に置換 REPLACE GC_A IN LV_TEXT WITH GC_B.
REPLACE命令とは?
REPLACE命令とは、指定した文字列を別の文字列に置換する命令です。
REPLACE [置換前の文字] IN [変数] WITH [置換後の文字].
LV_TEXT = 'AAAA' * 'A'を'B' に置換 REPLACE 'A' IN LV_TEXT WITH 'B'. * 結果 LV_TEXT ⇒「BAAA」
指定した変数に含まれる文字列 'A' が 'B' に置換されます。
注意すべきなのが、置換されるのは最初の文字列のみであるという点。後述する「ALL OCCURENCES」オプションを利用すると、全ての文字列を置換できます。
LV_TEXT = 'AAAABBBBAAAA' * 'AAAA'を'CCCC' に置換 REPLACE 'AAAA' IN LV_TEXT WITH 'CCCC. * 結果 LV_TEXT ⇒「CCCCBBBBAAAA」
このサンプルコードの場合、置換対象の文字列 'AAAA' は対象の変数に2回表れますが最初の1つしか置換されません。
対象の変数に指定した文字列が1つしかないことが確実に分かっている場合(もしくは、あえて最初の文字列のみを置換したい場合)にオプションなしでREPLACE命令を用いるのが一般的です。
SY-SUBRCの値
置換に成功すると、SY-SUBRCの値は0に。失敗する(置換対象の文字列が存在しない)と4にセットされます。
条件付き成功というのは以下のような場合で、置換には成功しても置換結果の項目長が溢れてしまう場合に、SY-SUBRCが '2' にセットされます。
DATA LV_TEXT TYPE C LENGTH 4. LV_TEXT = 'ABCD' * 'A'を'123' に置換 REPLACE 'A' IN LV_TEXT WITH '1234. * 結果 LV_TEXT ⇒「123B」
SY-SUBRCとはシステム変数の1つで、処理の結果(成功 or 失敗)を保持します。
他のプログラミング言語を学んだ方であれば、Bool型の変数をイメージいただければ良いかと思います。詳しくは下記のページで、システム項目全般の解説を行っておりますので是非ご覧ください。
指定した全文字列を置換する方法:ALL OCCURRENCES OF
REPLACE ALL OCCURRENCES OF [置換前の文字] IN [変数] WITH [置換後の文字].
指定した全文字列をすべて置換したい場合は、「ALL OCCURRENCES」オプションを利用します。
CONSTANTS: GC_A(01) TYPE C VALUE 'A', GC_B(01) TYPE C VALUE 'B'. DATA LV_TEXT TYPE STRING. LV_TEXT = 'AAAA'. * 'A'を'B' に置換 REPLACE ALL OCCURRENCES OF GC_A IN LV_TEXT WITH GC_B. * 結果 LV_TEXT⇒「BBBB」
これで、指定した変数の中に含まれる 'A' を 'B' に置換することができます。
ExcelのTRIM関数やSUBSTITUE関数のように利用したい場合は、こちらのオプションを利用するのがお勧めです。
尚、「ALL OCURRENCES」オプションの反対が「FIRST OCCURENCE」オプション。こちらは、その名の通り「最初の文字列だけを置換する」オプションです。すなわち、何もオプションを指定しない場合と同様の動きになります。
CONSTANTS: GC_A(01) TYPE C VALUE 'A', GC_B(01) TYPE C VALUE 'B'. DATA LV_TEXT TYPE STRING. LV_TEXT = 'AAAA'. * 最初の 'A' を 'B' に置換 REPLACE FIRST OCCURRENCE OF GC_A IN LV_TEXT WITH GC_B. * 結果 LV_TEXT⇒「BAAA」
例えば、連続した文字列(重複)を削除したい場合などに有効です。
CONSTANTS: GC_AA(02) TYPE C VALUE 'AA', GC_A(01) TYPE C VALUE 'A'. DATA LV_TEXT TYPE STRING. LV_TEXT = 'AAB AAB AAB'. * 'AA' を 'A' に置換 REPLACE ALL OCCURRENCES OF GC_AA IN LV_TEXT WITH GC_A. * 結果 LV_TEXT⇒「AB AB AB」
SAP / ABAPを1から学習したい方は
SAP / ABAPを1から学習したい初心者の方向けに、できるだけ網羅的にABAPが理解できるよう以下ページに知識体系を整理しています。
特に初心者のうちは、どこから学べばよいか?どう勉強すれば良いか?すらわからない状態になりがち。
ある程度の知識を持ったうえで、はじめて実践的な理解へとつながります。
是非、一度ご覧になってみてください。