ABAP 特殊字符的过滤、日期格式检查(自定义函数)

简介:
针对模板上传、接口的数据,进行特殊字符的过滤
日期格式检查:YYYYMMDD、YYYY-MM-DD、YYYY.MM.DD、YYYY/MM/DD;
时间格式检查:HHMMSS或HH:MM:SS;
数字的检查

FUNCTION Z_DATA_FILTERING.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_STRING) TYPE  STRING
*"     VALUE(DATATYPE) TYPE  INTTYPE DEFAULT 'C'
*"     VALUE(LOWER) TYPE  CHAR01 OPTIONAL
*"  EXPORTING
*"     VALUE(E_STRING) TYPE  STRING
*"     VALUE(E_MESSAGE) TYPE  BAPI_MSG
*"----------------------------------------------------------------------
  DATA L_ENTERCHAR TYPE C.
  DATA OREF TYPE REF TO CX_ROOT.
  DATA: T_DATE      LIKE SY-DATUM,
        T_TIME      LIKE SY-UZEIT,
        T_YEAR(04),
        T_MONTH(02),
        T_DAY(02),
        T_HH(2),
        T_MM(2),
        T_SS(2).
  DATA: T_HTYPE LIKE  DD01V-DATATYPE.
*----------------宏定义
  DEFINE M_ALPHA.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = &1
      IMPORTING
        OUTPUT = &2.
  END-OF-DEFINITION.

  DEFINE M_MATN1.
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        INPUT        = &1
      IMPORTING
        OUTPUT       = &2
      EXCEPTIONS
        LENGTH_ERROR = 1
        OTHERS       = 2.
  END-OF-DEFINITION.

  CLEAR E_MESSAGE.
  E_STRING = I_STRING.
  CONDENSE E_STRING.
  IF DATATYPE IS INITIAL.
    DATATYPE = 'C'."默认字符型
  ENDIF.
  "去除回车符和换行符
  CLEAR L_ENTERCHAR.
  L_ENTERCHAR = CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB." — 09    TAB符
  REPLACE L_ENTERCHAR IN E_STRING WITH ''.
  IF SY-SUBRC = 0.
    DO.
      REPLACE L_ENTERCHAR IN E_STRING WITH ''.
      IF SY-SUBRC <> 0.
        EXIT.
      ENDIF.
    ENDDO.
  ENDIF.

  L_ENTERCHAR = CL_ABAP_CHAR_UTILITIES=>CR_LF."0D0A    回车换行
  REPLACE L_ENTERCHAR IN E_STRING WITH ''.
  IF SY-SUBRC = 0.
    DO.
      REPLACE L_ENTERCHAR IN E_STRING WITH ''.
      IF SY-SUBRC <> 0.
        EXIT.
      ENDIF.
    ENDDO.
  ENDIF.

  L_ENTERCHAR = CL_ABAP_CHAR_UTILITIES=>VERTICAL_TAB."0B    垂直制表符
  REPLACE L_ENTERCHAR IN E_STRING WITH ''.
  IF SY-SUBRC = 0.
    DO.
      REPLACE L_ENTERCHAR IN E_STRING WITH ''.
      IF SY-SUBRC <> 0.
        EXIT.
      ENDIF.
    ENDDO.
  ENDIF.

  L_ENTERCHAR = CL_ABAP_CHAR_UTILITIES=>NEWLINE."0A    换行
  REPLACE L_ENTERCHAR IN E_STRING WITH ''.
  IF SY-SUBRC = 0.
    DO.
      REPLACE L_ENTERCHAR IN E_STRING WITH ''.
      IF SY-SUBRC <> 0.
        EXIT.
      ENDIF.
    ENDDO.
  ENDIF.

  L_ENTERCHAR = CL_ABAP_CHAR_UTILITIES=>FORM_FEED."0C    换页
  REPLACE L_ENTERCHAR IN E_STRING WITH ''.
  IF SY-SUBRC = 0.
    DO.
      REPLACE L_ENTERCHAR IN E_STRING WITH ''.
      IF SY-SUBRC <> 0.
        EXIT.
      ENDIF.
    ENDDO.
  ENDIF.

  L_ENTERCHAR = CL_ABAP_CHAR_UTILITIES=>BACKSPACE."08    退格符
  REPLACE L_ENTERCHAR IN E_STRING WITH ''.
  IF SY-SUBRC = 0.
    DO.
      REPLACE L_ENTERCHAR IN E_STRING WITH ''.
      IF SY-SUBRC <> 0.
        EXIT.
      ENDIF.
    ENDDO.
  ENDIF.


  L_ENTERCHAR = CL_ABAP_CHAR_UTILITIES=>CR_LF.
  REPLACE L_ENTERCHAR IN E_STRING WITH ''.
  IF SY-SUBRC = 0.
    "如果存在换行符号则内表此单元格数据会多出一对双引号
    DO.
      REPLACE '"' WITH '' INTO E_STRING.
      IF SY-SUBRC <> 0.
        EXIT.
      ENDIF.
    ENDDO.
  ENDIF.
  CLEAR L_ENTERCHAR.
  L_ENTERCHAR = CL_ABAP_CHAR_UTILITIES=>CR_LF(1).
  REPLACE L_ENTERCHAR IN E_STRING WITH ''.
  IF SY-SUBRC = 0.
    "如果存在换行符号则内表此单元格数据会多出一对双引号
    DO.
      REPLACE '"' WITH '' INTO E_STRING.
      IF SY-SUBRC <> 0.
        EXIT.
      ENDIF.
    ENDDO.
  ENDIF.
  "去除EXCEL上传的回车符无换行符
  CLEAR L_ENTERCHAR.
  L_ENTERCHAR = CL_ABAP_CHAR_UTILITIES=>CR_LF+1(1).
  REPLACE L_ENTERCHAR IN E_STRING WITH ''.
  IF SY-SUBRC = 0.
    "如果存在换行符号则内表此单元格数据会多出一对双引号
    DO.
      REPLACE '"' WITH '' INTO E_STRING.
      IF SY-SUBRC <> 0.
        EXIT.
      ENDIF.
    ENDDO.
  ENDIF.

  CASE DATATYPE.
    WHEN 'C'."替换特殊字符# !为全角,去除回车符,去除左右空格
      DO.
        REPLACE '#' WITH '#' INTO E_STRING.
        IF SY-SUBRC <> 0.
          EXIT.
        ENDIF.
      ENDDO.
      DO.
        REPLACE '!' WITH '!' INTO E_STRING.
        IF SY-SUBRC <> 0.
          EXIT.
        ENDIF.
      ENDDO.
      DO.
        REPLACE '&' WITH '&' INTO E_STRING.
        IF SY-SUBRC <> 0.
          EXIT.
        ENDIF.
      ENDDO.
      DO.
        REPLACE ':' WITH ':' INTO E_STRING.
        IF SY-SUBRC <> 0.
          EXIT.
        ENDIF.
      ENDDO.
      IF LOWER IS INITIAL.
        TRANSLATE E_STRING TO UPPER CASE.
      ENDIF.
    WHEN 'D'."日期检查并转成YYYYMMDD
      CLEAR:T_YEAR,T_MONTH,T_DAY.
      SPLIT E_STRING AT '-' INTO T_YEAR T_MONTH T_DAY.
      IF T_YEAR IS INITIAL OR T_MONTH IS INITIAL OR T_DAY IS INITIAL.
        SPLIT E_STRING AT '.' INTO T_YEAR T_MONTH T_DAY.
        IF T_YEAR IS INITIAL OR T_MONTH IS INITIAL OR T_DAY IS INITIAL.
          SPLIT E_STRING AT '/' INTO T_YEAR T_MONTH T_DAY.
          IF T_YEAR IS INITIAL OR T_MONTH IS INITIAL OR T_DAY IS INITIAL.
            IF STRLEN( E_STRING ) = 8.
              T_YEAR = E_STRING(4).
              T_MONTH = E_STRING+4(2).
              T_DAY = E_STRING+6(2).
            ELSE.
              CLEAR E_MESSAGE.
              CONCATENATE '当前值: ' E_STRING ' 日期格式错误,必须是YYYYMMDD、YYYY-MM-DD、YYYY.MM.DD、YYYY/MM/DD' INTO E_MESSAGE.
              CLEAR E_STRING.
              RETURN.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
      M_ALPHA T_YEAR T_YEAR.
      M_ALPHA T_MONTH T_MONTH.
      M_ALPHA T_DAY T_DAY.
      CONCATENATE T_YEAR T_MONTH T_DAY INTO T_DATE.
      TRY.
          CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
            EXPORTING
              DATE                      = T_DATE
            EXCEPTIONS
              PLAUSIBILITY_CHECK_FAILED = 1
              OTHERS                    = 2.
          IF SY-SUBRC = 0.
            E_STRING = T_DATE.
          ELSE.
            CLEAR E_MESSAGE.
            CONCATENATE '当前值: ' E_STRING ' 日期格式错误,必须是YYYYMMDD、YYYY-MM-DD、YYYY.MM.DD、YYYY/MM/DD' INTO E_MESSAGE.
            CLEAR E_STRING.
            RETURN.
          ENDIF.
        CATCH CX_SY_DYN_CALL_ILLEGAL_TYPE INTO OREF.
          CLEAR E_MESSAGE.
          CONCATENATE '当前值: ' E_STRING ' 日期格式错误,必须是YYYYMMDD、YYYY-MM-DD、YYYY.MM.DD、YYYY/MM/DD' INTO E_MESSAGE.
          CLEAR E_STRING.
          RETURN.
      ENDTRY.
    WHEN 'T'."时间检查并转换为HHMMSS
      CLEAR:T_HH,T_MM,T_SS.
      SPLIT E_STRING AT ':' INTO T_HH T_MM T_SS.
      IF T_HH IS INITIAL OR T_MM IS INITIAL OR T_SS IS INITIAL.
        IF STRLEN( E_STRING ) = 6.
          T_HH = E_STRING(2).
          T_MM = E_STRING+2(2).
          T_SS = E_STRING+4(2).
        ELSE.
          CLEAR E_MESSAGE.
          CONCATENATE '当前值: ' E_STRING ' 时间格式错误,格式为HH:MM:SS' INTO E_MESSAGE.
          CLEAR E_STRING.
          RETURN.
        ENDIF.
      ENDIF.
      M_ALPHA T_HH T_HH.
      M_ALPHA T_MM T_MM.
      M_ALPHA T_SS T_SS.
      CONCATENATE T_HH T_MM T_SS INTO T_TIME.
      TRY.
          CALL FUNCTION 'TIME_CHECK_PLAUSIBILITY'
            EXPORTING
              TIME                      = T_TIME
            EXCEPTIONS
              PLAUSIBILITY_CHECK_FAILED = 1
              OTHERS                    = 2.
          IF SY-SUBRC = 0.
            E_STRING = T_TIME.
          ELSE.
            CLEAR E_MESSAGE.
            CONCATENATE '当前值: ' E_STRING ' 时间格式错误,格式应为HHMMSS或HH:MM:SS' INTO E_MESSAGE.
            CLEAR E_STRING.
            RETURN.
          ENDIF.
        CATCH CX_SY_DYN_CALL_ILLEGAL_TYPE INTO OREF.
          CLEAR E_MESSAGE.
          CONCATENATE '当前值: ' E_STRING ' 时间格式错误,格式应为HHMMSS或HH:MM:SS' INTO E_MESSAGE.
          CLEAR E_STRING.
          RETURN.
      ENDTRY.
    WHEN 'P' OR 'F'."金额过滤逗号
      DO.
        REPLACE ',' WITH '' INTO E_STRING.
        IF SY-SUBRC <> 0.
          EXIT.
        ENDIF.
      ENDDO.
      CONDENSE E_STRING NO-GAPS.
      IF CL_ABAP_MATCHER=>MATCHES(
          PATTERN = '^(-?[1-9]\d*(\.\d*[0-9])?)|(-?0\.\d*[0-9])|0$'
          TEXT = E_STRING ) = ABAP_FALSE.
        CLEAR E_MESSAGE.
        CONCATENATE '当前值: ' E_STRING ' 非数值字段' INTO E_MESSAGE.
        CLEAR E_STRING.
        RETURN.
      ENDIF.
    WHEN 'I'.
      DO.
        REPLACE ',' WITH '' INTO E_STRING.
        IF SY-SUBRC <> 0.
          EXIT.
        ENDIF.
      ENDDO.
      CONDENSE E_STRING NO-GAPS.
      IF CL_ABAP_MATCHER=>MATCHES(
          PATTERN = '^-?[1-9]\d*|0|[1-9]\d*-?$'
          TEXT = E_STRING ) = ABAP_FALSE.
        CLEAR E_MESSAGE.
        CONCATENATE '当前值: ' E_STRING ' 非整数字段' INTO E_MESSAGE.
        CLEAR E_STRING.
        RETURN.
      ENDIF.
    WHEN 'N'.
*      TRY.
      "此函数不能校验P类型
      CALL FUNCTION 'NUMERIC_CHECK'
        EXPORTING
          STRING_IN = E_STRING
        IMPORTING
          HTYPE     = T_HTYPE.
      IF T_HTYPE <> 'NUMC'.
        CLEAR E_MESSAGE.
        CONCATENATE '当前值: ' E_STRING ' 非数值字段' INTO E_MESSAGE.
        CLEAR E_STRING.
        RETURN.
      ENDIF.
*        CATCH UC_OBJECTS_NOT_CHARLIKE INTO OREF.
*          E_MESSAGE = '非数值字段'.
*          CLEAR E_STRING.
*          RETURN.
*     ENDTRY.
    WHEN OTHERS.
      "E_MESSAGE = '此类型暂不支持'.
  ENDCASE.
ENDFUNCTION.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值