首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenSQL中的动态进入子句?

OpenSQL中的动态进入子句?
EN

Stack Overflow用户
提问于 2018-03-13 16:36:12
回答 3查看 921关注 0票数 1

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

例如,用户可以从表equnr指定字段eqbsb_werkb_lager

我就这样做到了:

代码语言:javascript
复制
" 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_key2p_key3。我可以根据用户提供多少个关键字段来执行不同的选择语句,但是其中的乐趣是什么呢?

我打算这样解决这个问题:

代码语言:javascript
复制
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子句,并与我的动态字段列表保持一致?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-13 19:00:03

INTO上的括号没有做您期望的事情,来自ABAP帮助:

...进入( @dobj2 1,@dobj2 2,. )

效应

如果结果集由在SELECT列表中显式指定的多列或聚合表达式组成,则基本数据对象dobj1、dobj2、.(括号中用逗号分隔)可以在INTO之后指定。

在您的示例中,只有一个值,所以只能选择一个列,数据将在变量LV_RESULT中传递。不是你要找的东西。由于您希望填充现有结构的字段,所以INTO CORRESPONDING FIELDS OF构造将在这里工作。您也可以使用TABLE来提高命令的效率。这导致:

代码语言:javascript
复制
SELECT (lv_field_tab) FROM (p_table) 
       INTO CORRESPONDING FIELDS OF TABLE @lt_zca_str_to_char.
票数 4
EN

Stack Overflow用户

发布于 2018-03-13 20:24:48

如前所述,您可以在相应的.字段中使用,但这不是强制性的,它只是为了简化代码。

因此,可以使用而不是来使用相应的字段,您可以动态地创建一个结构(RTTC),它的组件对应于LV_FIELD_TAB中的列,然后可以使用:

代码语言:javascript
复制
SELECT (lv_field_tab) FROM (p_table) INTO @<structure> ... ENDSELECT.

当然,正如Gert Beukema所解释的,您最好只做一个选择,方法是动态创建一个内部表,其逻辑与上面的结构相同,然后您可以使用:

代码语言:javascript
复制
SELECT (lv_field_tab) FROM (p_table) INTO TABLE @<internal table> ...

请参阅web 中的许多示例,如何使用RTTC动态创建数据对象。

票数 2
EN

Stack Overflow用户

发布于 2018-03-13 16:47:55

不要为INTO子句使用字段列表。

使用表的相应字段进行尝试

必须是字段符号类型的任何表,其余的逻辑取决于您(将正确的信息从您的通用和几乎-空到您的特定目标之一)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49261376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档