動的に作成する必要のある内部テーブルを読み取る方法を見つけようとしています。動的内部テーブルにデータを入力する次のレポートを作成しました。
最後の行で、キー(mandt
など)を使用して読み取ろうとしていますが、次の構文エラーが発生します。
指定されたタイプには構造がないため、MANDTと呼ばれるコンポーネントはありません。
デバッグしましたが、<any_tab>
が正常に入力され、テーブルの構造(フィールド名)が正しい。テーブルを作業領域に読み込もうとすると、問題が発生します。間違っているのかもしれませんが、できるはずのことのようで、小さなものが足りない気がします。
私がこれを試している理由は、プログラムで同じ選択が発生していることを発見し、DBアクセスを回避するために、レコードをメモリにバッファリングしてそこから読み取る必要があるためです。これは簡単に実装できますが、最適化しようとしているOPENSQLステートメントのテーブル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.
フィールド名を括弧で囲む必要があります。
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.
AFAIK、あなたはそれを「長い道のり」でやらなければなりません:
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.
あなたは効率的にデータベースを打ち負かそうとしています、それは敗戦です。
SE11に移動し、テーブルを選択し、技術設定に移動して、技術設定(バッファリングおよびバッファリングタイプ)を変更するだけです。このためのオブジェクト変更キーは必要ありません。サイズカテゴリが正しいことを確認することもできます。
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( ).
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.