ABAPで外部ファイルや連携データを取り込むとき、「入力値が数字だけで構成されているか」を確認したいことがあります。SAP標準の汎用モジュール NUMERIC_CHECK は、入力した文字列の判定結果を HTYPE に返します。半角数字(0~9)だけを許可したいなら、CO 演算子でも簡潔にチェックできます。
NUMERIC_CHECKの基本:HTYPEを確認する
STRING_IN に判定したい値を渡し、戻り値の HTYPE を確認します。HTYPE = 'NUMC' なら数字として判定され、HTYPE = 'CHAR' なら数字以外の文字が含まれる判定です。STRING_OUT も出力パラメータですが、判定だけが目的なら省略できます。
DATA lv_input TYPE string VALUE '12345'.
DATA lv_htype TYPE dd01v-datatype.
IF lv_input IS INITIAL.
" 空値は別に扱う
ELSE.
CALL FUNCTION 'NUMERIC_CHECK'
EXPORTING
string_in = lv_input
IMPORTING
htype = lv_htype.
IF lv_htype = 'NUMC'.
" 数字として判定された場合
ELSE.
" 数字以外の文字が含まれる場合
ENDIF.
ENDIF.
たとえば 12345 は NUMC、12A45 は CHAR と判定されます。戻り値は真偽値ではないため、HTYPE の値を明示して比較してください。実システムでは、対象のSAPリリースでSE37からインターフェースと境界値の挙動を確認すると確実です。
半角数字だけならCO演算子でも判定できる
要件が「空でない文字列が半角の0~9だけでできていること」なら、文字集合を比較する CO(Contains Only)が分かりやすい方法です。
DATA lv_value TYPE string VALUE '00123'.
IF lv_value IS NOT INITIAL
AND lv_value CO '0123456789'.
" 半角数字だけで構成される
ELSE.
" 空値、または半角数字以外を含む
ENDIF.
CN は CO の反対(Contains Not Only)です。ただし、必須入力の判定まで CN だけに任せず、空値は別途確認してください。
| 入力例 | 空でない文字列に対する CO 判定 | 理由 |
|---|---|---|
12345 | 真 | 半角数字だけ |
00123 | 真 | 先頭のゼロも数字 |
12A45 | 偽 | 英字を含む |
-123 / 12.3 | 偽 | 符号や小数点を含む |
実装時に注意したい3点
- 空文字を先に判定する。
string型の空文字はCOで真になり得ます。必須入力ならIS NOT INITIALを組み合わせます。 - 空白とデータ型を確認する。
c型の固定長項目では末尾の空白もCOの比較対象です。入力をトリムしてよいかは業務要件で決め、安易に空白を除去しないでください。 - 「数字だけ」と「数値として有効」を分ける。 符号、小数点、桁区切り、全角数字を受け付けるかは別の仕様です。金額や数量を扱うなら、形式に加えて型変換・桁数・範囲の検証も必要です。
どちらを使うべきか
半角数字だけを許す入力チェックなら、条件がコードから読み取れる CO 演算子が使いやすいでしょう。既存プログラムで NUMERIC_CHECK を利用している場合は、HTYPE の判定値と空値・空白の扱いを確認してから流用してください。ABAP Cloudなど利用可能なAPIに制限がある環境では、汎用モジュールが使用可能かを開発環境で確認します。
参考・関連記事
- 文字列の全角・半角変換の汎用モジュール:全角数字を含む入力を扱うとき、文字種の変換方法も確認できます。
- 日付の妥当性をチェックする汎用モジュール:外部データを取り込む際、数値と並んで確認したい日付項目です。
- 汎用モジュール一覧:入力チェックや文字列操作に使う他の機能を探せます。