5

如主题中所述,我希望在另一个内部表中拥有一个内部表的条件子集。

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

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 line IN tab WHERE ( … )

(……线-…………线-…………))

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

我正在对此进行试验,但结果似乎并不适合,也许我做错了,或者我什至可能需要条件驱动的方法。

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

到现在为止,我有这个,而不是提供我需要的东西,而且我已经看到,似乎“不相等”是不可能的......

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

有人有一些提示吗?

编辑:似乎仍然无法正常工作。这是,就像我这样做:

可执行行:

在此处输入图像描述

调试器结果:

在此处输入图像描述

错误减少:

在此处输入图像描述

现在怎么办 ???

4

3 回答 3

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)。col3USING KEY

FILTER的文档明确指出:

表过滤也可以使用表推导或表缩减来执行,并使用 FOR 表迭代的迭代表达式进行表缩减。运算符 FILTER 为这种特殊情况提供了一种缩短的格式,并且执行起来更高效。

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

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

于 2016-02-15T10:55:52.910 回答
2

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

“不等于”条件得到很好的支持,正如我在下面第一个示例的解决方案中所示。您观察到的问题是由于括号组使用不当造成的。

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

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

在您的示例中,只有第一个括号组适用于 WHERE(第一个示例中的 col1 = 'a value' 或第二个示例中的 insplot = _ilnum)。

后面的括号组对应于要添加的行,即第一个例子中每个源代码行添加2行(col2 ='another value'的一行,col3 = space的一行),添加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 )
                                 ).
于 2018-02-04T10:19:33.863 回答
1

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

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

在上面的示例中,我们有最基本的结果行规范类型,它与源表绝对相似。可以在此处找到更复杂的示例,其中使用表迭代评估新表行。

于 2016-02-12T11:57:14.113 回答