Могу ли я проверить начальные или не равные значения с 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.
Другие вопросы по тегам