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:
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
4 | |
4 | |
3 | |
2 | |
2 | |
2 | |
1 | |
1 | |
1 | |
1 |