2014 Apr 01 6:28 AM
Hi Guys,
I would like to declare a row in a internal table as dynamic table, like this:
types: begin of typ_sentences,
period type bu_txt5000,
ref type data,
nested_dynamic table TYPE ????,
end of typ_sentences.
data: table type table of typ_sentences,
wa like line of table.
call method cl_alv_table_create=>create_dynamic_table
exporting
it_fieldcatalog = tab_fieldcat
importing
ep_table = wa-ref.
assign wa-ref->* to wa<nested_dynamic_table>.
wa-period = 2014.
append wa to table.
Or maybe something like this:
field-symbols: <main_struture> type ANY TABLE,
<nested_table> like table of <main_structure>.
Any suggestion?
Thanks in advanced.
2014 Apr 01 7:52 AM
Hi Pedro Rios,
What about with pointers (references)?
REPORT ztesla.
"-----------------------------------------
TYPES: BEGIN OF ty_reftabs,
id TYPE int4,
ref_tab TYPE REF TO data.
TYPES: END OF ty_reftabs.
"-----------------------------------------
DATA: lt_reftabs TYPE TABLE OF ty_reftabs,
ls_reftabs TYPE ty_reftabs,
lt_mara TYPE TABLE OF mara.
"-----------------------------------------
FIELD-SYMBOLS: <lfs_table> TYPE ANY TABLE,
<lfs> TYPE ANY.
"-----------------------------------------
START-OF-SELECTION.
"-----------------------------------------
REFRESH lt_mara.
SELECT *
INTO TABLE lt_mara
FROM mara
UP TO 11 ROWS.
"-----------------------------------------
IF sy-subrc = 0 AND lt_mara[] IS NOT INITIAL.
ls_reftabs-id = 1.
GET REFERENCE OF lt_mara INTO ls_reftabs-ref_tab.
APPEND ls_reftabs TO lt_reftabs.
ENDIF.
"-----------------------------------------
READ TABLE lt_reftabs ASSIGNING <lfs> INDEX 1.
IF sy-subrc = 0 AND <lfs> IS ASSIGNED.
FIELD-SYMBOLS: <lfs_ref> TYPE ANY.
ASSIGN COMPONENT 'REF_TAB' OF STRUCTURE <lfs> TO <lfs_ref>.
ASSIGN <lfs_ref>->* TO <lfs_table>.
ENDIF.
"-----------------------------------------
IF <lfs_table> IS ASSIGNED AND <lfs_table>[] IS NOT INITIAL.
DATA: lo_alv TYPE REF TO cl_salv_table.
CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = lo_alv
CHANGING
t_table = <lfs_table>.
lo_alv->display( ).
ENDIF.
"-----------------------------------------
Regards,
Luis
2014 Apr 01 7:52 AM
Hi Pedro Rios,
What about with pointers (references)?
REPORT ztesla.
"-----------------------------------------
TYPES: BEGIN OF ty_reftabs,
id TYPE int4,
ref_tab TYPE REF TO data.
TYPES: END OF ty_reftabs.
"-----------------------------------------
DATA: lt_reftabs TYPE TABLE OF ty_reftabs,
ls_reftabs TYPE ty_reftabs,
lt_mara TYPE TABLE OF mara.
"-----------------------------------------
FIELD-SYMBOLS: <lfs_table> TYPE ANY TABLE,
<lfs> TYPE ANY.
"-----------------------------------------
START-OF-SELECTION.
"-----------------------------------------
REFRESH lt_mara.
SELECT *
INTO TABLE lt_mara
FROM mara
UP TO 11 ROWS.
"-----------------------------------------
IF sy-subrc = 0 AND lt_mara[] IS NOT INITIAL.
ls_reftabs-id = 1.
GET REFERENCE OF lt_mara INTO ls_reftabs-ref_tab.
APPEND ls_reftabs TO lt_reftabs.
ENDIF.
"-----------------------------------------
READ TABLE lt_reftabs ASSIGNING <lfs> INDEX 1.
IF sy-subrc = 0 AND <lfs> IS ASSIGNED.
FIELD-SYMBOLS: <lfs_ref> TYPE ANY.
ASSIGN COMPONENT 'REF_TAB' OF STRUCTURE <lfs> TO <lfs_ref>.
ASSIGN <lfs_ref>->* TO <lfs_table>.
ENDIF.
"-----------------------------------------
IF <lfs_table> IS ASSIGNED AND <lfs_table>[] IS NOT INITIAL.
DATA: lo_alv TYPE REF TO cl_salv_table.
CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = lo_alv
CHANGING
t_table = <lfs_table>.
lo_alv->display( ).
ENDIF.
"-----------------------------------------
Regards,
Luis
2014 Apr 01 4:55 PM
Hi Luis,
That is a good one. Let me try it.
Thanks for the qick reply.
2014 Apr 02 7:34 AM
Hi,
This is a ONE clever piece of code.
Thank you VERY much for sharing.
Based on this code I was able to create this small program:
REPORT y_r_eitan_test_04_04 .
TYPE-POOLS: abap .
*----------------------------------------------------------------------*
TYPES: BEGIN OF tp_stru_1 .
TYPES: tabname TYPE dd02l-tabname ,
ref_data TYPE REF TO data.
TYPES: END OF tp_stru_1 .
TYPES: tp_stru_1_tab TYPE TABLE OF tp_stru_1 .
*----------------------------------------------------------------------*
START-OF-SELECTION .
PERFORM at_start_of_selection .
*----------------------------------------------------------------------*
FORM at_start_of_selection .
DATA: it_stru_1 TYPE tp_stru_1_tab .
PERFORM get_table_data_1
USING
'SCARR'
CHANGING
it_stru_1.
PERFORM get_table_data_1
USING
'SPFLI'
CHANGING
it_stru_1.
PERFORM get_table_data_1
USING
'SFLIGHT'
CHANGING
it_stru_1.
PERFORM get_table_data_1
USING
'SBOOK'
CHANGING
it_stru_1.
* Each row in the it_stru_1 has a different structure .
BREAK-POINT .
ENDFORM . "at_start_of_selection
*----------------------------------------------------------------------*
FORM get_table_data_1
USING
tabname TYPE dd03l-tabname
CHANGING
it_stru_1 TYPE tp_stru_1_tab .
DATA: st_stru_1 LIKE LINE OF it_stru_1 .
PERFORM get_table_ref_1
USING
tabname
CHANGING
st_stru_1 .
FIELD-SYMBOLS: <it_data_1> TYPE STANDARD TABLE .
ASSIGN st_stru_1-ref_data->* TO <it_data_1> .
SELECT * INTO CORRESPONDING FIELDS OF TABLE <it_data_1>
FROM (tabname)
UP TO 100 ROWS .
st_stru_1-tabname = tabname .
APPEND st_stru_1 TO it_stru_1 .
ENDFORM . "get_table_data_1
*----------------------------------------------------------------------*
FORM get_table_ref_1
USING
tabname TYPE dd03l-tabname
CHANGING
st_stru_1 TYPE tp_stru_1 .
* Here we can use any means to create the require data container
* CREATE DATA st_stru_1-ref_data TYPE STANDARD TABLE OF (tabname) WITH NON-UNIQUE DEFAULT KEY.
* RETURN .
* Get only the keys for the table (Simulate dynamic.... ).
DATA: it_dfies_tab TYPE ddfields .
FIELD-SYMBOLS: <st_dfies_tab> LIKE LINE OF it_dfies_tab .
CALL FUNCTION 'DDIF_FIELDINFO_GET'
EXPORTING
tabname = tabname
TABLES
dfies_tab = it_dfies_tab
EXCEPTIONS
not_found = 1
internal_error = 2
OTHERS = 3.
DELETE it_dfies_tab WHERE keyflag EQ abap_false .
DATA: it_component TYPE abap_component_tab .
DATA: st_component LIKE LINE OF it_component .
LOOP AT it_dfies_tab ASSIGNING <st_dfies_tab> .
st_component-name = <st_dfies_tab>-fieldname .
st_component-type ?= cl_abap_elemdescr=>describe_by_name( <st_dfies_tab>-rollname ).
APPEND st_component TO it_component.
ENDLOOP .
DATA: ob_abap_structdescr TYPE REF TO cl_abap_structdescr,
ob_abap_tabledescr TYPE REF TO cl_abap_tabledescr .
TRY.
ob_abap_structdescr = cl_abap_structdescr=>create(
p_components = it_component ).
CATCH cx_sy_struct_creation .
ENDTRY.
TRY.
ob_abap_tabledescr = cl_abap_tabledescr=>create( ob_abap_structdescr ).
CATCH cx_sy_table_creation .
ENDTRY.
CREATE DATA st_stru_1-ref_data TYPE HANDLE ob_abap_tabledescr .
ENDFORM . "get_table_ref_1
*----------------------------------------------------------------------*
Thanks again....