|
Файловая система |
Open SQL |
ABAP |
Любое кол-во символов |
* |
% |
* |
Один любой символ |
? |
_ |
+ |
Давайте рассмотрим примеры поиска
SQL используется оператор LIKE
|
SELECT * FROM doktl WHERE id = 'SD' AND object LIKE 'AB%' AND langu = @sy-langu AND typ = 'E' INTO TABLE @DATA(text_tab) UP TO 100 ROWS. |
Внутренние таблицы ABAP используем оператор CP и NP для:
Чтение по маске:
|
TYPES: BEGIN OF lty_s_tmp, id type i, line type string, END OF lty_s_tmp, lty_t_tmp TYPE TABLE OF lty_s_tmp WITH DEFAULT KEY. DATA(lt_data) = VALUE lty_t_tmp( ( id = 1 line = 'data 100 data' ) ( id = 2 line = 'data 100* data' ) ( id = 3 line = 'data 100##' ) ). LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<ls_data0>) WHERE line CP '*100*' . ENDLOOP. |
Удаление по маске(проверить возможность установить CP NP)
и использовать RANGE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
types: begin of lty_itab, str type string, other_fields type string, end of lty_itab. data: lt_itab type standard table of lty_itab, lr_str type range of string, ls_str like line of lr_str. ls_str-sign = 'I'. ls_str-option = 'CP'. ls_str-low = 'sap*'. append ls_str to lr_str. delete lt_itab where str in lr_str. |
Эскейп символ.
Немного усложним задачу, что если в искомой строке уже будет специальный
символ. Например, мы хотим выбрать строку "В молоке 30% жирности"
Для этого и существуют дополнение ESCAPE. SAP рекомендует использоать символ "#"
Пример:
|
SELECT * FROM ZZZ_TEST_TAB INTO TABLE @DATA(lt_result) WHERE FIELD_1 LIKE '%30#%%' ESCAPE '#'. |
Для внутренних таблиц аналогично, но работает без дополнения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
TYPES: BEGIN OF lty_s_tmp, id type i, line type string, END OF lty_s_tmp, lty_t_tmp TYPE TABLE OF lty_s_tmp WITH DEFAULT KEY. DATA(lt_data) = VALUE lty_t_tmp( ( id = 1 line = 'data 100 data' ) ( id = 2 line = 'data 100* data' ) ( id = 3 line = 'data 100##' ) ). LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<ls_data0>) WHERE line CP '*100#**' . ENDLOOP. "где #* означает символ *, а последняя * - любое количество символов LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<ls_data1>) WHERE line CP '*100####' . ENDLOOP. |