2012-05-29 15 views
6

ben dinamik olarak oluşturulan gereken bir iç tablo okumak için bir yol bulmak çalışıyorum ile iTab okuma. Dinamik bir iç tabloyu verilerle dolduran aşağıdaki raporu oluşturdum. Son satırda bir anahtarla okumaya çalışıyorum (örneğin, mandt). Sorun şu ki, "belirtilen tipte bir yapı yok ve MANDT" diye bir bileşen yok.dinamik anahtar şartname

ben debug ve ben başarıyla doldurulan ve tablosunun yapısı (alan adları) doğru olup görebilirsiniz. Tabloyu bir çalışma alanına okumaya çalıştığımda sorun kendini gösteriyor. Belki bunu yanlış yapıyorum, ama mümkün olması gereken bir şey gibi görünüyor ve küçük bir şey eksik bir duygu var.

bunu dışarı çalışıyorum nedenim, bir programda oluyor özdeş seçer bulundu ve bellekte kayıtları tampon ve DB erişen önlemek için oradan okumak istiyorum olmasıdır. Bunu uygulamak kolaydır, ancak bunu yapmam, OPEN SQL deyiminin where yan tümcesi ve into yan tümcesi, dinamik olarak çalışıyor.

Şerefe.

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. 

cevap

1

AFAIK, sen 'yuvarlak uzun bir yol' bunu yapmak zorunda:

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

sadece parantez içinde alan adını koymak gerekir.

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

Merhaba Brian Cevabınız için teşekkürler. Bu işe yarıyor, ancak ben tamamen dinamik bir çözüm arıyorum. Pseudocode gibi bir şey: –

+0

Bir şey bu yorumdan eksik gibi görünüyor ... –

2

Verimlilikte bir veritabanını geçmeye çalışıyorsunuz, bu bir kaybedici savaştır.

Sadece SE11'e gidin, tablonuzu seçin, teknik ayarlara gidin ve teknik ayarları değiştirin (& arabelleğe alma türü), bunun için bir nesne değiştirme anahtarı gerektirmez. Boyut kategorisinin doğru olduğundan emin olabilirsiniz.

1

Sen tablo anahtarlarını almak için RTT'leri kullanabilirsiniz.

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.