abap - 检查 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
?
解决方案
为了实现您想要的(我假设您想要动态 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
声明的情况下,此语句将抛出一个简短的转储。
推荐阅读
- sql-server - SSIS 错误:0xC002F210“查询太复杂。”。可能的失败原因:查询有问题,“ResultSet”属性设置不正确
- php - php,MySQL:如何显示 SELECT COUNT WHERE 结果?
- arduino - 如何使用 Arduino 通过 POST 请求连接到学校 wifi?
- c# - 通过交替元素合并 2 个列表
- r - R:更高效地将数据框拆分为列表
- vuejs2 - vue-test-utils & jest:如何测试单个文件组件过滤器?
- java - 如何解决自动化代码中的错误?
- django - has_object_permission 未调用
- python - PySpark 特征向量允许 NULL 值
- python - Python 2.7 和 Appengine ő/ű 字符显示为“?”