循环遍历表名称的内部表,并在select语句中搜索每个表

时间:2017-07-11 13:14:43

标签: abap opensql

我正在尝试搜索8个表并检查是否存在某个值。我搜索了很多,我认为我必须使用字段符号和动态语句。这是在报告(可执行程序)中完成的。 到目前为止,我有我的内部表,填充了必须搜索的表的8个表名:

BEGIN OF lt_tables_to_search_coll OCCURS 0,
      name TYPE tabname,
    END OF lt_tables_to_search_coll.
lt_tables_to_search_coll-name = 'TAB_01'. 
APPEND lt_tables_to_search_coll.
lt_tables_to_search_coll-name = 'TAB_02'. 
APPEND lt_tables_to_search_coll.
lt_tables_to_search_coll-name = 'TAB_03'. 
APPEND lt_tables_to_search_coll.
lt_tables_to_search_coll-name = 'TAB_04'. 
APPEND lt_tables_to_search_coll.
lt_tables_to_search_coll-name = 'TAB_05'. 
APPEND lt_tables_to_search_coll.
lt_tables_to_search_coll-name = 'TAB_06'. 
APPEND lt_tables_to_search_coll.
lt_tables_to_search_coll-name = 'TAB_07'. 
APPEND lt_tables_to_search_coll.
lt_tables_to_search_coll-name = 'TAB_08'. 
APPEND lt_tables_to_search_coll.

所以现在我想我做一个循环来回顾这个表。在这个循环中,我进入select语句并将找到的值添加到先前声明的表中。

我尝试的是:

PARAMETERS: p_id    TYPE "id-type"

START-OF-SELECTION.

LOOP AT lt_tables_to_search_coll.
DATA: lv_current_table VALUE lt_tables_to_search_coll-name.

  SELECT tabname AS table_id ddtext AS table_description 
    COUNT(*) AS nr_of_records  FROM (lv_current_table)
  INTO TABLE lt_where_used_data_of_coll
  WHERE id = p_id AND ddlanguage = 'EN'
  GROUP BY tabname ddtext.

ENDLOOP.

当我运行这个时,我得到的错误是lt_tables_to_search_coll-name不是常量。我想知道我应该实现我想做的事情。

2 个答案:

答案 0 :(得分:1)

  

当我运行它时,我得到的错误是lt_tables_to_search_coll-name不是常量。

声明DATA: lv_current_table VALUE lt_tables_to_search_coll-name.无效。仅当右侧是常量值(例如数字或字符串)时才可以使用VALUE加法。

您可以正常声明lv_current_table(为其指定类型),然后为其指定lt_tables_to_search_coll-name的值。

令人遗憾的是,ABAP在表达方面不像其他语言那么灵活。

  

我想知道我应该实施我想做的事情。

最好使用DATA()将表格循环到动态结构中以完全缓解声明。

PARAMETERS: p_id    TYPE "id-type"

START-OF-SELECTION.

LOOP AT lt_tables_to_search_coll INTO DATA(ls_tables_to_search_coll).

  SELECT tabname AS table_id ddtext AS table_description 
    COUNT(*) AS nr_of_records  FROM (ls_tables_to_search_coll-name)
  INTO TABLE lt_where_used_data_of_coll
  WHERE id = p_id AND ddlanguage = 'EN'
  GROUP BY tabname ddtext.

ENDLOOP.

答案 1 :(得分:0)

了解LOOP syntax。您不应在每次迭代中声明lv_current_table。使用方式如下:

LOOP AT lt_tables_to_search_coll INTO DATA(lv_current_table).

相应地,您的FROM将是

FROM (lv_current_table-name)