简介:
针对模板上传、接口的数据,进行特殊字符的过滤;
日期格式检查: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.
2916

被折叠的 条评论
为什么被折叠?



