Разбить строку ABAP SUBSTRING можно множеством вариантов. Разбиения строки на части в зависимости от поставленной задачи.
Есть задачи в которых есть необходимость выделить подстроку из строки по определённым критериям. Для решения данной задачи отлично подходит функция substring с множеством своих вариантов. Рассмотрим подробнее каждый из них:
Разбиение строки ABAP с примерами
SUBSTRING – Обрезать строку SAP
Функция SUBSTRING возвращает подстроку длины равной len при этом берёт данную строку с отступом равным off.
1 |
lv_substring = substring( val = 'ABCDEFGH' off = 2 len = 2 ). " CD |
В нашем случае результатом выполнения функции будет: CD
Есть более краткая форма записи этого выражения, если входящий параметр для обработки это переменная, а не статическая строка.
1 2 3 |
DATA(lv_text) = |20-04-2020|. DATA(lv_youcoder) = lv_text+6(4). lv_youcoder = substring( val = lv_text off = 6 len = 4 ). |
Результатом выделения подстроки будет строка: 2020. Как для первого так и для второго выражения.
Важным ограничением этого способа является то, что если при обращении к строке происходит выход за её границы произойдёт ошибка. Пример ошибочного обращения:
1 |
lv_youcoder = substring( val = lv_text off = 6 len = 5 ). |
SUBSTRING_FROM – выделить подстроку ABAP начиная с символа
Возвращает подстроку начиная с первого вхождения символов sub включая эти символы и до конца строки. По результату получим: EFGH
1 |
lv_substring = substring_after( val = 'ABCDEFGH' sub = 'CD' ). " EFGH |
SUBSTRING_BEFORE – обрезать строку ABAP
Возвращает подстроку начиная с первого символа строки до первого вхождения символов sub НЕ включая эти символы.
По результату получим: AB
1 |
lv_substring = substring_before( val = 'ABCDEFGH' sub = 'CD' ). " AB |
SUBSTRING_TO – обрезать строку ABAP
Возвращает подстроку начиная с первого символа строки до первого вхождения символов sub включая эти символы.
По результату получим: ABCD
1 |
lv_substring = substring_to( val = 'ABCDEFGH' sub = 'CD' ). " ABCD |
SPLIT – разбить строку ABAP на несколько
Так же бывают задачи разбиения одной строки на несколько подстрок.
Разбиение строки оператором SPLIT по заданному разделителю
1 |
DATA(lv_dom_http) = 'https://youcoder.ru'. SPLIT lv_img_http AT '://' INTO: DATA(lv_http) DATA(lv_dom_http). |
По итогу выполнения программы переменным будут присвоены следующие значения:
1 |
lv_http = 'https'. lv_dom_http = 'youcoder.ru'. |
Шаблоны как азбить строку ABAP SUBSTRING на подстроки определённой длины.
Рассмотрим пример использования в задаче. Часто бывает, что стандартный метод или ФМ принимает на вход не строку, а таблицу с последовательностями символов определённой длины. Пример использования конструкции для решения задачи в статье: Вывод текста в окне, а так это подробно разобрано в видео к этой статье.
Шаблон как разбить строку ABAP SUBSTRING:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
DATA: lt_text_table TYPE STANDARD TABLE OF text120. " lv_text - это произвольная строка, которую разбиваем " Получаем длину строки DATA(lv_strlen) = strlen( lv_text ). " Длина подстрок разбиения DATA(lv_sep) = 120. DATA(lv_count) = 0. " Пока длина остатка подстроки меньше длины разбиения WHILE lv_strlen - lv_count > lv_sep. " Выделяем подстроку с lv_count длиной lv_sep. DATA(lv_substr) = CONV ( substring( val = lv_text off = lv_count len = lv_sep ) ). " Добавляем подстроку в таблицу для дальнейшего использования APPEND lv_substr TO lt_text_table. " Добавляем к счётчику длину отрезанной строки lv_count = lv_count + lv_sep. ENDWHILE. " Делаем действие аналогичное, но для последней части строки lv_substr = substring( val = lv_text off = lv_count ). APPEND lv_substr TO lt_text_table. |
Короткий шаблон получения подстрок ABAP определённой длины:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
DATA: lt_text_table TYPE STANDARD TABLE OF text40. " lv_text - это произвольная строка, которую разбиваем DATA(lv_strlen) = strlen( lv_text ). DATA(lv_sep) = 40. DATA(lv_count) = 0. WHILE lv_strlen - lv_count > lv_sep. APPEND lv_text+lv_count(lv_sep) TO lt_text_table. lv_count = lv_count + lv_sep. ENDWHILE. APPEND lv_text+lv_count TO lt_text_table. |
Шаблон с использованием ФМ HR_RU_SLPIT_STRING0:
Использование этого ФМ показано на примере заполнения полей имени при создании кредитора.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
l_string = 'ООО "ТЫ КОДЕР" загружено с сайта'. CALL FUNCTION 'HR_RU_SLPIT_STRING0' EXPORTING string = l_string length = 40 separator = l_separator TABLES split = lt_split. LOOP AT lt_split REFERENCE INTO DATA(lr_split). CASE sy-tabix. WHEN 1. ls_data-name = lr_split->char255. WHEN 2. ls_data-name_2 = lr_split->char255. WHEN 3. ls_data-name_3 = lr_split->char255. WHEN 4. ls_data-name_4 = lr_split->char255. ENDCASE. ENDLOOP. |