我正在尝试编写一个程序,该程序将从用户在选择屏幕上指定的表中的字段中获取内容。
例如,用户可以从表格equnr
中指定字段b_werk
,b_lager
,eqbs
。
我已经能够这样做:
" Determine list of fields provided by user
DATA(lv_fields) = COND string(
WHEN p_key3 IS NOT INITIAL AND p_string IS NOT INITIAL THEN
|{ p_key1 }, { p_key2 }, { p_key3 }, { p_string }|
WHEN p_key2 IS NOT INITIAL AND p_string IS NOT INITIAL THEN
|{ p_key1 }, { p_key2 }, { p_string }|
WHEN p_key2 IS NOT INITIAL AND p_string IS NOT INITIAL THEN
|{ p_key1 }, { p_string }| ).
DATA: lv_field_tab TYPE TABLE OF line.
APPEND lv_fields TO lv_field_tab.
" Determine table specified by user and prepare for Open SQL query
DATA t_ref TYPE REF TO data.
FIELD-SYMBOLS: <t> TYPE any,
<comp> TYPE any.
CREATE DATA t_ref TYPE (p_table).
ASSIGN t_ref->* TO <t>.
ASSIGN COMPONENT lv_fields OF STRUCTURE <t> TO <comp>.
" Prepare result container
DATA: lt_zca_str_to_char TYPE TABLE OF zca_str_to_char,
ls_zca_str_to_char TYPE zca_str_to_char.
SELECT (lv_field_tab) FROM (p_table) INTO (@ls_zca_str_to_char-key1, @ls_zca_str_to_char-key2, @ls_zca_str_to_char-key3, @ls_zca_str_to_char-string).
APPEND ls_zca_str_to_char TO lt_zca_str_to_char.
ENDSELECT.
这将使用用户指定的表中的数据正确填充lt_zca_str_to_char
。
但是,这意味着用户始终提供p_key1
,p_key2
,和 p_key3
。我可以根据用户提供的关键字段数来执行不同的选择语句,但有什么好处呢?
我打算这样解决这个问题:
DATA(lv_results) = COND string(
WHEN p_key3 IS NOT INITIAL AND p_string IS NOT INITIAL THEN
|(@ls_zca_str_to_char-key1, @ls_zca_str_to_char-key2, @ls_zca_str_to_char-key3, @ls_zca_str_to_char-string)|
WHEN p_key2 IS NOT INITIAL AND p_string IS NOT INITIAL THEN
|(@ls_zca_str_to_char-key1, @ls_zca_str_to_char-key2, @ls_zca_str_to_char-string)|
WHEN p_key2 IS NOT INITIAL AND p_string IS NOT INITIAL THEN
|(@ls_zca_str_to_char-key1, @ls_zca_str_to_char-string)| ).
SELECT (lv_field_tab) FROM (p_table) INTO (@lv_results).
APPEND ls_zca_str_to_char TO lt_zca_str_to_char.
ENDSELECT.
这将激活,当我进入Open SQL查询时(从Z表中只填写三个可能的关键字段中的前两个),值如下:
lv_field_tab
= GUID, TEXT_ID, TEXT_DATA
(好)
p_table
= ZCR_TRANS_TEXT
(好)
lv_results
= (@ls_zca_str_to_char-key1, @ls_zca_str_to_char-key2, @ls_zca_str_to_char-string)
(好,3 = 3!)
但是,由于我假设编译器将(@lv_results)
视为一个单一变量,程序转储时出现以下错误:
当前的ABAP程序试图执行Open SQL语句 包含动态条目。解析器返回以下错误: “字段列表和INTO列表必须具有相同的编号 元素“。
我是否可以使用新的Open SQL语法来完成与动态字段列表协调的动态INTO子句?
答案 0 :(得分:4)
INTO
上的括号不符合您的期望,来自ABAP帮助:
... INTO(@ dobj1,@ dobj2,...)
效果
如果结果集由SELECT列表中显式指定的多个列或聚合表达式组成,则可以在INTO之后指定基本数据对象dobj1,dobj2,...(在括号中并用逗号分隔)的列表。
在您的情况下,您只有一个值,因此您只能选择一列,数据将在变量LV_RESULT
中传递。不是你想要的。由于您要填充现有结构的字段,因此INTO CORRESPONDING FIELDS OF
构造将在此处起作用。并且您可以使用TABLE
来提高命令效率。这导致:
SELECT (lv_field_tab) FROM (p_table)
INTO CORRESPONDING FIELDS OF TABLE @lt_zca_str_to_char.
答案 1 :(得分:2)
如前所述,您可以使用INTO对应字段...,但它不是强制性的,它仅用于简化代码。
所以,而不是使用CORRESPONDING FIELDS,您可以动态创建一个结构(RTTC),其组件对应于LV_FIELD_TAB中的列,然后您可以使用:
SELECT (lv_field_tab) FROM (p_table) INTO @<structure> ... ENDSELECT.
但是,正如Gert Beukema所解释的那样,你最好只做一个SELECT,通过动态创建一个内部表,使用与上面结构相同的逻辑,然后你可以使用:
SELECT (lv_field_tab) FROM (p_table) INTO TABLE @<internal table> ...
请参阅网络中的许多示例如何使用RTTC动态创建数据对象。
答案 2 :(得分:1)
不要为INTO子句使用字段列表。
试试 INTO相应的表格领域
必须是任何表的FIELD-SYMBOL类型,其余逻辑由您决定(将通用和几乎为空的正确信息放到您的特定目的地)。