Могу ли я проверить начальные или не равные значения с line_exists?
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
Какой будет наиболее сжатый альтернативный подход?
4 ответа
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, не более того. Все правила и ограничения, включая допустимый тип сравнения, также применяются к выражениям.
Проверьте блог Х. Келлера для получения более подробной информации.
Немного поздно. Но теперь вы можете сделать следующее:
xsdbool( line_exists( lt_itab[ Country = 'DK' ] ) ) = abap_false
Чуть позже, вот еще один (более короткий) способ сделать то же самое, что и в ответе Андреаса:
IF NOT line_exists( lt_itab[ country = 'DK' ] ).
Однако это проверяет, нет ли в таблице строки , равной DK. Он НЕ проверяет, есть ли какая-либо строка, не равная DK. Если вы хотите второе, вы должны прибегнуть к LOOP, как указал Йожеф. Или вы можете сжать его в одну строку следующим образом:
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.