【バージョンアップ】CHARLEN命令

概要

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  サシス