ABAP根据SU3设置参数格式化日期

191 阅读1分钟

需求:根据SU3设置的参数将任意格式的日期重新转换成年月日8位字符串

1.在事务代码SU01或者SU3中查看设置的Date Format参数如下图:

image.png

2.此设置参数会存在于透明表USR01中如下图:

image.png

3.点开字段DATFM的搜索帮助如下图:

image.png

4.或者在事务代码SE11中查看Domain XUDATFM的值如下图:

image.png

5.比较麻烦的实现方式:

image.png

    "从表USR01取得DATFM的参数值
    SELECT SINGLE datfm
      INTO @DATA(lv_format)
      FROM usr01
     WHERE bname = @sy-uname.
    IF sy-subrc = 0.
      "从DD07T中取得该参数值的描述
      SELECT SINGLE ddtext
        INTO @DATA(lv_ddtext)
        FROM dd07t
       WHERE domname = @lc_xudatfm
         AND ddlanguage = @sy-langu
         AND domvalue_l = @lv_format.
      IF sy-subrc = 0.
        "根据是否是Japan格式日期来取描述中的字符串
        IF lv_ddtext+0(1) = lc_gflag.
          DATA(lv_format_jap) = lv_ddtext+0(9).
        ELSE.
          DATA(lv_format_text) = lv_ddtext+0(10).
        ENDIF.
        "获取年月日对应的字符串的起始位置
        IF lv_format_text IS NOT INITIAL.
          FIND lc_year IN lv_format_text MATCH OFFSET lv_year_pos.
        ELSE.
          FIND lc_gyear IN lv_format_text MATCH OFFSET lv_year_pos.
        ENDIF.
        FIND lc_month IN lv_format_text MATCH OFFSET DATA(lv_month_pos).
        FIND lc_day   IN lv_format_text MATCH OFFSET DATA(lv_day_pos).
        "截取年月日字符串并重新拼接至目标日期字段
        READ TABLE rs_variant_content_expanded-toitems ASSIGNING FIELD-SYMBOL(<ls_datub>)
                                                       WITH KEY selname = lc_datub.
        IF sy-subrc = 0.
          DATA(lv_datub) = <ls_datub>-low.
          <ls_datub>-low = lv_datub+lv_year_pos(4) && lv_datub+lv_month_pos(2) && lv_datub+lv_day_pos(2).
        ENDIF.
        READ TABLE rs_variant_content_expanded-toitems ASSIGNING FIELD-SYMBOL(<ls_datuv>)
                                                       WITH KEY selname = lc_datuv.
        IF sy-subrc = 0.
          DATA(lv_datuv) = <ls_datuv>-low.
          <ls_datuv>-low = lv_datuv+lv_year_pos(4) && lv_datub+lv_month_pos(2) && lv_datub+lv_day_pos(2).
        ENDIF.
      ENDIF.
    ENDIF.

6.比较简单的实现方式:

image.png

6.1 通过Class CL_ABAP_DATFM中的method CONV_DATE_INT_TO_EXT实现
6.2 CONV_DATE_EXT_TO_INT可以实现外部日期到内部日期的实现