2012-05-29 13 views
6

Próbuję znaleźć sposób na odczyt wewnętrznej tabeli, która musi być tworzona dynamicznie. Utworzono następujący raport, który wypełnia dynamiczną wewnętrzną tabelę danymi. W ostatnim wierszu próbuję go odczytać za pomocą klucza (na przykład). Problem polega na tym, że pojawia się błąd "określony typ nie ma struktury i dlatego nie ma składnika o nazwie MANDT".Czytanie ze specyfikacji dynamicznego klucza

Mam debugowane i widzę, że zostało pomyślnie wypełnione, a struktura tabeli (nazwy pól) są poprawne. Problem pojawia się, gdy próbuję odczytać tabelę w obszarze roboczym. Może robię to źle, ale wydaje mi się, że coś powinno być możliwe do zrobienia i mam wrażenie, że brakuje mi czegoś małego.

Powodem, dla którego to wypróbowuję, jest to, że znalazłem identyczne selekcje w programie i chcę buforować rekordy w pamięci i czytać je stamtąd, aby uniknąć dostępu do bazy danych. Jest to łatwe do wdrożenia, jednak nie zrobiłem tego, gdy klauzula o klauzuli where i klauzula into instrukcji OPEN SQL, którą próbuję zoptymalizować, są dynamiczne.

Pozdrawiam.

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. 

Odpowiedz

1

AFAIK, trzeba to zrobić w '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. 
3

Wystarczy umieścić nazwę pola w nawiasach.

+0

Cześć Brian, dzięki za odpowiedź. To działa, jednak szukam w pełni dynamicznego rozwiązania. W pseudokodowaniu coś takiego: –

+0

Coś wydaje się być brakuje w tym komentarzu ... –

2

Próbujesz pokonać bazę danych pod względem wydajności, to przegrana bitwa.

Po prostu przejdź do SE11, wybierz tabelę, przejdź do ustawień technicznych i zmień ustawienia techniczne (buforowanie & rodzaj buforowania), nie potrzebujesz do tego klucza modyfikacji obiektu. Możesz także upewnić się, że kategoria rozmiaru jest poprawna.

1

Możesz użyć RTTS, aby uzyskać klucze do tabeli.

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(). 
0
REPORT y_test_dynamic_table. 
DATA: table_name TYPE string, 
typedescription TYPE REF TO cl_abap_tabledescr, 
keys TYPE abap_keydescr_tab, 
ls_key TYPE abap_keyname. 

table_name = 'ZYFRM_STG'. 

" 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 

typedescription ?= cl_abap_tabledescr=>describe_by_data_ref(the_table). 

keys = typedescription->KEY. 

loop at keys INTO ls_key. 
*** 
ENDLOOP. 
Powiązane problemy