代码之家  ›  专栏  ›  技术社区  ›  gkubed Sergei Grigoriev

OpenSQL中的Dynamic INTO子句?

  •  1
  • gkubed Sergei Grigoriev  · 技术社区  · 6 年前

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

    例如,用户可以指定字段 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.
    

    这将激活,当我进入打开的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语句 包含动态条目。分析器返回以下错误: “字段列表和输入列表必须具有相同的 元素。“”

    我是否可以使用新的开放式SQL语法来实现与动态字段列表协调的动态INTO子句?

    3 回复  |  直到 4 年前
        1
  •  4
  •   Gert Beukema    6 年前

    上的支架 INTO 不要做您期望的事情,从ABAP帮助:

    。。。进入(@dobj1,@dobj2,…)

    效应

    如果结果集由选择列表中明确指定的多列或聚合表达式组成,则会显示基本数据对象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.
    
        2
  •  2
  •   Sandra Rossi    6 年前

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

    所以 相反 对于使用相应字段,您可以动态创建一个结构(RTTC),其组件与LV\u FIELD\u选项卡中的列相对应,然后您可以使用:

    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动态创建数据对象

        3
  •  1
  •   VXLozano    6 年前

    不要将字段列表用于INTO子句。

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

    任何表都必须是FIELD-SYMBOL类型,其余的逻辑由您决定(将适当的信息从泛型和几乎为空的信息放到特定的目标表中)。