Разбиение строки ABAP - SUBSTRING

Существует множество вариантов разбиения строки на части в зависимости от поставленной задачи.
Есть задачи в которых есть необходимость выделить подстроку из строки по определённым критериям. Для решения данной задачи отлично подходит функция substring с множеством своих вариантов. Рассмотрим подробнее каждый из них:

SUBSTRING

Функция SUBSTRING возвращает нам подстроку длины равной len при этом берёт данную строку с отступом равным off.

lv_substring = substring( val = 'ABCDEFGH' off = 2 len = 2 ). " CD

В нашем случае результатом выполнения функции будет: CD

SUBSTRING_FROM

Возвращает подстроку начиная с первого вхождения символов sub включая эти символы и до конца строки.
По результату получим: CDEFGH

lv_substring = substring_from( val = 'ABCDEFGH' sub = 'CD' ) " CDEFGH

SUBSTRING_AFTER

Возвращает подстроку начиная с первого вхождения символов sub НЕ включая эти символы и до конца строки.
По результату получим: EFGH

lv_substring = substring_after( val = 'ABCDEFGH' sub = 'CD' ). " EFGH " CDEFGH

SUBSTRING_BEFORE

Возвращает подстроку начиная с первого символа строки до первого вхождения символов sub НЕ включая эти символы.
По результату получим: AB

lv_substring = substring_before( val = 'ABCDEFGH' sub = 'CD' ). " AB

SUBSTRING_TO

Возвращает подстроку начиная с первого символа строки до первого вхождения символов sub включая эти символы.
По результату получим: ABCD

lv_substring = substring_to( val = 'ABCDEFGH' sub = 'CD' ). " ABCD

SPLIT

Так же бывают задачи разбиения одной строки на несколько подстрок.
Разбиение строки оператором SPLIT по заданнному разделителю

DATA(lv_dom_http) = 'https://youcoder.ru'. SPLIT lv_img_http AT '://' INTO: DATA(lv_http) DATA(lv_dom_http).

По итогу выполнения программы переменным будут присвоены следующие значения:

lv_http = 'https'. lv_dom_http = 'youcoder.ru'.

Шаблоны как разбить строку на несколько подстрок определённой длины.

Пример реального использования может быть следующий. Часто бывает, что стандартный метод или ФМ принимает на вход не строку, а таблицу с последовательностями символов определённой длины. Пример использования конструкции в реальной задаче, и её решения можно посмотреть в статье: Вывод текста в окне, а так это подробно разобрано в видео к этой статье.

Шаблон с использованием SUBSTRING:

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. 
Шаблон с использованием ФМ HR_RU_SLPIT_STRING0:

Использование данного ФМ показано на примере заполнения полей имени при создании кредитора.

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.