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.