ABAP 7.40 添加了line_exists( ... )
谓词函数来分析内部表。但是有什么方法可以检查是否存在特定列为初始值或与目标值不同的行?
例如,如何检查具有初始材料列的行,如此表中的第三行?
Document Country Material
9001287 US 198572111
9001296 FR 160023941
9001297 EG
9001299 DK 873001102
我可以检查带有line_exists( lt_itab[ Country = 'DK' ] )
的丹麦条目,line_exists( lt_itab[ Material = '' ] )
是有效的,但<>
和NE
似乎都没有被接受。例如,似乎也没有办法检查国家/地区不是"FR"的行?
如果没有办法用line_exists
做到这一点,最浓缩的替代方法是什么?
LOOP 是一种检查方法,我不知道是否有更好的方法:
LOOP AT itab
TRANSPORTING NO FIELDS
WHERE country NE 'FR'.
EXIT.
ENDLOOP.
IF sy-subrc EQ 0.
" line exists
ELSE.
" line does not exist
ENDIF.
不,你不能。
line_exists是简单的谓词函数,它只接受表表达式tab[ a = b ]
。而且,正如我们所知,表表达式只是 READ TABLE 的新语法,仅此而已。所有规则和约束(包括允许的比较类型(也应用于表达式。
查看H. Keller的博客了解更多详情。
有点晚了。但是现在您可以执行以下操作:
xsdbool( line_exists( lt_itab[ Country = 'DK' ] ) ) = abap_false
稍后,这是另一种(更短的(方法可以做与Andreas的答案相同的事情:
IF NOT line_exists( lt_itab[ country = 'DK' ] ).
但是,这将测试表中是否没有等于DK 的行。它不测试是否有任何不等于 DK 的线。 如果你想要第二件事,你必须求助于LOOP,正如József指出的那样。或者你可以像这样把它压缩成一行:
IF lines( VALUE type( FOR x IN lt_itab WHERE ( country <> 'DK' ) ( x ) ) ) > 0.
不幸的是,你不能使用VALUE #( )
,所以你必须输入lt_itab
的类型 .
如果国家是主键,另一种可能性是
IF lines( FILTER #( lt_itab WHERE country <> 'DK' ) ) > 0.
如果国家/地区只是次要键,您可以这样做
IF lines( FILTER #( lt_itab USING KEY country WHERE country <> 'DK' ) ) > 0.