ABAP 7.4 вышел уже очень давно, однако, его операторы мало кто использует. Рассмотрим сегодня оператор FILTER который позволяет выбирать данные из одной внутренней таблицы в другую по ключам.
Рассмотрим задачу, нам надо выбрать данные из одной внутренней таблицы lt_splfi в другую по ключу carrid = 'AA'.
Как обычно это делают:
1 2 3 4 5 6 7 8 |
DATA: lt_splfi TYPE STANDARD TABLE OF spfli. DATA: lt_splfi_result TYPE STANDARD TABLE OF spfli. SELECT * FROM spfli INTO TABLE lt_splfi. LOOP AT lt_splfi ASSIGNING FIELD-SYMBOL(<ls_splfi>) WHERE carrid = 'AA'. APPEND <ls_splfi> TO lt_splfi_result. ENDLOOP. |
Сделаем тоже самое с применение оператора FILTER.
1 2 3 4 |
DATA: lt_splfi_key TYPE STANDARD TABLE OF spfli WITH NON-UNIQUE SORTED KEY carrid COMPONENTS carrid. SELECT * FROM spfli INTO TABLE lt_splfi_key. DATA(lt_splfi_result_f1) = FILTER #( lt_splfi_key USING KEY carrid WHERE carrid = 'AA ' ). |
Так гораздо компактнее, но не критично. Реальный выигрыш получим если нам надо вытащить из исходной таблицы несколько строк по различным значениям ключа. Для этого создадим еще одну таблицу lt_filter_tab, в которой будем хранить необходимые нам ключи.
Было:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
DATA: lt_splfi TYPE STANDARD TABLE OF spfli. DATA: lt_splfi_result TYPE STANDARD TABLE OF spfli. DATA lt_filter_tab TYPE SORTED TABLE OF spfli WITH NON-UNIQUE KEY carrid connid. DATA ls_filter_tab TYPE spfli. SELECT * FROM spfli INTO TABLE lt_splfi. ls_filter_tab-carrid = 'LH '. ls_filter_tab-connid = '0401'. INSERT ls_filter_tab INTO TABLE lt_filter_tab. ls_filter_tab-carrid = 'LH '. ls_filter_tab-connid = '0402'. INSERT ls_filter_tab INTO TABLE lt_filter_tab. LOOP AT lt_splfi ASSIGNING FIELD-SYMBOL(<ls_splfi>). READ TABLE lt_filter_tab TRANSPORTING NO FIELDS WITH TABLE KEY carrid = <ls_splfi>-carrid connid = <ls_splfi>-connid. IF sy-subrc = 0. APPEND <ls_splfi> TO lt_splfi_result. ENDIF. ENDLOOP. |
Стало:
1 2 3 4 5 6 7 |
DATA: lt_splfi_key TYPE SORTED TABLE OF spfli WITH NON-UNIQUE KEY carrid connid. DATA: lt_filter_tab_new TYPE SORTED TABLE OF spfli WITH NON-UNIQUE KEY carrid connid. SELECT * FROM spfli INTO TABLE lt_splfi_key. lt_filter_tab_new = VALUE spfli_tab( carrid = 'LH ' ( connid = '0401' ) ( connid = '0402' ) ). DATA(lt_splfi_result_new) = FILTER #( lt_splfi_key IN lt_filter_tab_new WHERE carrid = carrid AND connid = connid ). |
Так уже гораздо компактнее.
Несколько особенностей оператора:
1. В условии WHERE нельзя использовать логические переменные NOT, OR и EQUIV;
2. Таблица фильтра должны быть SORTED или HASHED.