8

我正在尝试找出一种方法来读取必须动态创建的内部表。我创建了以下报告,该报告用数据填充动态内部表。

在最后一行,我试图用一个键(mandt例如)读取它,但我得到这个语法错误:

指定的类型没有结构,因此没有称为 MANDT 的组件

我已经调试过了,我可以看到<any_tab>已经成功填充并且表的结构(字段名称)是正确的。当我尝试将表格读入工作区时,问题就出现了。也许我做错了,但这似乎是应该可以做的事情,而且我觉得我错过了一些小东西。

我尝试这个的原因是我发现程序中发生了相同的选择,并希望在内存中缓冲记录并从那里读取它们以避免数据库访问。这很容易实现,但是当我尝试优化的 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

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.
于 2012-05-29T15:54:16.200 回答
2

您试图在效率上击败数据库,这是一场失败的战斗。

只需转到 SE11,选择您的表,转到技术设置并更改技术设置(缓冲和缓冲类型),您不需要对象修改键。您还可以确保尺寸类别正确。

于 2012-05-29T20:24:39.810 回答
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 回答
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.
于 2013-09-10T20:51:55.427 回答