Application Development Blog Posts
Learn and share on deeper, cross technology development topics such as integration and connectivity, automation, cloud extensibility, developing at scale, and security.
cancel
Showing results for 
Search instead for 
Did you mean: 
joachimrees1
Active Contributor
So I have this method, that lets me display any table in an ALV.
And it it's a "deep" table - a field of a table-line being a table itself - those fields are dropped. (They are not displayed, but all the other fields are. Way better than a dump!)

You can see it here: https://blogs.sap.com/2023/05/31/method-display_data-but-dont-dump/ .

But, like most things, it's work in progress, it can and has to be improved over time.

A need for improvement might be this code:
    TYPES: BEGIN OF  ty_hus_to_move.
INCLUDE TYPE /scwm/s_huitm_int AS huitm.
TYPES: END OF ty_hus_to_move,
tyt_hus_to_move TYPE STANDARD TABLE OF ty_hus_to_move WITH NON-UNIQUE KEY guid_parent.
DATA lt_tt_quan_string TYPE tyt_hus_to_move.

INSERT INITIAL LINE INTO lt_tt_quan_string INDEX 1.
display_data_deep_enabled( lt_tt_quan_string ).

Try it out.
It will dump.

But: Changing only 2 lines will make it work again. And has improved my method.
*    DATA(lt_components_with_ref) = lo_struct_descr->get_components( ).
DATA(lt_components_with_ref) = lo_struct_descr->get_included_view( ).

* lo_struct_descr = cl_abap_structdescr=>create( p_components = lt_components_with_ref ).
lo_struct_descr = cl_abap_structdescr=>create( p_components = CORRESPONDING #( lt_components_with_ref ) ).

Explanation:
1.
lo_struct_descr->get_components code just gave me one line with is_include = X.
lo_struct_descr->get_included_view gives me ALL the components - it resolves the include.

2.
The structure is a litte different:
Old:

abap_simple_componentdescr
name type string
type type ref to cl_abap_datadescr

New:
abap_componentdescr
name type string
type type ref to cl_abap_datadescr
as_include type abap_bool
suffix type string

-> The relevant fields - NAME and TYPE - a the same, so CORRESPONDING # is doing fine.

Full new code:
  METHOD display_data_deep_enabled.
DATA lo_table_descr TYPE REF TO cl_abap_tabledescr.
DATA lo_struct_descr TYPE REF TO cl_abap_structdescr.

lo_table_descr ?= cl_abap_tabledescr=>describe_by_data( it_data ).
lo_struct_descr ?= lo_table_descr->get_table_line_type( ). " note: this will fail if it's a single-coloum-table.

DATA(lt_components_with_ref) = lo_struct_descr->get_included_view( ).
DATA(lt_components_simple_tab) = lo_struct_descr->components.

LOOP AT lt_components_simple_tab ASSIGNING FIELD-SYMBOL(<component>)
WHERE type_kind = cl_abap_tabledescr=>typekind_table.
DELETE lt_components_with_ref WHERE name = <component>-name.
ENDLOOP.

" New Structure + Table.
lo_struct_descr = cl_abap_structdescr=>create( p_components = CORRESPONDING #( lt_components_with_ref ) ).
lo_table_descr = cl_abap_tabledescr=>create( p_line_type = lo_struct_descr ).
DATA lt_new TYPE REF TO data.
" Create the Data-Ref of the new Type.
CREATE DATA lt_new TYPE HANDLE lo_table_descr.
" Fill it with data:
lt_new->* = CORRESPONDING #( it_data ).

TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lref_alv)
CHANGING t_table = lt_new->* ).
CATCH cx_salv_msg.
ENDTRY.

lref_alv->get_layout( )->set_key( VALUE #( report = sy-repid ) ).
lref_alv->get_layout( )->set_default( abap_true ).
lref_alv->get_layout( )->set_save_restriction( if_salv_c_layout=>restrict_none ).
lref_alv->get_functions( )->set_all( abap_true ).
lref_alv->display( ).
ENDMETHOD.

What do you think?

best
Joachim