Начиная с версии ABAP 7.40 мы можем считывать данные из таблиц через табличные выражения следующим образом:
1 2 3 4 5 |
TRY. ls_row = lt_itab[ id = lv_find_id ]. CATCH cx_sy_itab_line_not_found. " INTO DATA(lo_exception) " В случае отсутствия записи необходимо обработать исключение. ENDTRY. |
Однако такой вариант кроме того что является слишком длинным аналогом других, может оказывать существенное влияние на производительность в случае частого отсутствия записей, т.к. старт исключения довольно затратная операция. Альтернативные варианты могут быть следующими:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
" Все эти варианты не требуют обработки исключений в блоке TRY..CATCH ls_row = VALUE #( lt_itab[ id = lv_find_id ] OPTIONAL ). " IF ls_row IS NOT INITIAL... ls_row = VALUE #( lt_itab[ id = lv_find_id ] DEFAULT ls_default ). DATA(lr_row) = REF #( lt_itab[ id = lv_find_id ] OPTIONAL ). " IF lr_row IS BOUND... ASSIGN lt_itab[ id = lv_find_id ] TO FIELD-SYMBOL(<ls_row>). " IF sy-subrc = 0... READ TABLE lt_itab INTO row WITH KEY id = lv_find_id. " IF sy-subrc = 0... " Если нужно проверить только наличие записи DATA(lv_idx) = line_index( lt_itab[ id = lv_find_id ] ). READ TABLE lt_itab WITH KEY id = lv_find_id TRANSPORTING NO FIELDS. " IF sy-subrc = 0... |
Сравнение на примере: