‎2008 Jul 28 2:26 AM
I give up! Maybe someone else can help me with this Dynamic Programming problem.
I am using RTTC to create an itab. Now I want to append lines and for some reason can't seem to crack the syntax I need.
My latest attempt looks like this...
FIELD-SYMBOLS: <table> TYPE ANY TABLE,
<row> TYPE ANY.
lo_sdescr = cl_abap_structdescr=>create( lt_components ).
lo_tdescr = cl_abap_tabledescr=>create( lo_sdescr ).
CREATE DATA lr_alloc->alloc_table TYPE HANDLE lo_tdescr.
CREATE DATA lr_struct TYPE HANDLE lo_rdescr.
ASSIGN lr_alloc->alloc_table->* TO <table>.
APPEND INITIAL LINE TO <table> ASSIGNING <row>.
The syntax check I get on the APPEND statement is "You cannot use explicit or implicit index operations on tables with type "ANY TABLE".
All the doco and examples I can find use a simple "SELECT * ... INTO CORRESPONDING FIELDS OF TABLE <table>" syntax which it not what I need to do.
Any help it appreciated.
Thanks
Graham Robbo
‎2008 Jul 28 4:37 AM
Hello Graham
The solution is quite simple (at least to overcome your syntax error):
FIELD-SYMBOLS:
<gt_itab> TYPE STANDARD TABLE, " use STANDARD instead of ANY
<gs_struc> TYPE ANY.
*&---------------------------------------------------------------------*
*& Report Z_RTTI_CREATE_COMPLEX_ITAB
*&
*&---------------------------------------------------------------------*
*& NOTE: revised version of ZUS_SDN_RTTI_CREATE_STRUCTURES
*&---------------------------------------------------------------------*
*& Thread: Dynamic Programming - RTTC - Appending lines
*& <a class="jive_macro jive_macro_thread" href="" __jive_macro_name="thread" modifiedtitle="true" __default_attr="980407"></a>
*&---------------------------------------------------------------------*
REPORT z_rtti_create_complex_itab.
TYPE-POOLS: abap.
DATA:
celltab TYPE lvc_t_styl. " becomes field of complex itab
DATA:
gd_tabnam TYPE string,
gd_tabfield TYPE string,
go_table TYPE REF TO cl_salv_table,
go_sdescr TYPE REF TO cl_abap_structdescr,
go_sdescr_new TYPE REF TO cl_abap_structdescr,
go_tdescr TYPE REF TO cl_abap_tabledescr,
gdo_data TYPE REF TO data,
gdo_handle TYPE REF TO data,
gs_component TYPE abap_compdescr,
gs_comp TYPE abap_componentdescr,
gt_components TYPE abap_component_tab.
FIELD-SYMBOLS:
<gt_itab> TYPE STANDARD TABLE,
<gs_struc> TYPE ANY.
PARAMETER:
p_tabnam TYPE tabname DEFAULT 'KNB1'.
START-OF-SELECTION.
" Describe structure
go_sdescr ?= cl_abap_structdescr=>describe_by_name( p_tabnam ).
gd_tabnam = go_sdescr->get_relative_name( ).
" Simulate dynamic addition of columns
LOOP AT go_sdescr->components INTO gs_component.
" Build fieldname
CONCATENATE gd_tabnam gs_component-name INTO gd_tabfield
SEPARATED BY '-'.
CLEAR: gs_comp.
gs_comp-type ?= cl_abap_datadescr=>describe_by_name( gd_tabfield ).
gs_comp-name = gs_component-name.
APPEND gs_comp TO gt_components.
ENDLOOP.
" Create instances of dynamic structure and dynamic internal table
go_sdescr_new = cl_abap_structdescr=>create( gt_components ).
go_tdescr = cl_abap_tabledescr=>create( go_sdescr_new ).
" Create data refence followed by table creation
CREATE DATA gdo_handle TYPE HANDLE go_sdescr_new.
ASSIGN gdo_handle->* TO <gs_struc>.
*
CREATE DATA gdo_handle TYPE HANDLE go_tdescr. " !!!
ASSIGN gdo_handle->* TO <gt_itab>.
APPEND INITIAL LINE TO <gt_itab> ASSIGNING <gs_struc>.
TRY.
CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = go_table
CHANGING
t_table = <gt_itab>.
go_table->display( ).
CATCH cx_salv_msg .
ENDTRY.
END-OF-SELECTION.
Regards
Uwe
‎2008 Jul 28 4:37 AM
Hello Graham
The solution is quite simple (at least to overcome your syntax error):
FIELD-SYMBOLS:
<gt_itab> TYPE STANDARD TABLE, " use STANDARD instead of ANY
<gs_struc> TYPE ANY.
*&---------------------------------------------------------------------*
*& Report Z_RTTI_CREATE_COMPLEX_ITAB
*&
*&---------------------------------------------------------------------*
*& NOTE: revised version of ZUS_SDN_RTTI_CREATE_STRUCTURES
*&---------------------------------------------------------------------*
*& Thread: Dynamic Programming - RTTC - Appending lines
*& <a class="jive_macro jive_macro_thread" href="" __jive_macro_name="thread" modifiedtitle="true" __default_attr="980407"></a>
*&---------------------------------------------------------------------*
REPORT z_rtti_create_complex_itab.
TYPE-POOLS: abap.
DATA:
celltab TYPE lvc_t_styl. " becomes field of complex itab
DATA:
gd_tabnam TYPE string,
gd_tabfield TYPE string,
go_table TYPE REF TO cl_salv_table,
go_sdescr TYPE REF TO cl_abap_structdescr,
go_sdescr_new TYPE REF TO cl_abap_structdescr,
go_tdescr TYPE REF TO cl_abap_tabledescr,
gdo_data TYPE REF TO data,
gdo_handle TYPE REF TO data,
gs_component TYPE abap_compdescr,
gs_comp TYPE abap_componentdescr,
gt_components TYPE abap_component_tab.
FIELD-SYMBOLS:
<gt_itab> TYPE STANDARD TABLE,
<gs_struc> TYPE ANY.
PARAMETER:
p_tabnam TYPE tabname DEFAULT 'KNB1'.
START-OF-SELECTION.
" Describe structure
go_sdescr ?= cl_abap_structdescr=>describe_by_name( p_tabnam ).
gd_tabnam = go_sdescr->get_relative_name( ).
" Simulate dynamic addition of columns
LOOP AT go_sdescr->components INTO gs_component.
" Build fieldname
CONCATENATE gd_tabnam gs_component-name INTO gd_tabfield
SEPARATED BY '-'.
CLEAR: gs_comp.
gs_comp-type ?= cl_abap_datadescr=>describe_by_name( gd_tabfield ).
gs_comp-name = gs_component-name.
APPEND gs_comp TO gt_components.
ENDLOOP.
" Create instances of dynamic structure and dynamic internal table
go_sdescr_new = cl_abap_structdescr=>create( gt_components ).
go_tdescr = cl_abap_tabledescr=>create( go_sdescr_new ).
" Create data refence followed by table creation
CREATE DATA gdo_handle TYPE HANDLE go_sdescr_new.
ASSIGN gdo_handle->* TO <gs_struc>.
*
CREATE DATA gdo_handle TYPE HANDLE go_tdescr. " !!!
ASSIGN gdo_handle->* TO <gt_itab>.
APPEND INITIAL LINE TO <gt_itab> ASSIGNING <gs_struc>.
TRY.
CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = go_table
CHANGING
t_table = <gt_itab>.
go_table->display( ).
CATCH cx_salv_msg .
ENDTRY.
END-OF-SELECTION.
Regards
Uwe
‎2008 Jul 28 4:45 AM
Thanks Uwe.
Silly me - I assumed ANY TABLE would include STANDARD tables. I have obviously been looking at this for too long.
Cheers
Graham Robbo
‎2008 Jul 28 7:49 AM
Hello Graham
You would have got away with:
FIELD-SYMBOLS: <table> TYPE TABLE, " ANY TABLE,
<row> TYPE ANY.
Regards
Uwe