abap函数(接口)参数展示报表

可直接运行

延申,获取表结构的字段名、字段类型、字段长度、字段描述还可以通过'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.
View Code

 

包含文件  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.
View Code

 

包含文件  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.
View Code
原文地址:https://www.cnblogs.com/chaguoguo/p/14067068.html