2012-05-29 7 views
6

Ich versuche einen Weg zu finden, eine interne Tabelle zu lesen, die dynamisch erstellt werden muss. Ich habe den folgenden Bericht erstellt, der eine dynamische interne Tabelle mit Daten füllt. In der letzten Zeile versuche ich es mit einem Schlüssel zu lesen (zB mandt). Das Problem ist, dass ich den Fehler bekomme, "der angegebene Typ hat keine Struktur und daher keine Komponente namens MANDT".Lesen von itab mit dynamischer Schlüsselspezifikation

Ich habe debugged und ich kann sehen, dass erfolgreich ausgefüllt wurde und die Struktur der Tabelle (Feldnamen) korrekt sind. Das Problem stellt sich, wenn ich versuche, die Tabelle in einen Arbeitsbereich zu lesen. Vielleicht mache ich das falsch, aber es scheint so etwas wie möglich zu sein, und ich habe das Gefühl, dass ich etwas Kleines vermisse.

Der Grund, warum ich das ausprobiere, ist, dass ich identische Selects in einem Programm gefunden habe und Datensätze im Speicher puffern und von dort lesen möchte, um DB-Zugriffe zu vermeiden. Dies ist einfach zu implementieren, aber ich habe dies nicht getan, wenn die Tabelle, where Klausel und into Klausel der OPEN SQL-Anweisung, die ich versuche zu optimieren sind dynamisch.

Prost.

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. 

Antwort

1

AFAIK, Sie haben es den 'Umweg' zu tun:

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

Sie müssen nur in Klammern den Namen des Feldes setzen.

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

Hallo Brian, vielen Dank für Ihre Antwort. Das funktioniert, aber ich suche eine voll dynamische Lösung. In Pseudocode so etwas wie: –

+0

Etwas scheint von diesem Kommentar zu fehlen ... –

2

Sie versuchen, eine Datenbank in der Effizienz zu schlagen, es ist eine verlustreiche Schlacht.

Gehen Sie einfach zu SE11, wählen Sie Ihre Tabelle, gehen Sie zu den technischen Einstellungen und ändern Sie die technischen Einstellungen (Pufferung & Pufferungsart), Sie benötigen hierfür keinen Objektänderungsschlüssel. Sie können auch sicherstellen, dass die Größenkategorie korrekt ist.

1

Sie können RTTS verwenden, um die Tabellenschlüssel abzurufen.

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