Обробка рядків
У ABAP два основні рядкові типи: STRING — динамічний Unicode-рядок без фіксованої довжини, і C — фіксований символьний тип із заздалегідь заданим розміром. Плюс узагальнений тип CSEQUENCE, який приймає обидва — зручно для параметрів методів.
Сучасний ABAP (7.40+) дає виразний інструментарій для роботи з рядками: string templates, inline-оголошення, вбудовані функції (strlen, to_upper, condense тощо), і повноцінна підтримка регулярних виразів. У новому коді здебільшого вистачає STRING — тип C потрібен переважно для інтерфейсів з легасі-кодом і БД.
| Тип | Опис | Приклад |
|---|---|---|
STRING | Динамічний рядок, Unicode | DATA: text TYPE string. |
C | Фіксований символьний | DATA: code TYPE c LENGTH 4. |
CSEQUENCE | Узагальнений (приймає STRING і C) | параметр методу |
STRING зберігається у heap, довжина змінюється автоматично. C — фіксована довжина, trailing spaces автоматично доповнюють короткі значення. Це джерело типових граблів при порівнянні (див. нижче).
Оголошення
Section titled “Оголошення”" Класичний синтаксисDATA: text TYPE string, code TYPE c LENGTH 4.
" Сучасний (7.40+) — inline-оголошенняDATA(text2) = `Привіт`.Рядкові літерали у зворотних лапках (`…`) — тип STRING. У одинарних лапках (’…’) — тип C з довжиною = кількості символів у літералі. Ця відмінність важлива для порівнянь і конкатенації.
Конкатенація
Section titled “Конкатенація”Стара мова (до 7.40):
CONCATENATE 'Hello' ' ' 'World' INTO result.Сучасна мова (рекомендовано):
result = |Hello World|. " string templateresult = |{ a } + { b } = { a + b }|. " вбудовані виразиresult = `Hello` && ` ` && `World`. " оператор &&String templates |...| — найпотужніший інструмент: можна вбудовувати вирази, форматувати числа/дати, керувати заповненням.
String templates завжди повертають STRING. Якщо потрібен C — використовуй CONV c( |...| ) або присвоюй у змінну типу C.
Довжина та обрізання
Section titled “Довжина та обрізання”DATA(len) = strlen( text ). " довжинаDATA(trimmed) = condense( text ). " стиснути пробілиDATA(upper) = to_upper( text ).DATA(lower) = to_lower( text ).DATA(rev) = reverse( text ).strlen для C повертає значущу довжину (без trailing spaces), а не фіксовану довжину типу. Для отримання фіксованої довжини — numofchar( ).
Пошук та заміна
Section titled “Пошук та заміна”" Пошук позиції підрядкаFIND 'SAP' IN text MATCH OFFSET DATA(off).IF sy-subrc = 0. " знайдено на позиції offENDIF.
" Заміна усіх входженьREPLACE ALL OCCURRENCES OF 'old' IN text WITH 'new'.
" Регулярні вирази — окрема велика темаFIND REGEX `\d+` IN text RESULTS DATA(matches).DATA(first) = match( val = text regex = `\d+` ).Для складних паттернів дивись Регулярні вирази.
Розбиття та обʼєднання
Section titled “Розбиття та обʼєднання”SPLIT `a,b,c` AT `,` INTO TABLE DATA(parts)." parts = ( 'a' ) ( 'b' ) ( 'c' )
DATA(joined) = concat_lines_of( table = parts sep = ` | ` )." joined = 'a | b | c'Підрядок та заміна діапазонів
Section titled “Підрядок та заміна діапазонів”DATA(text) = `Hello, World!`.
" Підрядок: від позиції, довжинаDATA(sub) = substring( val = text off = 7 len = 5 ). " 'World'
" Функції substring_after / before / from / toDATA(after) = substring_after( val = text sub = `, ` ). " 'World!'DATA(before) = substring_before( val = text sub = `,` ). " 'Hello'Грабля: trailing spaces у типі C
Section titled “Грабля: trailing spaces у типі C”DATA code TYPE c LENGTH 10.code = 'AB'. " насправді 'AB ' (8 пробілів)IF code = 'AB'. " TRUE (компаратор ігнорує trailing) ...ENDIF.Грабля: STRING не можна CLEAR до FIXED довжини
Section titled “Грабля: STRING не можна CLEAR до FIXED довжини”DATA text TYPE string.CLEAR text. " text стає порожнім рядком, довжина 0Для STRING CLEAR і присвоєння порожнього літерала еквівалентні: text = '' або text = \“.
Адаптовано з 07_String_Processing.md (Apache 2.0). Повний перелік нюансів — в оригіналі.