ABAPで日付の妥当性をチェックする方法|DATE_CHECK_PLAUSIBILITYの使い方

外部システムやCSV・Excelから日付を取り込むときは、値が8桁でも実在する日付とは限りません。たとえば 20230229 や 20240431 は日付として不正です。ABAPでは汎用モジュール DATE_CHECK_PLAUSIBILITY を使い、日付の妥当性を確認できます。

DATE_CHECK_PLAUSIBILITYで確認できること

DATE にABAPの日付型(TYPE d)を渡します。妥当な日付なら sy-subrc = 0、存在しない日付なら例外 PLAUSIBILITY_CHECK_FAILED を受けて sy-subrc = 1 で判定できます。TYPE d の変数に代入できたことだけでは、実在する日付と確認したことにはなりません。

このチェックは暦上の妥当性を調べるためのものです。会社の営業日・祝日判定や、伝票転記期間の確認には別の判定が必要です。結果は sy-subrc で分岐し、0 は有効、1 は PLAUSIBILITY_CHECK_FAILED、2 はその他の例外として扱います。「0以外はすべて不正日付」とまとめず、想定外のエラーを区別しましょう。

ABAPコード例:外部入力の日付をチェックする

次の例は、外部から受け取った8桁の値を想定しています。先に入力形式と未設定値を確認し、その後に汎用モジュールを呼び出します。

REPORT zdate_check_sample.

DATA lv_input TYPE string VALUE '20240229'.
DATA lv_date  TYPE d.

START-OF-SELECTION.
  "外部入力の形式を先に確認する
  IF strlen( lv_input ) <> 8 OR lv_input CN '0123456789'.
    WRITE: / 'YYYYMMDDの8桁数字で指定してください。'.
    RETURN.
  ENDIF.

  lv_date = lv_input.
  IF lv_date IS INITIAL.
    WRITE: / '日付が未設定です。'.
    RETURN.
  ENDIF.

  CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
    EXPORTING
      date                      = lv_date
    EXCEPTIONS
      plausibility_check_failed = 1
      OTHERS                    = 2.

  CASE sy-subrc.
    WHEN 0.
      WRITE: / lv_input, 'は有効な日付です。'.
    WHEN 1.
      WRITE: / lv_input, 'は存在しない日付です。'.
    WHEN OTHERS.
      WRITE: / '日付チェックでエラーが発生しました。'.
  ENDCASE.

入力値が 20240229 ならうるう日のため有効です。20230229 に変更すると、暦上存在しない日付として処理されます。sy-subrc は汎用モジュールの直後に判定してください。後続の処理によって値が変わる可能性があります。

判定前に確認したい入力例

  • 20240229:有効。2024年はうるう年です。
  • 20230229:不正。2023年の2月は28日までです。
  • 20240431:不正。4月は30日までです。
  • 00000000:未設定値として、業務上の必須・任意に応じて先に扱いを決めます。
  • 2024/02/29:そのままでは YYYYMMDD の8桁形式ではありません。書式を変換してから日付チェックを行います。

実務での使い分けと注意点

選択画面の TYPE d の日付項目では、SAP標準の入力チェックが働きます。一方、ファイルや外部インターフェースから受け取る文字列には、その画面チェックは働きません。自分のプログラムで YYYYMMDD の形式、初期値、暦上の妥当性を順に確認します。入力が任意なら初期値を許容するかを仕様で決め、必須ならエラーとして扱います。

複数行の取込処理では、不正日付の行番号と元の入力値をエラーログに残すと修正しやすくなります。曜日や月末日を計算する処理は、日付チェックに通った値に対して実行してください。

CDS・ABAP SQLで判定したい場合

この汎用モジュールはABAPプログラム内で使う例です。CDSやABAP SQLの式で日付を判定する要件では、対応する環境なら日付関数 DATS_IS_VALID も選択肢になります。こちらは有効な日付に 1、無効な日付に 0 を返す関数で、DATE_CHECK_PLAUSIBILITY の sy-subrc とは判定方法が異なります。使用可能なリリースと実行場所を確認して使い分けてください。

まとめ

DATE_CHECK_PLAUSIBILITY は、日付型の値が暦上存在するかを確認する汎用モジュールです。外部入力では、書式・初期値を先に確認し、呼び出し直後の sy-subrc で結果を分岐させましょう。

参考・関連記事

関連記事

PAGE TOP