OpenSQL在动态INTO列表中的等效元素数

时间:2018-03-13 16:36:12

标签: abap

我正在尝试编写一个程序,该程序将从用户在选择屏幕上指定的表中的字段中获取内容。

例如,用户可以从表格equnr中指定字段b_werkb_lagereqbs

我已经能够这样做:

" 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_key1p_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子句?

3 个答案:

答案 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类型,其余逻辑由您决定(将通用和几乎为空的正确信息放到您的特定目的地)。