表理解:从内部表获取子集到另一个表

时间:2016-02-12 10:06:39

标签: sap subset abap

如主题所述,我想要一个内部的条件子集 另一个内部表中的表。

让我们先来看看它看起来像老式的方式。

DATA: lt_hugeresult TYPE tty_mytype,
      lt_reducedresult TYPE tty_mytype.  

SELECT "whatever" FROM "wherever" 
        INTO CORRESPONDING FIELDS OF TABLE lt_hugeresult 
          WHERE "any_wherecondition".
IF sy-subrc = 0.
  lt_reducedresult[] = lt_hugeresult[].
  DELETE lt_reducedresult WHERE col1 EQ 'a value'
                            AND col2 NE 'another value'
                            AND col3 EQ 'third value'.
 .
 .
 .


ENDIF.

我们都知道这一点。

现在我正在阅读有关减少内容的表格 abap 7.40,显然是SP8。

表格理解 - 功能性构建表格

表格驱动:

VALUE tabletype(FOR行IN选项卡WHERE(...)

(...... line- ...... line- ......) )

对于源表中的每个选定行,在结果表中构造一行。值构造函数从静态行到动态行的泛化。

我正在尝试这个,但结果似乎并不合适, 也许我做错了,或者我甚至可能需要条件驱动的方法。

那么,如果我想用表格理解技术编写上述语句,它会是什么样子?

到现在为止,我已经拥有了这个,而不是那个,我所需要的,而且我已经看到了 似乎,好像“不平等”是不可能的......

DATA(reduced) =  VALUE tty_mytype( FOR checkline IN lt_hugeresult
                                   WHERE ( col1 = 'a value' )
                                         ( col2 = 'another value' )
                                         ( col3 = space )
                                 ).

有人提示吗?

编辑:似乎仍然没有工作。就像我一样:

可执行行:

enter image description here

调试器结果:

enter image description here

错误减少:

enter image description here

现在是什么???

3 个答案:

答案 0 :(得分:3)

您可以使用FILTER运算符添加EXCEPT WHERE,以过滤掉与where子句匹配的所有行:

lt_reducedresult = FILTER # ( lt_hugeresult EXCEPT WHERE col1 = 'a value' 
                                                     AND col2 <> 'another value' 
                                                     AND col3 = 'a third value' ).

请注意,lt_hugeresult必须是一个排序表,而col1 / col2 / col3必须是关键组件(您可以使用指定二级密钥) USING KEY加法)。

documentation for FILTER明确指出:

  

也可以使用表格理解或表格缩减来执行表格过滤,其中迭代表达式用于使用FOR的表格迭代。操作员FILTER为这种特殊情况提供了缩短的格式,并且执行效率更高。

     

表过滤器逐行构造结果。如果结果几乎包含源表中的所有行,则此方法可能比复制源表和从目标表中删除多余行要慢。

因此,根据表格的大小,您使用DELETE的方法实际上可能是合适的。

答案 1 :(得分:2)

我将上述例子的老式语法与表格理解技术进行了比较,得到了完全相同的结果 实际上,您的示例不起作用,因为它缺少构造表reduced的行规范。 试试这个,对我有用。

DATA(reduced) =  VALUE tty_mytype( FOR checkline IN lt_hugeresult
                                WHERE ( col1 = 'a value' )
                                      ( col2 = 'another value' )
                                      ( col3 = space )
                               ( checkline )
                              ).

在上面的示例中,我们有最基本类型的结果行规范,其中绝对类似于源表。可以找到更复杂的示例,其中使用表迭代计算新表行,here

答案 2 :(得分:2)

由于括号组,使用WHERE时表迭代可能会很混乱。

&#34; NOT EQUAL&#34;条件得到了很好的支持,正如我在第一个例子的解决方案中所示。您观察到的问题是由于错误地使用了括号组。

你必须在WHERE Inside ONE括号组(一个或几个由逻辑运算符AND,OR等分隔的基本条件)之后绝对定义整个逻辑表达式。

在WHERE的括号组之后,通常只定义一个括号组,该括号组对应于要添加到目标内部表的行。您可以定义后续括号组,如果对于源内部表中的每一行,您要在目标内部表中添加多行。

在您的示例中,只有第一个括号组适用于WHERE(第一个示例中的col1 =&#39;值&#39;或者第二个示例中的insplot = _ilnum)。

后面的括号组对应于要添加的行,即在第一个示例中为每个源行添加了2行(col2 =&#39;另一个值&#39;一行,col3 =一行)在第二个例子中为每个源行添加了3行(一行有inspoper = i_evaluation-inspoper,一行有inspchar = i_evaluation-inspchar,一行对应于_single_results行)。

因此,您应该按如下方式编写代码。

第一个例子:

DATA(reduced) =  VALUE tty_mytype( FOR checkline IN lt_hugeresult
                                   WHERE (     col1 =  'a value' 
                                           AND col2 <> 'another value'
                                           AND col3 =  'third value'
                                         )
                                   ( checkline )
                                 ).

第二个例子:

DATA(singres) = VALUE tbapi2045d4( FOR checkline IN _single_results
                                   WHERE (     insplot = _ilnum
                                           AND inspoper = i_evaluation-inspoper
                                           AND inspchar = i_evaluation-inspchar 
                                         )
                                   ( checkline )
                                 ).