2012-05-29 6 views
6

動的に作成する必要がある内部テーブルを読み取る方法を試しています。私は動的な内部テーブルをデータで満たす次のレポートを作成しました。最後の行では、それをキー(例えばmandt)で読み取ろうとしています。問題は、 "指定されたタイプが構造体を持たないため、MANDTというコンポーネントがありません"というエラーが発生することです。動的キー指定でitabを読む

私はデバッグしましたが、正常に読み込まれ、テーブルの構造(フィールド名)が正しいことがわかります。テーブルを作業領域に読み込もうとすると、問題が発生します。たぶん、これは間違っているのですが、それは可能なはずのもののように思えます。

私がこれを試している理由は、プログラムで起こっている同じ選択があり、メモリにレコードをバッファしてそこから読み込んでDBアクセスを避けたいということです。これは実装が簡単ですが、私が最適化しようとしているOPEN SQL文のテーブルwhere句とinto句が動的である場合は、これを実行していません。

乾杯。

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. 

答えて

1

は私の知る限り、あなたはそれを「ラウンド長い道のりを」を実行する必要があります。

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

あなただけの括弧内のフィールド名を配置する必要があります。

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

こんにちはブライアン、お返事に感謝。しかし、私は完全に動的なソリューションを探しています。擬似コードのようなもの: –

+0

そのコメントから何かが見当たりません... –

2

あなたは効率的にデータベースを倒そうとしていますが、それは失われた戦いです。

SE11に行き、テーブルを選択し、技術設定に行き、技術的な設定(バッファリングタイプ&のバッファリング)を変更するだけで、このためのオブジェクト変更キーは必要ありません。また、サイズのカテゴリが正しいことを確認することもできます。

1

RTTSを使用してテーブルキーを取得できます。

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. 
関連する問題