Вбудовані функції
ABAP має набір вбудованих функцій, які можна використовувати прямо у виразах — без попереднього оголошення чи виклику методів. Вони покривають типові потреби: перевірка умов, арифметика, операції з рядками, робота з timestamp, отримання метаданих внутрішніх таблиць. Частина функцій доступна також у ABAP SQL та ABAP CDS — з дещо іншим синтаксисом і поведінкою.
Функція повертає значення, тому може стояти там, де очікується вираз (права частина присвоєння, аргумент іншої функції, умова). Параметри передаються за іменем: func( arg1 = value1 arg2 = value2 ).
Логічні функції
Section titled “Логічні функції”Повертають значення типу abap_bool ('X' / ' ') або беруть участь у логічних виразах.
| Функція | Призначення |
|---|---|
boolc( log_expr ) | Результат логічного виразу як abap_bool. |
xsdbool( log_expr ) | Як boolc, але повертає значення типу c length 1 без зайвих пробілів — краще в SQL і для abap_bool. |
contains( val = ... sub/start/end/pcre/regex = ... ) | Чи містить рядок підрядок/патерн. |
contains_any_of( val = ... sub = ... ) | Чи містить хоч один зі символів. |
contains_any_not_of( val = ... sub = ... ) | Чи містить символ поза набором. |
matches( val = ... pcre = ... ) | Повний збіг рядка з регулярним виразом. |
line_exists( itab[ key ] ) | Чи існує рядок у внутрішній таблиці. |
DATA(flag) = xsdbool( sy-index > 0 ). " 'X' або ' '
IF contains( val = `Hello ABAP` sub = `ABAP` ). " міститьENDIF.
IF matches( val = email pcre = `[\w.]+@[\w.]+\.\w+` ). " валідний форматENDIF.
IF line_exists( itab[ id = 42 ] ). DATA(row) = itab[ id = 42 ].ENDIF.Числові функції
Section titled “Числові функції”Приймають числові аргументи, повертають число. Тип результату залежить від типу аргументів.
| Категорія | Функції |
|---|---|
| Знак і модуль | abs, sign |
| Округлення | ceil, floor, trunc, frac, round, rescale |
| Степінь і корінь | ipow, sqrt, exp, log, log10 |
| Мін/макс | nmin, nmax |
| Тригонометрія | sin, cos, tan, asin, acos, atan, sinh, cosh, tanh |
| Комбінаторика | fact (факторіал), binomial |
DATA(x) = abs( -3 ). " 3DATA(y) = sign( -7 ). " -1 (для 0 → 0, для додатного → 1)DATA(c) = ceil( '1.3' ). " 2DATA(f) = floor( '1.7' ). " 1DATA(t) = trunc( '1.9' ). " 1 (обрізає дробову)DATA(fr) = frac( '1.25' ). " 0.25
DATA(pow) = ipow( base = 2 exp = 10 ). " 1024DATA(mn) = nmin( val1 = 3 val2 = 5 val3 = 1 ). " 1
" Округлення з режимомDATA(r) = round( val = '1.245' dec = 2 mode = cl_abap_math=>round_half_up ). " 1.25Рядкові функції
Section titled “Рядкові функції”Найбільш численна група. Параметри — val (вхідний рядок), sub/pcre/regex (шукане), off, len, occ, case.
Метадані та пошук
Section titled “Метадані та пошук”| Функція | Призначення |
|---|---|
strlen( val ) | Довжина рядка (без trailing blanks для c, включно для string). |
numofchar( val ) | Кількість символів, ігноруючи trailing blanks. |
find( val = ... sub/pcre = ... ) | Індекс першого входження або -1. |
find_end | Індекс після останнього символу збігу. |
find_any_of / find_any_not_of | Перший символ з/поза набором. |
count / count_any_of / count_any_not_of | Кількість входжень. |
distance( val1 = ... val2 = ... ) | Відстань Левенштейна між рядками. |
DATA(len) = strlen( `Hello` ). " 5DATA(pos) = find( val = `abc-def` sub = `-` ). " 3DATA(nf) = find( val = `abc` sub = `x` ). " -1DATA(d) = distance( val1 = `kitten` val2 = `sitting` ). " 3Трансформація
Section titled “Трансформація”| Функція | Призначення |
|---|---|
to_upper / to_lower | Регістр. |
from_mixed / to_mixed | CamelCase ↔ розділювач. |
reverse | Інверсія рядка. |
condense | Стискає послідовності пробілів (аналог CONDENSE). |
repeat( val = ... occ = n ) | Повторити n разів. |
shift_left / shift_right | Зсув зі зрізанням або підставлянням. |
substring / substring_before / substring_after / substring_from / substring_to | Витяг підрядка. |
insert | Вставка. |
replace | Заміна (позиційна, за підрядком, за regex). |
translate | Посимвольна підстановка (як TRANSLATE ... USING). |
segment( val = ... sep = ... index = n ) | n-й сегмент за розділювачем. |
concat_lines_of( table = itab sep = ... ) | Склеїти рядки таблиці в один рядок. |
escape | Ескейпінг для URL/HTML/XML/JSON/regex. |
match( val = ... pcre = ... ) | Перший збіг regex як рядок. |
DATA(s1) = to_upper( `abap` ). " ABAPDATA(s2) = reverse( `ABAP` ). " PABADATA(s3) = substring( val = `Hello World` off = 6 len = 5 ). " WorldDATA(s4) = substring_after( val = `name=John` sub = `=` ). " John
DATA(joined) = concat_lines_of( table = names sep = `, ` ).
DATA(r) = replace( val = `one two one` sub = `one` with = `1` occ = 0 ). " 1 two 1 (occ=0 — всі)
" Ескейпінг для HTMLDATA(html) = escape( val = `<b>&</b>` format = cl_abap_format=>e_html_text ).Timestamp функції
Section titled “Timestamp функції”Робота з типом utclong — поза GET TIME STAMP, прямо у виразах.
| Функція | Призначення |
|---|---|
utclong_current( ) | Поточний timestamp UTC. |
utclong_add( val = ... days/hours/minutes/seconds = ... ) | Додати інтервал. |
utclong_diff( high = ... low = ... ) | Різниця у decfloat34 секундах. |
DATA(ts1) = utclong_current( ).DATA(ts2) = utclong_add( val = ts1 hours = 2 minutes = 30 ).DATA(sec) = utclong_diff( high = ts2 low = ts1 ). " 9000 секундТабличні функції
Section titled “Табличні функції”| Функція | Призначення |
|---|---|
lines( itab ) | Кількість рядків у таблиці. |
line_index( itab[ key ] ) | Індекс рядка (0, якщо не знайдено). |
IF lines( orders ) > 0. DATA(idx) = line_index( orders[ id = 7 ] ).ENDIF.Функції в ABAP SQL і CDS
Section titled “Функції в ABAP SQL і CDS”Синтаксис інший (kам’янистий CASE-подібний), типи повертання — SQL-типи. Доступні у SELECT, CDS views, Projection Views.
Числові
Section titled “Числові”abs, ceil, floor, div, division, mod, round, power.
SELECT carrid, ROUND( price, 0 ) AS price_rounded, ABS( delta ) AS delta_abs, MOD( id, 10 ) AS last_digit FROM sflight INTO TABLE @DATA(result).Рядкові
Section titled “Рядкові”concat, concat_with_space, instr, left, length, lower, upper, lpad, rpad, ltrim, rtrim, replace, right, substring, initcap, reverse.
SELECT CONCAT_WITH_SPACE( firstname, lastname, 1 ) AS fullname, UPPER( city ) AS city_upper, SUBSTRING( phone, 1, 3 ) AS area_code FROM scustom INTO TABLE @DATA(customers).Дата, час, timestamp
Section titled “Дата, час, timestamp”dats_add_days, dats_add_months, dats_days_between, dats_is_valid, tims_is_valid, tstmp_add_seconds, tstmp_seconds_between, tstmp_current_utctimestamp, tstmp_is_valid, utcl_add_seconds, utcl_seconds_between, abap_system_timezone, abap_user_timezone.
SELECT bookid, DATS_ADD_DAYS( order_date, 30, 'FAIL' ) AS deadline, DATS_DAYS_BETWEEN( order_date, ship_date ) AS days_to_ship FROM bookings INTO TABLE @DATA(bookings).Спеціальні
Section titled “Спеціальні”coalesce( v1, v2, ... ) — перше ненульове значення. Корисне для LEFT OUTER JOIN, де праворуч можуть бути NULL.
SELECT a~id, COALESCE( b~name, '<unknown>' ) AS name FROM table_a AS a LEFT OUTER JOIN table_b AS b ON a~ref_id = b~id INTO TABLE @DATA(joined).Коли використовувати що
Section titled “Коли використовувати що”| Задача | Рішення |
|---|---|
| Булів прапорець з умови | xsdbool( ... ) |
| Перевірка входження підрядка | contains( val = ... sub = ... ) |
| Повний regex-збіг | matches( val = ... pcre = ... ) |
| Довжина рядка | strlen (без trailing blanks для c) |
| Витяг за розділювачем | substring_before/after/from/to |
| Склейка елементів таблиці | concat_lines_of |
| Кількість рядків у таблиці | lines( itab ) |
| Існування рядка | line_exists( itab[ ... ] ) |
| Поточний timestamp | utclong_current( ) |
| Округлення для грошей | round( ... mode = round_half_up ) |
Адаптовано з 24_Builtin_Functions.md (Apache 2.0).