zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    vscode如何将less编译到指定css目录中
    md文档的书写《二》
    关于页面scroolTop的获取
    git学习 c的某位老哥的,(侵删)
    学习git使用网址
    git,github,gitlab,码云的区别
    Git的基本使用
    php_review_day1
    shell脚本编程基础-构建基本脚本
    Linux基本命令
  • 原文地址:https://www.cnblogs.com/chaguoguo/p/14067068.html
Copyright © 2011-2022 走看看