ABAP Development

Dynamic Structure

ABAP/DDIC2017. 9. 16. 23:54

출처 : https://archive.sap.com/discussions/thread/426726

 *&---------------------------------------------------------------------* *& Report  ZUS_SDN_RTTI_CREATE_STRUCTURES *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT  zus_sdn_rtti_create_structures.    TYPE-POOLS: abap.  DATA: celltab          TYPE lvc_t_styl. DATA: go_table         TYPE REF TO cl_salv_table,       go_sdescr        TYPE REF TO cl_abap_structdescr,       go_tdescr        TYPE REF TO cl_abap_tabledescr,       gdo_data         TYPE REF TO data,       gdo_handle       TYPE REF TO data,       gs_comp          TYPE abap_componentdescr,       gt_components    TYPE abap_component_tab. * *    name       TYPE string, *    type       TYPE REF TO cl_abap_datadescr, *    as_include TYPE abap_bool, *    suffix     TYPE string,   FIELD-SYMBOLS:   <gd_fld>      TYPE ANY,   <gs_struc>    TYPE ANY,   <gt_itab>     TYPE table.     PARAMETER:   p_tabnam      TYPE tabname  DEFAULT 'KNB1'.   START-OF-SELECTION.   * Create dynamically structure   CREATE DATA gdo_data TYPE (p_tabnam).   ASSIGN gdo_data->* TO <gs_struc>.   CHECK ( <gs_struc$gt; IS ASSIGNED ).     * Simulate dynamic addition of columns to ALV list   DO 10 TIMES.     ASSIGN COMPONENT syst-index OF STRUCTURE <gs_struc> TO <gd_fld>.       CLEAR: gs_comp.     gs_comp-type ?= cl_abap_datadescr=>describe_by_data( <gd_fld> ).     gs_comp-name  = gs_comp-type->get_relative_name( ).     APPEND gs_comp TO gt_components.       go_sdescr  = cl_abap_structdescr=>create( gt_components ).     go_tdescr  = cl_abap_tabledescr=>create( go_sdescr ).     "   Create data refence followed by table creation     CREATE DATA gdo_handle TYPE HANDLE go_tdescr.     ASSIGN gdo_handle->* TO <gt_itab>.   *   Dynamic select     SELECT        * FROM  (p_tabnam)       INTO CORRESPONDING FIELDS OF TABLE <gt_itab>            WHERE  bukrs  = '2000'.       TRY.         CALL METHOD cl_salv_table=>factory           IMPORTING             r_salv_table = go_table           CHANGING             t_table      = <gt_itab>.         go_table->display( ).       CATCH cx_salv_msg .     ENDTRY.     ENDDO.       " Add table type as field to structure   CLEAR: gs_comp.   gs_comp-type ?= cl_abap_typedescr=>describe_by_data( celltab ).   gs_comp-name  = 'CELLTAB'.   APPEND gs_comp TO gt_components.     go_sdescr  = cl_abap_structdescr=>create( gt_components ).   go_tdescr  = cl_abap_tabledescr=>create( go_sdescr ).   CREATE DATA gdo_handle TYPE HANDLE go_tdescr.   ASSIGN gdo_handle->* TO <gt_itab>.   *   Dynamic select   SELECT        * FROM  (p_tabnam)     INTO CORRESPONDING FIELDS OF TABLE <gt_itab>          WHERE  bukrs  = '2000'.         " Simplified version of table creation:   CLEAR: gdo_data.   UNASSIGN <gt_itab>.     CREATE DATA gdo_data TYPE (p_tabnam).   ASSIGN gdo_data->* TO <gt_itab>.     END-OF-SELECTION.