ABAP数据库表的元数据

For project reason I need to fill some excel.



The content of each column comes from content in SE11:



In order to avoid such boring task, I write a small ABAP class to automate it.

This class will first read corresponding database table name based on CRM settype id, then call function module DDIF_NAMETAB_GET to get all metadata of each table field, and then send the data to clipboard.

Once done, put the focus on the first cell of content row, press Ctrl+V, all the data from clipboard will be copied into excel automatically.



The source code could be found below:

class ZCL_EXCEL_TOOL definition
  public
  final
  create public .public section.
  methods GET_SETTYPE_FIELDS
    importing
      !IV_SETTYPE_ID type COMT_FRGTYPE_ID default 'COMM_PR_SHTEXT' .
  PROTECTED SECTION.private section.
  types:
    BEGIN OF ty_column,
        a_index       TYPE char3,
        b_table       TYPE dd03l-tabname,
        c_fieldname   TYPE dd03l-fieldname,
        d_element     TYPE dd03l-rollname,
        e_datatype    TYPE x031l-dtyp,
        f_length      TYPE char4,
        g_description TYPE char40,
      END OF ty_column .
  types:
    tt_column TYPE STANDARD TABLE OF ty_column WITH KEY a_index b_table c_fieldname .
  types:
    BEGIN OF ty_clipdata,
        data TYPE c LENGTH 500,
      END   OF ty_clipdata .
  types:
    tt_formatted TYPE STANDARD TABLE OF ty_clipdata .
  data MT_COLUMN type TT_COLUMN .
  data MT_FORMATTED type TT_FORMATTED .
  constants C_TAB type CHAR1 value CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB ##NO_TEXT.
  methods CONVERT .
  methods GET_FIELD_LABEL
    importing
      !IV_TAB_NAME type DDOBJNAME
      !IV_FIELD_NAME type DFIES-FIELDNAME
    returning
      value(RV_LABEL) type STRING .ENDCLASS.CLASS ZCL_EXCEL_TOOL IMPLEMENTATION.* ---------------------------------------------------------------------------------------+* | Instance Private Method ZCL_EXCEL_TOOL->CONVERT* +-------------------------------------------------------------------------------------------------+* +--------------------------------------------------------------------------------------
  METHOD convert.
    LOOP AT mt_column ASSIGNING FIELD-SYMBOL().
      APPEND INITIAL LINE TO mt_formatted ASSIGNING FIELD-SYMBOL().
      CONCATENATE -a_index -b_table -c_fieldname -d_element -e_datatype
      -f_length -g_description INTO  SEPARATED BY c_tab.
    ENDLOOP.
  ENDMETHOD.* ---------------------------------------------------------------------------------------+* | Instance Private Method ZCL_EXCEL_TOOL->GET_FIELD_LABEL* +-------------------------------------------------------------------------------------------------+* | [--->] IV_TAB_NAME                    TYPE        DDOBJNAME* | [--->] IV_FIELD_NAME                  TYPE        DFIES-FIELDNAME* | [<-()] RV_LABEL                       TYPE        STRING* +--------------------------------------------------------------------------------------
  METHOD get_field_label.
    CALL FUNCTION 'DDIF_FIELDLABEL_GET'
      EXPORTING
        tabname   = iv_tab_name
        fieldname = iv_field_name
        langu     = sy-langu
      IMPORTING
        label     = rv_label.
  ENDMETHOD.* ---------------------------------------------------------------------------------------+* | Instance Public Method ZCL_EXCEL_TOOL->GET_SETTYPE_FIELDS* +-------------------------------------------------------------------------------------------------+* | [--->] IV_SETTYPE_ID                  TYPE        COMT_FRGTYPE_ID (default ='COMM_PR_SHTEXT')* +--------------------------------------------------------------------------------------
  METHOD get_settype_fields.
    DATA: lv_tab  TYPE comc_settype-frgtype_tab,
          lv_ret  TYPE int4,
          lt_list TYPE STANDARD TABLE OF x031l.
    SELECT SINGLE frgtype_tab INTO lv_tab FROM comc_settype WHERE frgtype_id = iv_settype_id.
    IF sy-subrc <> 0.
      WRITE: / 'no database table maintained for settype: ', iv_settype_id.
      RETURN.
    ENDIF.
    CALL FUNCTION 'DDIF_NAMETAB_GET'
      EXPORTING
        tabname   = CONV ddobjname( lv_tab )
        status    = 'A'
      TABLES
        x031l_tab = lt_list
      EXCEPTIONS
        not_found = 1
        OTHERS    = 2.
    IF sy-subrc <> 0.
      WRITE:/ 'table metadata parse error'.
      RETURN.
    ENDIF.
    LOOP AT lt_list ASSIGNING FIELD-SYMBOL().
      APPEND INITIAL LINE TO mt_column ASSIGNING FIELD-SYMBOL().
      -a_index = sy-tabix.
      -b_table = lv_tab.
      -c_fieldname = -fieldname.
      -d_element = -rollname.
      -e_datatype = -dtyp.
      -f_length = CONV i( -exlength ). "cast CL_ABAP_ELEMDESCR( CL_ABAP_ELEMDESCR=>describe_by_name( -rollname ) )->output_length.      -g_description = get_field_label( EXPORTING iv_tab_name = CONV #( lv_tab ) iv_field_name = -fieldname ).
    ENDLOOP.
    convert( ).
    cl_gui_frontend_services=>clipboard_export(
    EXPORTING
        no_auth_check        = abap_true
        IMPORTING
          data                 = mt_formatted
        CHANGING
          rc                   = lv_ret
        EXCEPTIONS
          cntl_error           = 1
          error_no_gui         = 2
          not_supported_by_gui = 3
      ).
  ENDMETHOD.ENDCLASS.


请使用浏览器的分享功能分享到微信等