FUNCTION ZTEST_XIAOY_CHECKTF.*"----------------------------------------------------------------------*"*"本地接口:*" IMPORTING*" REFERENCE(IV_TABNAME) TYPE TABNAME*" TABLES*" IT_DATA*" ET_MESSAGE STRUCTURE ZSHR_MESSAGE*"----------------------------------------------------------------------DATA: dyn_table TYPE REF TO data, ”gs_display type ref to data, lo_descr type ref to cl_abap_structdescr, lt_fields type ddfields, lv_zz type string, ls_fields like line of lt_fields, ls_message type zshr_message, lv_text type string, lv_line type char20, dyn_wa TYPE REF TO data.FIELD-SYMBOLS: <dyn_table> TYPE table, <dyn_wa> TYPE ANY.*IV_TABNAME 是咱们excel se11定义的构造或者表CREATE DATA dyn_table TYPE TABLE OF (IV_TABNAME).ASSIGN dyn_table->* TO <dyn_table>.CREATE DATA dyn_wa LIKE LINE OF <dyn_table>.ASSIGN dyn_wa->* TO <dyn_wa>.*<dyn_table> = IT_DATA[].ASSIGN IT_DATA[] to <dyn_table>.*上面是获取构造字段属性 当然有个简略的方法,间接从dd03l读取就行lo_descr ?= cl_abap_typedescr=>describe_by_data( <dyn_wa> ).lt_fields = lo_descr->get_ddic_field_list( p_langu = 'E' p_including_substructres = abap_true ).*sort lt_fields by tabname fieldname.loop at <dyn_table> ASSIGNING <dyn_wa>. lv_line = sy-tabix. CONDENSE lv_line. loop at lt_fields into ls_fields. ASSIGN COMPONENT ls_fields-fieldname of STRUCTURE <dyn_wa> to FIELD-SYMBOL(<field>). if <field> is ASSIGNED. case ls_fields-inttype. when 'D'. if <field> is not initial. replace all occurrences of '\' in lv_text with space. replace all occurrences of '-' in lv_text with space. replace all occurrences of '/' in lv_text with space. condense: lv_text no-gaps. lv_text = <field> . lv_zz = '^(?:(?:(?:(?:(?:1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:0229))|' && '(?:(?:(?:1[6-9]|[2-9]\d)\d{2})(?:(?:(?:0[13578]|1[02])31)|(?:(?:0[13-9]|1[0-2])(?:29|30))|(?:(?:0[1-9])|(?:1[0-2]))(' && '?:0[1-9]|1\d|2[0-8]))))$'. if cl_abap_matcher=>matches( pattern = lv_zz text = lv_text ) ne abap_true. ls_message-msgty = 'E'. concatenate 'Excel第' lv_line '字段' ls_fields-fieldname '数据不是日期格局YYYYMMDD' into ls_message-msgtx SEPARATED BY space. append ls_message to ET_MESSAGE. “exit . clear:ls_message. endif. <field> = lv_text. endif. when 'N' or 'I' . if <field> is not initial. lv_text = <field> . replace all occurrences of ',' in lv_text with space. condense: lv_text no-gaps. if cl_abap_matcher=>matches( pattern = '-?[0-9]\d*' text = lv_text ) ne abap_true. ls_MESSAGE-msgty = 'E'.* concatenate ls_fields-fieldname '数据不是整数类型的' into ls_MESSAGE-msgtx. concatenate 'Excel第' lv_line '字段' ls_fields-fieldname '数据不是整数类型的' into ls_message-msgtx SEPARATED BY space. append ls_MESSAGE to ET_MESSAGE. ”exit . clear:ls_MESSAGE. endif. <field> = lv_text. endif. when 'P'. if <field> is not initial. lv_text = <field> . replace all occurrences of ',' in lv_text with space. condense: lv_text no-gaps. if cl_abap_matcher=>matches(* pattern = '^(([1-9]\d*)(\.\d{1,2})?)$|^(0\.0?([1-9]\d?))$' pattern = '^[0-9]+.?[0-9]*$'"肖勇更改正则表达式 20190422 text = lv_text ) ne abap_true. ls_message-msgty = 'E'.* concatenate ls_ztehrdt02-fielc '数据不是数字类型的' into ls_message-msgtx. concatenate 'Excel第' lv_line '字段' ls_fields-fieldname '数据不是数字类型的' into ls_message-msgtx SEPARATED BY space. append ls_message to et_message. “ exit . clear:ls_message. endif. <field> = lv_text. endif. when 'C'.* clear:len. data(len) = strlen( <field> )."先判断长度 if len > ls_fields-leng. ls_message-msgty = 'E'.* concatenate ls_ztehrdt02-fielc '数据长度过长' into ls_message-msgtx. concatenate 'Excel第' lv_line '字段' ls_fields-fieldname '数据长度过长' into ls_message-msgtx SEPARATED BY space. append ls_message to ET_MESSAGE.clear:ls_message. endif. clear:len. endcase. endif. endloop.ENDLOOP.ENDFUNCTION.
测试用的小段代码
select * into CORRESPONDING FIELDS OF TABLE lt_mara from mara UP TO 10 ROWS.
CALL FUNCTION 'ZTEST_XIAOY_CHECKTF' EXPORTING IV_TABNAME = 'MARA' TABLES IT_DATA = lt_mara[] ET_MESSAGE = ET_MESSAGE.咱们在debug的时候能够扭转 lt_mara外面的值来验证代码。