首页 > 解决方案 > 检查 WHERE 子句中 STRING_TABLE 中的值

问题描述

我有一个带有参数的程序IT_ATINN

IMPORTING 
    REFERENCE(IT_ATINN) TYPE  STRING_TABLE

IT_ATINN包含特征列表。

我有以下代码:

LOOP AT values_tab INTO DATA(value).
   SELECT ( @value-INSTANCE ) AS CUOBJ
   FROM  IBSYMBOL
   WHERE SYMBOL_ID = @value-SYMBOL_ID 
     AND ATINN ???                       "<======== HERE ???
   APPENDING TABLE @DATA(ibsymbol_tab).
ENDLOOP.

如何检查ATINN(在 WHERE 子句中)是否等于中的任何条目IT_ATINN

标签: abapopensql

解决方案


为了实现您想要的(我假设您想要动态 SELECT 字段),您不能在此处使用内联声明,无论是在 LOOP 还是在 SELECT 中:

结果集的结构必须是静态可识别的。SELECT 列表和 FROM 子句必须静态指定,并且 SELECT 列表中的主变量不能是通用的。

因此,您要么使用内联,要么使用动态,而不是两者兼而有之。

这是说明 Sandra 好建议的片段:

TYPES: BEGIN OF ty_value_tab,
        instance  TYPE char18,
        symbol_id TYPE id,
       END OF ty_value_tab.

DATA: it_atinn TYPE string_table.

DATA: rt_atinn     TYPE RANGE OF atinn,
      value        TYPE ty_value_tab,
      values_tab   TYPE RANGE OF ty_value_tab,
      ibsymbol_tab TYPE TABLE OF ibsymbol.

rt_atinn = VALUE #( FOR value_atinn IN it_atinn ( sign = 'I' option = 'EQ' low = value_atinn ) ).

APPEND VALUE ty_value_tab( instance = 'ATWRT' ) TO values_tab.
LOOP AT values_tab INTO value.
  SELECT (value-instance)
    FROM ibsymbol
   WHERE symbol_id = @value-symbol_id
     AND atinn IN @rt_atinn
  APPENDING CORRESPONDING FIELDS OF TABLE @ibsymbol_tab.
ENDLOOP.

总的来说,在循环中选择是没有意义ibsymbol的,因为它只有 8 个字段,因此您可以轻松地从中收集所有必要的字段values_tab并将它们作为动态字段字符串传递。

如果你想为你的动态字段使用别名 CUOBJ,你应该像这样添加它:

LOOP AT values_tab INTO value.
  DATA(aliased_value) = value-instance && ` AS cuobj `.
  SELECT (aliased_value)
...

请记住,您的别名应该存在于ibsymbol字段中,否则在静态ibsymbol_tab声明的情况下,此语句将抛出一个简短的转储。


推荐阅读