8

動的に作成する必要がある内部テーブルを読み取る方法を考え出そうとしています。動的な内部テーブルにデータを入力する次のレポートを作成しました。

最後の行で、キーを使用して読み取ろうとしていますが (mandtたとえば)、次の構文エラーが発生します。

指定されたタイプには構造がないため、MANDT と呼ばれるコンポーネントはありません

<any_tab>デバッグしたところ、正常にデータが取り込まれ、テーブルの構造 (フィールド名) が正しいことがわかります。テーブルを作業領域に読み込もうとすると、問題が発生します。たぶん私はこれを間違っているのかもしれませんが、それはできるはずのことのように思えますし、小さな何かが欠けていると感じています.

私がこれを試している理由は、プログラムで同じ選択が行われていることを発見し、レコードをメモリにバッファリングしてそこから読み取り、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.
4

5 に答える 5

5

フィールド名を括弧で囲むだけです。

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.
于 2012-05-29T17:53:40.687 に答える
2

データベースを効率的に打ち負かそうとしていますが、それは負け戦です。

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

于 2012-05-29T20:24:39.810 に答える
2

私の知る限り、「長い道のり」をしなければなりません:

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.
于 2012-05-29T15:54:16.200 に答える
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( ).
于 2012-05-31T13:19:05.420 に答える