ABAPで文字列を指定位置で分割する|STRING_SPLIT_AT_POSITIONとバイト数の注意点

STRING_SPLIT_AT_POSITIONは、固定長の文字項目を指定位置で前半・後半に分ける汎用モジュールです。元記事の「指定したバイト数で分割する」という説明は誤解を招くため、位置による分割と、外部ファイルなどで必要になるバイト長の判定を分けて説明します。

指定位置で分割するABAP例

以下は10桁の英数字を、先頭5桁と残り5桁に分ける例です。

DATA: lv_text  TYPE c LENGTH 10 VALUE '0123456789',
      lv_left  TYPE c LENGTH 6,
      lv_right TYPE c LENGTH 6.

CALL FUNCTION 'STRING_SPLIT_AT_POSITION'
  EXPORTING
    string            = lv_text
    pos               = 5
  IMPORTING
    string1           = lv_left
    string2           = lv_right
  EXCEPTIONS
    string1_too_small = 1
    string2_too_small = 2
    pos_not_valid     = 3
    OTHERS            = 4.

CASE sy-subrc.
  WHEN 0.
    WRITE: / lv_left, / lv_right.
  WHEN 1 OR 2.
    WRITE / '出力先の長さが不足しています'.
  WHEN 3.
    WRITE / '分割位置が不正です'.
  WHEN OTHERS.
    WRITE / '文字列の分割に失敗しました'.
ENDCASE.

SAP公式のサンプルでも、必須入力はSTRINGとPOS、結果はSTRING1とSTRING2です。出力先の長さが足りない場合、位置が不正な場合の例外を確認して処理します。利用中のシステムではSE37でインターフェースとテスト結果を確認してください。

「指定バイト数」と混同しない

文字の位置と、特定の文字コードに変換した後のバイト数は別です。日本語などを含むデータを外部システムの「nバイト以内」に収めたい場合は、この汎用モジュールにPOS = nを渡すだけでは要件を満たせません。送信先の文字コードへ変換したバイト列の長さを確認し、文字の途中で切らない設計が必要です。

単純な固定長フィールドの分割ならABAPの部分文字列も選択肢です。例外処理や保守性を含めて、対象リリースの開発方針に合わせて選びましょう。

参考・関連記事

関連記事

PAGE TOP