Добрый день.
Тема динамического создания таблиц поднимается на нашем форуме с регулярностью раз в 2 недели, это точно =)
Есть много примеров, и при желании, немного посмотрев, каждый может это сделать.
Я решил выложить свой класс на основе RTTI с той целью, если кто-то забудет, или не будет под рукой примера, смог просто взять мой
include, и либо использовать его, либо посмотрев внутрь вспомнить. И возможно еще одно сообщение на эту тему, уменьшит их появление в
дальнейшем.
Меня мотивировало на это вновь появившаяся тема про дин. создание таблиц.
Для меня это типа шпаргалки.
Code:
*&---------------------------------------------------------------------*
*& Include ZAVV_LCL_CRTFIELDCATALOG
*&---------------------------------------------------------------------*
CLASS zavv_lcl_dyn DEFINITION .
PUBLIC SECTION.
CLASS-METHODS:
get_fldcat IMPORTING im_table TYPE STANDARD TABLE
EXPORTING ex_fldcat TYPE lvc_t_fcat,
get_dyntab IMPORTING im_table TYPE STANDARD TABLE
EXPORTING ex_dyntab TYPE REF TO data,
get_dyntab_from_std IMPORTING VALUE(im_name_type) TYPE char80
EXPORTING ex_dyntab TYPE REF TO data
.
ENDCLASS. "zavv_lcl_crtfieldcatalog DEFINITION
*----------------------------------------------------------------------*
* CLASS zavv_lcl_crtfieldcatalog IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS zavv_lcl_dyn IMPLEMENTATION.
METHOD get_fldcat.
DATA: lcl_table_descr TYPE REF TO cl_abap_tabledescr,
lcl_struc_descr TYPE REF TO cl_abap_structdescr,
ret_components TYPE abap_compdescr_tab,
wa_ret_components TYPE LINE OF abap_compdescr_tab,
wa_ct_fieldcat TYPE lvc_s_fcat.
CLEAR: lcl_table_descr ,
lcl_struc_descr ,
ret_components ,
wa_ret_components ,
wa_ct_fieldcat .
lcl_table_descr ?= cl_abap_typedescr=>describe_by_data( im_table ).
lcl_struc_descr ?= lcl_table_descr->get_table_line_type( ).
ret_components = lcl_struc_descr->components.
LOOP AT ret_components INTO wa_ret_components .
wa_ct_fieldcat-fieldname = wa_ret_components-name.
wa_ct_fieldcat-col_pos = sy-tabix.
wa_ct_fieldcat-inttype = wa_ret_components-type_kind.
wa_ct_fieldcat-intlen = wa_ret_components-length.
APPEND wa_ct_fieldcat TO ex_fldcat.
CLEAR wa_ct_fieldcat.
ENDLOOP.
ENDMETHOD. "get_fldcat
METHOD get_dyntab.
DATA: lcl_table_descr TYPE REF TO cl_abap_tabledescr,
lcl_struc_descr TYPE REF TO cl_abap_structdescr,
ret_components TYPE abap_compdescr_tab,
wa_ret_components TYPE LINE OF abap_compdescr_tab,
wa_ct_fieldcat TYPE lvc_s_fcat,
lt_fldcat TYPE lvc_t_fcat.
CLEAR: lcl_table_descr ,
lcl_struc_descr ,
ret_components ,
wa_ret_components ,
wa_ct_fieldcat ,
lt_fldcat .
lcl_table_descr ?= cl_abap_typedescr=>describe_by_data( im_table ).
lcl_struc_descr ?= lcl_table_descr->get_table_line_type( ).
ret_components = lcl_struc_descr->components.
LOOP AT ret_components INTO wa_ret_components .
wa_ct_fieldcat-fieldname = wa_ret_components-name.
wa_ct_fieldcat-col_pos = sy-tabix.
wa_ct_fieldcat-inttype = wa_ret_components-type_kind.
wa_ct_fieldcat-intlen = wa_ret_components-length.
APPEND wa_ct_fieldcat TO lt_fldcat.
CLEAR wa_ct_fieldcat.
ENDLOOP.
DATA: im_table1 TYPE REF TO data.
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = lt_fldcat
IMPORTING
ep_table = ex_dyntab
EXCEPTIONS
generate_subpool_dir_full = 1
OTHERS = 2.
ENDMETHOD. "get_fldcat
METHOD get_dyntab_from_std.
CREATE DATA ex_dyntab TYPE STANDARD TABLE OF (im_name_type).
ENDMETHOD. "get_dyntab_from_std
ENDCLASS. "zavv_lcl_crtfieldcatalog IMPLEMENTATION
Пример использования
Code:
REPORT zavv_test.
INCLUDE zavv_lcl_crtfieldcatalog.
DATA : it_file LIKE alsmex_tabline OCCURS 0 WITH HEADER LINE.
DATA file_path LIKE rlgrap-filename.
TYPES : BEGIN OF sbu_upload ,
bu TYPE char2,
bu_desc TYPE char5,
delete TYPE c,
END OF sbu_upload .
DATA tbu_upload TYPE STANDARD TABLE OF sbu_upload WITH HEADER LINE.
DATA: lt_fieldcat TYPE lvc_t_fcat.
INITIALIZATION.
START-OF-SELECTION.
zavv_lcl_dyn=>get_fldcat( EXPORTING im_table = tbu_upload[]
IMPORTING ex_fldcat = lt_fieldcat ).
DATA: lt_tab1 TYPE REF TO data.
zavv_lcl_dyn=>get_dyntab( EXPORTING im_table = tbu_upload[]
IMPORTING ex_dyntab = lt_tab1 ).
DATA: lt_tab2 TYPE REF TO data.
zavv_lcl_dyn=>get_dyntab_from_std( EXPORTING im_name_type = 'MARA'
IMPORTING ex_dyntab = lt_tab2 ).
FIELD-SYMBOLS: <l_table1> TYPE STANDARD TABLE,
<l_line1> TYPE any,
<fs> TYPE any.
DATA: new_line1 TYPE REF TO data.
ASSIGN lt_tab1->* TO <l_table1>.
CREATE DATA new_line1 LIKE LINE OF <l_table1>.
ASSIGN new_line1->* TO <l_line1>.
ASSIGN COMPONENT 'BU' OF STRUCTURE <l_line1> to <fs>.
<fs> = '1'.
APPEND <l_line1> to <l_table1>.
BREAK sy-uname.