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 Programming - RTTC - Appending lines

GrahamRobbo
SAP Mentor
SAP Mentor
0 Likes
719

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

1 ACCEPTED SOLUTION
Read only

uwe_schieferstein
Active Contributor
0 Likes
615

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

3 REPLIES 3
Read only

uwe_schieferstein
Active Contributor
0 Likes
616

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

Read only

0 Likes
615

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

Read only

615

Hello Graham

You would have got away with:


FIELD-SYMBOLS: <table> TYPE TABLE,  " ANY TABLE,
                           <row> TYPE ANY.

Regards

Uwe