Перейти до вмісту

Вбудовані функції

ABAP має набір вбудованих функцій, які можна використовувати прямо у виразах — без попереднього оголошення чи виклику методів. Вони покривають типові потреби: перевірка умов, арифметика, операції з рядками, робота з timestamp, отримання метаданих внутрішніх таблиць. Частина функцій доступна також у ABAP SQL та ABAP CDS — з дещо іншим синтаксисом і поведінкою.

Функція повертає значення, тому може стояти там, де очікується вираз (права частина присвоєння, аргумент іншої функції, умова). Параметри передаються за іменем: func( arg1 = value1 arg2 = value2 ).

Повертають значення типу 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.

Приймають числові аргументи, повертають число. Тип результату залежить від типу аргументів.

КатегоріяФункції
Знак і модуль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 ). " 3
DATA(y) = sign( -7 ). " -1 (для 0 → 0, для додатного → 1)
DATA(c) = ceil( '1.3' ). " 2
DATA(f) = floor( '1.7' ). " 1
DATA(t) = trunc( '1.9' ). " 1 (обрізає дробову)
DATA(fr) = frac( '1.25' ). " 0.25
DATA(pow) = ipow( base = 2 exp = 10 ). " 1024
DATA(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

Найбільш численна група. Параметри — val (вхідний рядок), sub/pcre/regex (шукане), off, len, occ, case.

ФункціяПризначення
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` ). " 5
DATA(pos) = find( val = `abc-def` sub = `-` ). " 3
DATA(nf) = find( val = `abc` sub = `x` ). " -1
DATA(d) = distance( val1 = `kitten` val2 = `sitting` ). " 3
ФункціяПризначення
to_upper / to_lowerРегістр.
from_mixed / to_mixedCamelCase ↔ розділювач.
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` ). " ABAP
DATA(s2) = reverse( `ABAP` ). " PABA
DATA(s3) = substring( val = `Hello World` off = 6 len = 5 ). " World
DATA(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 — всі)
" Ескейпінг для HTML
DATA(html) = escape( val = `<b>&</b>` format = cl_abap_format=>e_html_text ).

Робота з типом 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 секунд
ФункціяПризначення
lines( itab )Кількість рядків у таблиці.
line_index( itab[ key ] )Індекс рядка (0, якщо не знайдено).
IF lines( orders ) > 0.
DATA(idx) = line_index( orders[ id = 7 ] ).
ENDIF.

Синтаксис інший (kам’янистий CASE-подібний), типи повертання — SQL-типи. Доступні у SELECT, CDS views, Projection Views.

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).

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).

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).

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[ ... ] )
Поточний timestamputclong_current( )
Округлення для грошейround( ... mode = round_half_up )

Адаптовано з 24_Builtin_Functions.md (Apache 2.0).