概要
R/3からECC6.0へバージョンアップする時にアドオンプログラム内にSTRLEN命令を使用している事があります。
STRLEN命令は文字の長さを数値で返す命令ですがバージョンアップを行うと長さの定義が変わります。
ECC6.0以降(US ※1)は文字数をカウントし、R/3(NUS ※2)ではバイト数をカウントします。
そのため、2バイト文字を含む変数を扱っているとバージョンアップしたことでバイト数でカウントしていた所を文字数でカウントしてしまうためエラーを引き起こす原因となります。
では具体的にどの様に対処すべきかを以下解説してきます。
※1:US – Unicode Systems
※2:NUS – Non Unicode Systems
もしSTRLEN命令についてどの様な命令か分からないまたは記憶が曖昧である方は以下の記事をご確認ください。
置換え方法
置換えるにはクラス「CL_ABAP_LIST_UTILITIES」のメソッド「DYNAMIC_OUTPUT_LENGTH」を使用する事で置換える事が可能です。
実際に修正前後の命令イメージを以下に記載します。
・修正前
変数A = STRLEN( 変数B ).
・修正後
変数A = CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH( 変数B ).
ポイント
バージョンアップ時に置換える際のポイントは以下となります。
- 1バイト文字のみを扱う変数の場合修正不要
- 2バイト文字を含む変数でも修正不要の場合もある
- 型変換が必要な場合がある
1バイト文字のみを扱う変数の場合修正不要
バージョンアップ時にSTRLEN命令を全て置換えテストを行うと無駄な工数が発生します。
STRLEN命令で扱っている変数が半角文字(1バイト文字)だけの場合はバージョンアップ後の影響を受けないため置換える必要がありません。
2バイト文字を含む変数でも修正不要の場合もある
取得した長さをどの様に使用しているかで修正要否が変わるため必ず確認する必要があります。
例えばSTRLEN命令にて長さを抽出した後に初期値判定などに使用している場合がある。
その場合、長さが取得可能か不可かの判定で扱われているため修正不要でも問題ないものがある。
他にSTRLEN命令後続処理にてOFFSET命令の長さで使用している場合はそのままの状態で処理が成立ち、修正するとバグになるものもある。
型変換が必要な場合がある
メソッド「DYNAMIC_OUTPUT_LENGTH」で扱えるデータ型はC,STRINGとなります。
STRLEN命令で扱えるデータ型はC,N,D,TまたはSTRINGを使用する事が可能であるためC,STRING以外の変数が扱われている場合は一度型変換を行う必要があります。
型変換を行わなかった場合は構文エラーとなります。
置換えソースコードサンプル
STRLEN命令とメソッド「DYNAMIC_OUTPUT_LENGTH」で置換えた場合を比較したソースコードを以下に記載します。
DATA: L_STRLENA(10) TYPE C, L_STRLENB(10) TYPE C, L_STRLENC TYPE D, L_STRLENC1(10) TYPE C, L_SLENA TYPE I, L_SLENAA TYPE I, L_SLENB TYPE I, L_SLENBB TYPE I, L_SLENC TYPE I, L_SLENCC TYPE I. L_STRLENA = 'ABCあいう'. L_STRLENB = ' Dえ Eお '. "半角空白と全角空白と半角空白2つ L_STRLENC = '20200501'. *型変換 L_STRLENC1 = L_STRLENC. L_SLENA = STRLEN( L_STRLENA ). L_SLENAA = CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH( L_STRLENA ). L_SLENB = STRLEN( L_STRLENB ). L_SLENBB = CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH( L_STRLENB ). L_SLENC = STRLEN( L_STRLENC ). L_SLENCC = CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH( L_STRLENC1 ). WRITE:/ 'L_SLENA ' ,L_SLENA , L_STRLENA, / 'L_SLENAA' ,L_SLENAA, L_STRLENA, / 'L_SLENB ' ,L_SLENB , L_STRLENB, / 'L_SLENBB' ,L_SLENBB, L_STRLENB, / 'L_SLENC ' ,L_SLENC , L_STRLENC, / 'L_SLENCC' ,L_SLENCC, L_STRLENC1.
実行結果は以下の通りです。
L_SLENA 6 ABCあいう
L_SLENAA 9 ABCあいう
L_SLENB 6 Dえ Eお
L_SLENBB 9 Dえ Eお
L_SLENC 8 20200501
L_SLENCC 8 20200501