Часто при разработке программ ABAP возникает необходимость заменить подстроку другой. Например, заменить запятую на точку или за место разделителя вставить пробел и много других вариантов. Функция замена символа ABAP REPLACE поможет. Эта функция заменяет подстроку текста строкой символов и возвращает измененный текст в результате. Есть два варианта вызова, мы рассмотрим каждый из них более подробно:
Замена символов в строке ABAP – REPLACE
Заменить символы ABAP часть используя смещение(off) и длину подстроки после смещения(len).
Эта опция заменяет подстроку, которую мы выбираем, используя off смещение и длина, указанная в len переменная со значением, указанным в аргументе with. С помощью этой опции вызова должен быть определен хотя бы один из этих аргументов. Примеры:
1 2 |
replace( val = |youcoder.ru/contacts.html| off = 12 len = 8 with = 'abap' ). " = youcoder.ru/abap.html |
Replace будет работать как вставка.
Если мы пропустим параметр len или укажем его len = 0, то данная конструкция будет работать как вставка.
1 2 3 4 5 |
replace( val = |youcoder/abap.html| off = 8 len = 0 with = '.ru' ). " = youcoder.ru/abap.html replace( val = |youcoder/abap.html| off = 8 with = '.ru' ). " = youcoder.ru/abap.html |
Первый элемент длины len будет заменен
Если указан только параметр len, что аналогично указанию off = 0, то первый элемент длины len будет заменен.
1 2 3 4 5 |
replace( val = |youcoder/abap.html| off = 0 len = 8 with = 'youcoder.ru' ). " = youcoder.ru/abap.html replace( val = |youcoder/abap.html| len = 8 with = 'youcoder.ru' ). " = youcoder.ru/abap.html |
Вставка в конец строки ABAP используя replace.
Если значение параметра off равно длине строки, то значение параметра with будет вставлено в конец строки:
1 2 3 4 5 |
replace( val = |youcoder.ru| off = 11 len = 0 with = '/abap.html' ). " = youcoder.ru/abap.html replace( val = |youcoder.ru| off = 11 with = '/abap.html' ). " = youcoder.ru/abap.html |
Замена символа ABAP используя подстроку(sub) или регулярное выражение(regex).
Замена символа ABAP и его варианты. Этот параметр определения ищет определенное количество вхождений occ в строке, проверяя соответствие подстроке, указанной в substring, или регулярному выражению, указанному в аргументе regex. И заменяет эти вхождения значением, переданным в with. Если значение параметра with имеет фиксированную длину, то пробелы, указанные в конце, будут игнорироваться программой. Если вы передадите значение 0 в аргумент occ, все вхождения будут заменены. Кроме того, по умолчанию при поиске заменяемых значений учитывается регистр, но это можно изменить с помощью параметра case.
Если параметр occ не указан, то по умолчанию это будет occ = 1, и будет заменено только первое вхождение подстроки:
1 2 |
replace( val = |yc/index.html,yc/abap.html| sub = 'yc' with = 'youcoder.ru' ). " = youcoder.ru/index.html,yc/abap.html |
Значением по умолчанию для параметра является case = abap_true, что означает регистр символов. То есть, указав case = abap_true или пропустив этот параметр, вы получите тот же результат:
1 2 3 4 |
replace( val = |YC/index.html,yc/| sub = 'yc' with = 'youcoder.ru' occ = 0 ). replace( val = |YC/index.html,yc/| sub = 'yc' with = 'youcoder.ru' case = abap_true occ = 0 ). " = youcoder.ru/index.html,youcoder.ru/ |
Чтобы замена работала корректно, необходимо указать параметр case = abap_false, чтобы регистр игнорировался.
1 2 |
replace( val = |YC/index.html,yc/| sub = 'yc' with = 'youcoder.ru' case = abap_false occ = 0 ). " = youcoder.ru/index.html,youcoder.ru/ |
Когда может замена символов или подстроки в реальных примерах?
- При загрузке из Excel у нас на вход приходит число с разделителем запятая. Но в SAP системе оно хранится с точкой. Если мы попытаемся сразу напрямую присвоить это значение числу, то получим ошибку. Если мы предварительно преобразуем строку заменив запятую на точку, то присвоение пройдёт успешно. Пример использования есть в ссылке.
- При использовании масок сравнения для таблицы range и для ограничения запроса вы должны передать значение другим способом. В этом случае эту замену удобно выполнить с помощью replace с параметром regex, в который мы передаем символ, который необходимо заменить:
1 2 |
replace( val = '*АРМАТУРА*' regex = '\*' with = '\%' occ = 0 ). " = %АРМАТУРА% |
В результате мы получаем значение, которое можно указать для ограничения запроса в дополнении WHERE. Например: WHERE name LIKE lv_str.