可直接运行
延申,获取表结构的字段名、字段类型、字段长度、字段描述还可以通过'NAMETAB_GET'获取:
*取出表结构的字段目录
CALL FUNCTION 'NAMETAB_GET'
EXPORTING
langu = sy-langu
tabname = p_name
TABLES
nametab = lt_table
EXCEPTIONS
no_texts_found = 1.
效果展示:
*注意:
1.传入传出参数中,包含结构的,未取数,后续需自己优化,根据结构名直接从表 dd03l 取数即可
2.没有CONVERSION_EXIT_QTYCH_OUTPUT的,把下面红色框框的去掉,程序可直接使用
参考代码:
主:
REPORT zit0002. INCLUDE zit0002_head. INCLUDE zit0002_screen. INCLUDE zit0002_form. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_name. PERFORM frm_f4_search. START-OF-SELECTION. PERFORM frm_get_data. END-OF-SELECTION. PERFORM f_display_data.
包含文件 ZIT0002_HEAD:
*&---------------------------------------------------------------------* *& 包含 ZIT0002_HEAD *&---------------------------------------------------------------------* DATA: header_gd TYPE header_fb, tables_gd TYPE rsfb_para WITH HEADER LINE, import_gd TYPE rsfb_para WITH HEADER LINE, export_gd TYPE rsfb_para WITH HEADER LINE, change_gd TYPE rsfb_para WITH HEADER LINE, pname_gd TYPE tfdir-pname. TYPES: BEGIN OF sy_output, funcname TYPE tftit-funcname, "函数名 stext TYPE tftit-stext, "函数描述 fnamein TYPE fupararef-structure, "输入字段 stextin TYPE funct-stext, "输入字段描述 dtypein TYPE dd03l-datatype, "输入字段类型 lengin TYPE dd03l-leng, "输入字段长度 decimin TYPE dd03l-decimals, "输入字段小数位 fnameout TYPE fupararef-structure, "输出字段 stextout TYPE funct-stext, "输出字段描述 dtypeout TYPE dd03l-datatype, "输出字段类型 lengout TYPE dd03l-leng, "输出字段长度 decimout TYPE dd03l-decimals, "输出字段小数位 fnamet TYPE fupararef-structure, "表名 stextt TYPE funct-stext, fnametp TYPE fupararef-structure, "表字段 ddtexttp TYPE dd04t-ddtext, "表字段描述 dtypetp TYPE dd03l-datatype, "表字段类型 lengtp TYPE dd03l-leng, "表字段长度 decimtp TYPE dd03l-decimals, "表字段小数位 slbox, END OF sy_output. DATA: gt_output TYPE TABLE OF sy_output, gs_output TYPE sy_output. DATA: gs_layout TYPE lvc_s_layo, gt_fieldcat TYPE lvc_t_fcat.
包含文件 ZIT0002_SCREEN:
PARAMETERS: p_name TYPE header_fb-name OBLIGATORY.
包含文件 ZIT0002_FORM:
*&---------------------------------------------------------------------* *& 包含 ZIT0002_FORM *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form FRM_F4_SEARCH *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_f4_search . DATA lt_return LIKE TABLE OF ddshretval. SELECT * INTO TABLE @DATA(lt_tftit) FROM tftit WHERE spras EQ @sy-langu AND funcname LIKE 'Z%'. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING * DDIC_STRUCTURE = retfield = 'FUNCNAME' "返回的字段 * PVALKEY = ' ' dynpprog = sy-repid "程序名 dynpnr = sy-dynnr "屏幕号 dynprofield = 'p_name' * STEPL = 0 window_title = '函数名' * VALUE = ' ' value_org = 'S' * MULTIPLE_CHOICE = ' ' * DISPLAY = ' ' * CALLBACK_PROGRAM = ' ' * CALLBACK_FORM = ' ' * CALLBACK_METHOD = * MARK_TAB = * IMPORTING * USER_RESET = TABLES value_tab = lt_tftit * FIELD_TAB = return_tab = lt_return * DYNPFLD_MAPPING = EXCEPTIONS parameter_error = 1 no_values_found = 2 OTHERS = 3. IF sy-subrc <> 0. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_GET_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_get_data . DATA: lt_dd03lt LIKE TABLE OF dd03l, ls_dd03lt LIKE dd03l, lt_dd03li LIKE TABLE OF dd03l, ls_dd03li LIKE dd03l, lt_dd03le LIKE TABLE OF dd03l, ls_dd03le LIKE dd03l, lt_dd04li LIKE TABLE OF dd04l, ls_dd04li LIKE dd04l, lt_dd04le LIKE TABLE OF dd04l, ls_dd04le LIKE dd04l. DATA: desc_struc TYPE REF TO cl_abap_structdescr, git_fields TYPE ddfields. FIELD-SYMBOLS: <gfs_component> TYPE dfies. *注意,传入传出参数中,包含结构的,未取数,后续可以优化,根据结构名直接从表 dd03l 取数即可 * 注释的方法也能找到函数的参数,这里从表 FUPARAREF 查找 *相关表参考 tlibt trdir funct DD04T * header_gd-name = p_name ."函数名 * * SELECT SINGLE pname INTO pname_gd FROM tfdir * WHERE funcname = header_gd-name. * CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT' * EXPORTING * program = pname_gd * IMPORTING * group = header_gd-area * namespace = header_gd-namespace * EXCEPTIONS * othe = 12. * IF sy-subrc = 0. * CONCATENATE header_gd-namespace header_gd-area * INTO header_gd-area. * CALL METHOD cl_fb_parameter_db=>read * IMPORTING * tables = tables_gd[] * import = import_gd[] * export = export_gd[] * change = change_gd[] * CHANGING * header = header_gd. * ENDIF. * IF tables_gd[] IS NOT INITIAL. * ENDIF. * BREAK-POINT. **函数名称 SELECT * INTO TABLE @DATA(lt_tftit) FROM tftit WHERE spras EQ @sy-langu AND funcname EQ @p_name. **函数参数及其参考 SELECT * INTO TABLE @DATA(lt_fupararef) FROM fupararef WHERE funcname EQ @p_name. LOOP AT lt_fupararef INTO DATA(ls_fupararef). CASE ls_fupararef-paramtype. WHEN 'I'. IF ls_fupararef-structure CA '-'. SPLIT ls_fupararef-structure AT '-' INTO ls_dd03li-tabname ls_dd03li-fieldname. APPEND ls_dd03li TO lt_dd03li. CLEAR ls_dd03li. ELSE. ls_dd04li-rollname = ls_fupararef-structure. APPEND ls_dd04li TO lt_dd04li. CLEAR ls_dd04li. ENDIF. WHEN 'E'. IF ls_fupararef-structure CA '-'. SPLIT ls_fupararef-structure AT '-' INTO ls_dd03le-tabname ls_dd03le-fieldname. APPEND ls_dd03le TO lt_dd03le. CLEAR ls_dd03le. ELSE. ls_dd04le-rollname = ls_fupararef-structure. APPEND ls_dd04le TO lt_dd04le. CLEAR ls_dd04le. ENDIF. WHEN 'T'. ls_dd03lt-tabname = ls_fupararef-structure. APPEND ls_dd03lt TO lt_dd03lt. CLEAR ls_dd03lt. WHEN OTHERS. ENDCASE. CLEAR ls_fupararef. ENDLOOP. IF lt_dd04li[] IS NOT INITIAL. SELECT * INTO TABLE @DATA(lt_dd04l) FROM dd04l FOR ALL ENTRIES IN @lt_dd04li WHERE rollname EQ @lt_dd04li-rollname. ENDIF. IF lt_dd04le[] IS NOT INITIAL. SELECT * INTO TABLE @DATA(lt_dd04l2) FROM dd04l FOR ALL ENTRIES IN @lt_dd04le WHERE rollname EQ @lt_dd04le-rollname. ENDIF. IF lt_dd03li[] IS NOT INITIAL. "table SELECT * INTO TABLE @DATA(lt_dd03l) FROM dd03l FOR ALL ENTRIES IN @lt_dd03li WHERE tabname EQ @lt_dd03li-tabname AND fieldname EQ @lt_dd03li-fieldname. ENDIF. IF lt_dd03le[] IS NOT INITIAL. SELECT * INTO TABLE @DATA(lt_dd03l2) FROM dd03l FOR ALL ENTRIES IN @lt_dd03le WHERE tabname EQ @lt_dd03le-tabname AND fieldname EQ @lt_dd03le-fieldname. ENDIF. IF lt_dd03lt[] IS NOT INITIAL. SELECT * INTO TABLE @DATA(lt_dd03l3) FROM dd03l FOR ALL ENTRIES IN @lt_dd03lt WHERE tabname EQ @lt_dd03lt-tabname. SELECT * INTO TABLE @DATA(lt_dd03t) FROM dd03t FOR ALL ENTRIES IN @lt_dd03lt WHERE tabname EQ @lt_dd03lt-tabname AND ddlanguage EQ @sy-langu. IF lt_dd03l3[] IS NOT INITIAL. SELECT * INTO TABLE @DATA(lt_dd04t) FROM dd04t FOR ALL ENTRIES IN @lt_dd03l3 WHERE rollname EQ @lt_dd03l3-rollname AND ddlanguage EQ @sy-langu. ENDIF. ENDIF. SELECT * INTO TABLE @DATA(lt_funct) FROM funct WHERE funcname EQ @p_name. * SORT lt_fupararef[] BY funcname paramtype. DATA: lv_tabix_i TYPE sy-tabix, lv_tabix_i2 TYPE sy-tabix, lv_tabix_i3 TYPE sy-tabix, lv_tabix_e TYPE sy-tabix, lv_tabix_e2 TYPE sy-tabix, lv_tabix_e3 TYPE sy-tabix, lv_tabix_t TYPE sy-tabix, lv_num TYPE sy-tabix, lv_num2 TYPE sy-tabix, lv_tabixtt TYPE sy-tabix. **获取最大行数 DESCRIBE TABLE lt_dd03li LINES lv_tabix_i2. DESCRIBE TABLE lt_dd04li LINES lv_tabix_i3. DESCRIBE TABLE lt_dd03l2 LINES lv_tabix_e2. DESCRIBE TABLE lt_dd04l2 LINES lv_tabix_e3. DESCRIBE TABLE lt_dd03l3 LINES lv_tabix_t. lv_tabix_i = lv_tabix_i2 + lv_tabix_i3. lv_tabix_e = lv_tabix_e2 + lv_tabix_e3. IF lv_tabix_i GE lv_tabix_e. lv_num = lv_tabix_i. ELSE. lv_num = lv_tabix_e. ENDIF. IF lv_num LT lv_tabix_t. lv_num = lv_tabix_t. ENDIF. * BREAK-POINT. DATA ls_funct LIKE funct. * LOOP AT lt_fupararef ASSIGNING FIELD-SYMBOL(<ls_fu>). * CONDENSE <ls_fu>-structure NO-GAPS. * ENDLOOP. DO lv_num TIMES. lv_num2 = lv_num2 + 1. READ TABLE lt_tftit INTO DATA(ls_tftit) INDEX 1. IF sy-subrc EQ 0. gs_output-funcname = ls_tftit-funcname. gs_output-stext = ls_tftit-stext. ENDIF. ** 输入参数 I READ TABLE lt_dd03li INTO DATA(ls_dd03li2) INDEX lv_num2. READ TABLE lt_dd03l INTO DATA(ls_dd03l) WITH KEY tabname = ls_dd03li2-tabname fieldname = ls_dd03li2-fieldname. IF sy-subrc EQ 0. gs_output-fnamein = |{ ls_dd03l-tabname }-{ ls_dd03l-fieldname }|. gs_output-dtypein = ls_dd03l-datatype. gs_output-lengin = ls_dd03l-leng. gs_output-decimin = ls_dd03l-decimals. ELSE. READ TABLE lt_dd04li INTO DATA(ls_dd04li2) INDEX lv_num2. READ TABLE lt_dd04l INTO DATA(ls_dd04l) WITH KEY rollname = ls_dd04li2-rollname. IF sy-subrc EQ 0. gs_output-fnamein = ls_dd04l-rollname. gs_output-dtypein = ls_dd04l-datatype. gs_output-lengin = ls_dd04l-leng. gs_output-decimin = ls_dd04l-decimals. * DELETE lt_dd04li INDEX 1. ENDIF. ENDIF. CLEAR: ls_dd03li2,ls_dd03l,ls_dd04li2,ls_dd04l. * CONDENSE gs_output-fnamein NO-GAPS. READ TABLE lt_fupararef INTO ls_fupararef WITH KEY structure = gs_output-fnamein paramtype = 'I'. IF sy-subrc EQ 0. lv_tabixtt = sy-tabix. gs_output-fnamein = ls_fupararef-parameter. READ TABLE lt_funct INTO ls_funct WITH KEY parameter = gs_output-fnamein. IF sy-subrc EQ 0. gs_output-stextin = ls_funct-stext. ENDIF. DELETE lt_fupararef[] INDEX lv_tabixtt. ENDIF. **输出参数 E READ TABLE lt_dd03le INTO DATA(ls_dd03l2e) INDEX lv_num2. READ TABLE lt_dd03l2 INTO DATA(ls_dd03l2) WITH KEY tabname = ls_dd03l2e-tabname fieldname = ls_dd03l2e-fieldname. IF sy-subrc EQ 0. gs_output-fnameout = |{ ls_dd03l2-tabname }-{ ls_dd03l2-fieldname }|. gs_output-dtypeout = ls_dd03l2-datatype. gs_output-lengout = ls_dd03l2-leng. gs_output-decimout = ls_dd03l2-decimals. ELSE. READ TABLE lt_dd04le INTO DATA(ls_dd04l2e) INDEX lv_num2. READ TABLE lt_dd04l2 INTO DATA(ls_dd04l2) WITH KEY rollname = ls_dd04l2e-rollname. IF sy-subrc EQ 0. gs_output-fnameout = ls_dd04l2-rollname. gs_output-dtypeout = ls_dd04l2-datatype. gs_output-lengout = ls_dd04l2-leng. gs_output-decimout = ls_dd04l2-decimals. * DELETE lt_dd04l2 INDEX 1. ENDIF. ENDIF. CLEAR: ls_dd03l2e,ls_dd03l2,ls_dd04l2e,ls_dd04l2. READ TABLE lt_fupararef INTO ls_fupararef WITH KEY structure = gs_output-fnameout paramtype = 'E'. IF sy-subrc EQ 0. lv_tabixtt = sy-tabix. gs_output-fnameout = ls_fupararef-parameter. READ TABLE lt_funct INTO ls_funct WITH KEY parameter = gs_output-fnameout. IF sy-subrc EQ 0. gs_output-stextout = ls_funct-stext. ENDIF. DELETE lt_fupararef[] INDEX lv_tabixtt. ENDIF. **表格参数 T READ TABLE lt_dd03l3 INTO DATA(ls_dd03l3) INDEX lv_num2. IF sy-subrc = 0. gs_output-fnamet = ls_dd03l3-tabname. gs_output-fnametp = ls_dd03l3-fieldname. gs_output-dtypetp = ls_dd03l3-datatype. gs_output-lengtp = ls_dd03l3-leng. gs_output-decimtp = ls_dd03l3-decimals. ENDIF. READ TABLE lt_dd04t INTO DATA(ls_dd04t) WITH KEY rollname = ls_dd03l3-rollname. IF sy-subrc EQ 0. gs_output-ddtexttp = ls_dd04t-ddtext. ELSE. READ TABLE lt_dd03t INTO DATA(ls_dd03t) WITH KEY tabname = gs_output-fnamet fieldname = gs_output-fnametp. IF sy-subrc EQ 0. gs_output-ddtexttp = ls_dd03t-ddtext. ENDIF. ENDIF. CLEAR ls_dd03l3. READ TABLE lt_fupararef INTO ls_fupararef WITH KEY structure = gs_output-fnamet. * parameter = 'T'. IF sy-subrc EQ 0. gs_output-fnamet = ls_fupararef-parameter. READ TABLE lt_funct INTO ls_funct WITH KEY parameter = gs_output-fnamet. IF sy-subrc EQ 0. gs_output-stextt = ls_funct-stext. ENDIF. ENDIF. APPEND gs_output TO gt_output. CLEAR gs_output. ENDDO. * BREAK-POINT. ENDFORM. *&---------------------------------------------------------------------* *& Form F_DISPLAY_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM f_display_data . PERFORM f_set_layout. PERFORM f_set_fieldcat. PERFORM f_alv_display TABLES gt_output. ENDFORM. FORM f_set_layout. CLEAR: gs_layout. gs_layout-box_fname = 'SLBOX'. gs_layout-zebra = 'X'. gs_layout-cwidth_opt = 'X'. * gs_layout-ctab_fname = 'CELLCOLOR'. ENDFORM. FORM f_set_fieldcat. CLEAR: gt_fieldcat[]. DATA: ls_fieldcat TYPE lvc_s_fcat. DEFINE set_fieldcat. CLEAR: ls_fieldcat. ls_fieldcat-fieldname = &1. ls_fieldcat-ref_field = &2. ls_fieldcat-ref_table = &3. ls_fieldcat-convexit = &4. ls_fieldcat-do_sum = &5. ls_fieldcat-seltext = &6. ls_fieldcat-scrtext_l = &6. ls_fieldcat-scrtext_m = &6. ls_fieldcat-scrtext_s = &6. ls_fieldcat-coltext = &6. APPEND ls_fieldcat TO gt_fieldcat. END-OF-DEFINITION. *显示内容 set_fieldcat 'FUNCNAME' 'FUNCNAME' 'TFTIT' '' '' '函数名'. set_fieldcat 'STEXT' 'STEXT' 'TFTIT' '' '' '函数描述'. set_fieldcat 'FNAMEIN' 'STRUCTURE' 'FUPARAREF' '' '' '输入字段'. set_fieldcat 'STEXTIN' 'STEXT' 'FUNCT' '' '' '输入字段描述'. set_fieldcat 'DTYPEIN' 'DATATYPE' 'DD03L' '' '' '输入字段类型'. set_fieldcat 'LENGIN' 'LENG' 'DD03L' 'QTYCH' '' '输入字段长度'. set_fieldcat 'DECIMIN' 'DECIMALS' 'DD03L' 'QTYCH' '' '输入字段小数位'. set_fieldcat 'FNAMEOUT' 'STRUCTURE' 'FUPARAREF' '' '' '输出字段'. set_fieldcat 'STEXTOUT' 'STEXT' 'FUNCT' '' '' '输出字段描述'. set_fieldcat 'DTYPEOUT' 'DATATYPE' 'DD03L' '' '' '输出字段类型'. set_fieldcat 'LENGOUT' 'LENG' 'DD03L' 'QTYCH' '' '输出字段长度'. set_fieldcat 'DECIMOUT' 'DECIMALS' 'DD03L' 'QTYCH' '' '输出字段小数位'. set_fieldcat 'FNAMET' 'STRUCTURE' 'FUPARAREF' '' '' '表'. set_fieldcat 'STEXTT' 'STEXT' 'FUNCT' '' '' '表描述'. set_fieldcat 'FNAMETP' 'STRUCTURE' 'FUPARAREF' '' '' '表字段'. set_fieldcat 'DDTEXTTP' 'DDTEXT' 'DD04T' '' '' '表字段描述'. set_fieldcat 'DTYPETP' 'DATATYPE' 'DD03L' '' '' '表字段类型'. set_fieldcat 'LENGTP' 'LENG' 'DD03L' 'QTYCH' '' '表字段长度'. set_fieldcat 'DECIMTP' 'DECIMALS' 'DD03L' 'QTYCH' '' '表字段小数位'. ENDFORM. FORM f_alv_display TABLES it_table. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid * i_callback_pf_status_set = 'F_SET_PF_STATUS' * i_callback_user_command = 'F_USER_COMMAND' is_layout_lvc = gs_layout it_fieldcat_lvc = gt_fieldcat i_save = 'U' TABLES t_outtab = it_table EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. ENDIF. ENDFORM.