How to set dynamic key for READ TABLE?
Solution 1
You just need to put the field name in parentheses.
data: field type string.
field = 'MANDT'.
READ TABLE <any_tab> ASSIGNING <any_wa> WITH KEY (field) = '800'.
IF sy-subrc = 0.
"do stuff with <any_wa>...
ENDIF.
Solution 2
AFAIK, you have to do it the 'long way round':
FIELD-SYMBOLS: <any_field> TYPE any.
LOOP AT <any_tab> ASSIGNING <any_wa>.
ASSIGN COMPONENT 'MANDT' OF STRUCTURE <any_wa> TO <any_field>.
IF <any_field> <> 800.
CONTINUE.
ENDIF.
" do stuff with <any_wa> - you will have to assign <any_field> again to access fields.
ENDLOOP.
Solution 3
You are trying to beat a database in efficiency, it is a loosing battle.
Just go to SE11, select your table, go to technical settings and change the technical settings ( buffering & buffering type ), you do not require an object modification key for this. You can also make sure that the size category is correct.
Solution 4
You can use RTTS to get the table keys.
data table_name type string.
table_name = 'A002'.
" Dynamically create the table type
data the_table type ref to data.
create data the_table type table of (table_name).
" Use RTTS to get table keys
data typedescription type ref to cl_abap_tabledescr.
typedescription ?= cl_abap_tabledescr=>describe_by_data_ref( the_table ).
data keys type abap_table_keydescr_tab.
keys = typedescription->get_keys( ).
B. Bowles
Graduate CoE Support Engineer at SAP. Currently studying ABAP performance optimisation, part time BSP development :)
Updated on December 27, 2020Comments
-
B. Bowles over 3 years
I'm trying to work out a way to read an internal table that has to be created dynamically. I have created the following report that fills a dynamic internal table with data.
On the last line, I'm trying to read it with a key (
mandt
for example), but I I get this syntax error:The specified type has no structure and therefore no component called MANDT
I have debugged and I can see that
<any_tab>
has been populated successfully and the structure of the table (field names) are correct. The problem presents itself when I try to read the table into a work area. Maybe I'm doing this wrong, but it seems like something that should be possible to do, and I have a feeling I'm missing something small.The reason I am trying this out is that I have found identical selects happening in a program and want to buffer records in memory and read them from there to avoid DB accesses. This is easy to implement, however I haven't done this when the table,
where
clause andinto
clause of the OPEN SQL statement I'm trying to optimize are dynamic.How to correct the syntax error?
DATA: t681_rep TYPE TABLE OF t681 , wa_681 LIKE LINE OF t681_rep, tabref TYPE REF TO data , waref TYPE REF TO data. FIELD-SYMBOLS: <any_tab> TYPE ANY TABLE, <any_wa> TYPE ANY, <var1> TYPE ANY. "fill t681_rep SELECT * FROM t681 INTO TABLE t681_rep UP TO 1 ROWS WHERE kotab = 'A002'. READ TABLE t681_rep INTO wa_681 WITH KEY kotab = 'A002'. IF sy-subrc = 0. "if A002 is found create a table of that type and fill it CREATE DATA tabref TYPE TABLE OF (wa_681-kotab). ASSIGN tabref->* TO <any_tab>. SELECT * UP TO 10 ROWS FROM (wa_681-kotab) INTO TABLE <any_tab>. ENDIF. CREATE DATA waref TYPE a002. ASSIGN waref->* TO <any_wa>. READ TABLE <any_tab> ASSIGNING <any_wa> WITH KEY mandt = '800'. <- problem area IF sy-subrc = 0. "do stuff with <any_wa>... ENDIF.