Dear all,
In this blog an example of dynamic tables in an ALV with RTTI is showed.
RTTI stands for Run Time Type Identification. It's used to get the definition of existing variables or existing types.
This can be used to create a dynamic structure and table type at runtime. These structure can easily change.
The next example have twoo screens:
- One to give a name of an SAP table in parameter.
- One to show all the values in the ALV with the given table from previous screen.
Below an example of a dynamic ALV with RTTI (code)
All the data that will be used.
TYPE-POOLS : abap, slis. FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE, <fs_wa>, <fs_field>. DATA: zdyn_table TYPE REF TO data, zdyn_line TYPE REF TO data, zwa_fieldcat TYPE lvc_s_fcat, zit_fieldcat TYPE lvc_t_fcat. *ALV data declarations DATA: zfieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE, zgd_tab_group TYPE slis_t_sp_group_alv, zgd_layout TYPE slis_layout_alv, zgd_repid LIKE sy-repid. PARAMETERS: zp_table(30) TYPE c . DATA : zit_tabdescr TYPE abap_compdescr_tab, zwa_tabdescr TYPE abap_compdescr. DATA : zref_table_descr TYPE REF TO cl_abap_structdescr.
Return structure of the filled parameter. ZIT_TABDESCR[] will now have the structure and details (datatype, decimals, ... ) from the table.
zref_table_descr ?= cl_abap_typedescr=>describe_by_name( zp_table ). zit_tabdescr[] = zref_table_descr->components[].
Set the structure of the table in the FIELDCAT, the structure of the ALV is based on this.
LOOP AT zit_tabdescr INTO zwa_tabdescr. CLEAR zwa_fieldcat. zwa_fieldcat-fieldname = zwa_tabdescr-name . zwa_fieldcat-datatype = zwa_tabdescr-type_kind. zwa_fieldcat-inttype = zwa_tabdescr-type_kind. zwa_fieldcat-intlen = zwa_tabdescr-length. zwa_fieldcat-decimals = zwa_tabdescr-decimals. APPEND zwa_fieldcat TO zit_fieldcat. ENDLOOP.
Create dynamic internal table and assign to Field Symbol
CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING it_fieldcatalog = zit_fieldcat IMPORTING ep_table = zdyn_table. ASSIGN zdyn_table->* TO <fs_table>.
Create dynamic work area and assign to Field Symbol
CREATE DATA zdyn_line LIKE LINE OF <fs_table>. ASSIGN zdyn_line->* TO <fs_wa>.
When the dynamic table is setted up, this one can be filled with an SELECT statement. It gets all the values from the filed parameter.
SELECT * INTO CORRESPONDING FIELDS OF TABLE <fs_table> FROM (zp_table).
An ALV Function module to build field catalog from the dynamic created table.
DATA: zit_fcat TYPE slis_t_fieldcat_alv. CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' EXPORTING i_structure_name = zp_table CHANGING ct_fieldcat = zit_fcat EXCEPTIONS inconsistent_interface = 1 program_error = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.
Fieldcatalog is moved to a new fieldcatalog
zfieldcatalog[] = zit_fcat[].
To optimize every field length:
zgd_layout-colwidth_optimize = 'X'.
The ALV will be showed with the next function module. Layout, fieldcatalog and repid are given in EXPORTING, also the table with al the values.
zgd_repid = sy-repid. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = zgd_repid is_layout = zgd_layout it_fieldcat = zfieldcatalog[] i_save = 'X' TABLES t_outtab = <fs_table> EXCEPTIONS program_error = 1 OTHERS = 2.
Kind regards,
Pieter Lemaire