我试图编写一个程序,该程序将从用户在选择屏幕上指定的表中获取字段中的内容。
例如,用户可以从表equnr指定字段eqbs、b_werk、b_lager。
我就这样做到了:
" 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查询(从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语句。解析器返回以下错误:“字段列表和INTO列表必须有相同数量的元素。”
我是否可以使用新的Open语法来完成我的dynamic子句,并与我的动态字段列表保持一致?
发布于 2018-03-13 19:00:03
INTO上的括号没有做您期望的事情,来自ABAP帮助:
...进入( @dobj2 1,@dobj2 2,. )
效应
如果结果集由在SELECT列表中显式指定的多列或聚合表达式组成,则基本数据对象dobj1、dobj2、.(括号中用逗号分隔)可以在INTO之后指定。
在您的示例中,只有一个值,所以只能选择一个列,数据将在变量LV_RESULT中传递。不是你要找的东西。由于您希望填充现有结构的字段,所以INTO CORRESPONDING FIELDS OF构造将在这里工作。您也可以使用TABLE来提高命令的效率。这导致:
SELECT (lv_field_tab) FROM (p_table)
INTO CORRESPONDING FIELDS OF TABLE @lt_zca_str_to_char.发布于 2018-03-13 20:24:48
如前所述,您可以在相应的.字段中使用,但这不是强制性的,它只是为了简化代码。
因此,可以使用而不是来使用相应的字段,您可以动态地创建一个结构(RTTC),它的组件对应于LV_FIELD_TAB中的列,然后可以使用:
SELECT (lv_field_tab) FROM (p_table) INTO @<structure> ... ENDSELECT.当然,正如Gert Beukema所解释的,您最好只做一个选择,方法是动态创建一个内部表,其逻辑与上面的结构相同,然后您可以使用:
SELECT (lv_field_tab) FROM (p_table) INTO TABLE @<internal table> ...请参阅web 中的许多示例,如何使用RTTC动态创建数据对象。
发布于 2018-03-13 16:47:55
不要为INTO子句使用字段列表。
使用表的相应字段进行尝试
必须是字段符号类型的任何表,其余的逻辑取决于您(将正确的信息从您的通用和几乎-空到您的特定目标之一)。
https://stackoverflow.com/questions/49261376
复制相似问题