Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Dynamic table in a table.

Former Member
0 Likes
678

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.

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
643

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

3 REPLIES 3
Read only

Former Member
0 Likes
644

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

Read only

0 Likes
643

Hi Luis,

That is a good one. Let me try it.

Thanks for the qick reply.

Read only

0 Likes
643

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....