概要
R/3からECC6.0へバージョンアップする時にアドオンプログラム内にCHARLEN命令を使用している事があります。
CHARLEN命令は最初の文字の長さを数値で返す命令ですがバージョンアップを行うと長さの定義が変わります。
ECC6.0以降(US ※1)は文字数をカウントし、R/3(NUS ※2)ではバイト数をカウントします。
そのため、バージョンアップしたことによりバイト数でカウントしていた所を文字数でカウントしてしまうためエラーを引き起こす原因となります。
では具体的にどの様に対処すべきかを以下解説してきます。
※1:US – Unicode Systems
※2:NUS – Non Unicode Systems
もしCHARLEN命令についてどの様な命令か分からないまたは記憶が曖昧である方は以下の記事をご確認ください。
置換え方法
置換えるには汎用モジュール「NLS_VISUAL_CHARLEN」を使用する事で置換える事が可能です。
実際に修正前後の命令イメージを以下に記載します。
・修正前
変数A = CHARLEN( 変数B ).
・修正後
CALL FUNCTION ‘NLS_VISUAL_CHARLEN’
EXPORTING
STR = 変数B
IMPORTING
LEN_VISUAL = 変数A.
ポイント
バージョンアップ時に置換える際のポイントは「基本的に置換える」の1つとなります。
最初の文字のバイト数を確認する必要があるため基本的に置換えないとバグになります。
念のため後続処理は確認しましょう。
置換えソースコードサンプル
CHARLEN命令と汎用モジュール「NLS_VISUAL_CHARLEN」で置換えた場合を比較したソースコードを以下に記載します。
DATA: L_CHARLENA(10) TYPE C VALUE 'あいう123 ', L_CHARLENB(10) TYPE C VALUE 'abcかきく ', L_CHARLENC(10) TYPE N VALUE 100, L_CHARLEND TYPE STRING VALUE ' サシス', "先頭全角空白 L_CLENA TYPE I, L_CLENB TYPE I, L_CLENC TYPE I, L_CLEND TYPE I, L_CLENAA TYPE I, L_CLENBB TYPE I, L_CLENCC TYPE I, L_CLENDD TYPE I. ***パターンA L_CLENA = CHARLEN( L_CHARLENA ). CALL FUNCTION 'NLS_VISUAL_CHARLEN' EXPORTING STR = L_CHARLENA IMPORTING LEN_VISUAL = L_CLENAA. ***パターンB L_CLENB = CHARLEN( L_CHARLENB ). CALL FUNCTION 'NLS_VISUAL_CHARLEN' EXPORTING STR = L_CHARLENB IMPORTING LEN_VISUAL = L_CLENBB. ***パターンC L_CLENC = CHARLEN( L_CHARLENC ). CALL FUNCTION 'NLS_VISUAL_CHARLEN' EXPORTING STR = L_CHARLENC IMPORTING LEN_VISUAL = L_CLENCC. ***パターンD L_CLEND = CHARLEN( L_CHARLEND ). CALL FUNCTION 'NLS_VISUAL_CHARLEN' EXPORTING STR = L_CHARLEND IMPORTING LEN_VISUAL = L_CLENDD. WRITE:/ 'L_CLENA ', L_CLENA , L_CHARLENA, / 'L_CLENAA', L_CLENAA, L_CHARLENA, / 'L_CLENB ', L_CLENB , L_CHARLENB, / 'L_CLENBB', L_CLENBB, L_CHARLENB, / 'L_CLENC ', L_CLENC , L_CHARLENC, / 'L_CLENCC', L_CLENCC, L_CHARLENC, / 'L_CLEND ', L_CLEND , L_CHARLEND, / 'L_CLENDD', L_CLENDD, L_CHARLEND.
実行結果は以下の通り。
L_CLENA 1 あいう123
L_CLENAA 2 あいう123
L_CLENB 1 abcかきく
L_CLENBB 1 abcかきく
L_CLENC 1 0000000100
L_CLENCC 1 0000000100
L_CLEND 1 サシス
L_CLENDD 2 サシス