如主题所述,我想要一个内部的条件子集 另一个内部表中的表。
让我们先来看看它看起来像老式的方式。
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 )
).
有人提示吗?
编辑:似乎仍然没有工作。就像我一样:可执行行:
调试器结果:
错误减少:
现在是什么???
答案 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
加法)。
也可以使用表格理解或表格缩减来执行表格过滤,其中迭代表达式用于使用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 )
).