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

Типи даних і обʼєкти

Тип даних (data type) описує технічні властивості — як ABAP інтерпретує вміст памʼяті. Обʼєкт даних (data object) — конкретний екземпляр типу, що займає память і зберігає значення. Співвідношення те саме, що між класом і екземпляром: тип — опис, обʼєкт — існує у runtime.

Тип може бути автономним (оголошений через TYPES) або привʼязаним до конкретного обʼєкта (властивість цього обʼєкта). Обʼєкт завжди має тип — або вказаний явно, або виведений компілятором з контексту.

ABAP ділить типи на три великі групи:

  • Елементарні — скалярні, неподільні: числові, символьні, байтові, дата/час.
  • Складні (complex) — побудовані з інших типів: структури, внутрішні таблиці, mesh-типи.
  • Посилальні (reference) — вказують на інший обʼєкт даних або екземпляр класу.

Поділяються на фіксованої і змінної довжини:

ГрупаТипиПримітка
Числовіb, s, i, int8, p, decfloat16, decfloat34, fb (1 байт), s (2 байти) — не оголошуються напряму, тільки через DDIC; p потребує LENGTH і DECIMALS
Символьніc, n, stringc/n — фіксована (вимагають LENGTH), string — динамічна
Байтовіx, xstringx — фіксована (вимагає LENGTH), xstring — динамічна
Дата/часd, t, utclongd = 8 символів YYYYMMDD, t = 6 символів HHMMSS, utclong — UTC timestamp

i, int8, decfloat16, decfloat34, f, d, t, utclong, string, xstring — повні (complete) типи, додаткові вказівки не потрібні. c, n, x, p — неповні (incomplete) за довжиною, завжди вимагають LENGTH. p додатково вимагає DECIMALS:

DATA num TYPE i. " 4 байти, знакове ціле
DATA txt TYPE c LENGTH 10. " рівно 10 символів, доповнюється пробілами
DATA money TYPE p LENGTH 8 DECIMALS 2. " упаковане число з 2 знаками після коми
DATA msg TYPE string. " динамічна довжина

Структури — через BEGIN OF ... END OF, компоненти будь-яких типів (див. окрему сторінку Структури).

Табличні типи — через TABLE OF, задають тип рядка, category і ключ (див. Внутрішні таблиці).

TYPES: BEGIN OF t_addr,
name TYPE string,
city TYPE string,
END OF t_addr,
t_addresses TYPE STANDARD TABLE OF t_addr WITH EMPTY KEY.

Власних вбудованих посилальних типів нема — всі оголошуються через REF TO:

DATA dref TYPE REF TO i. " data reference на integer
DATA oref TYPE REF TO zcl_demo. " object reference на клас
DATA generic_dref TYPE REF TO data. " узагальнений data reference
DATA generic_oref TYPE REF TO object. " узагальнений object reference

REF TO data і REF TO object — узагальнені посилання, приймають будь-який тип. Потрібні для динамічного програмування.

Оголошення типів через TYPES

Section titled “Оголошення типів через TYPES”

Загальний шаблон: TYPES name TYPE source [LENGTH n] [DECIMALS n]. Джерелом може бути вбудований тип, існуючий тип або обʼєкт (через LIKE):

TYPES ty_amount TYPE p LENGTH 10 DECIMALS 2.
TYPES ty_string TYPE string.
TYPES ty_alias LIKE some_existing_var. " тип виводиться з обʼєкта
TYPES ty_line TYPE LINE OF some_itab. " тип рядка таблиці

Глобальні типи з ABAP Dictionary (DDIC) — data element, DDIC structure, table type, CDS view entity — адресуються по імені:

DATA carrid TYPE s_carr_id. " data element з DDIC
DATA fli TYPE zdemo_abap_fli. " database table як тип
DATA view TYPE zdemo_abap_fli_ve. " CDS view entity

Оголошення обʼєктів через DATA

Section titled “Оголошення обʼєктів через DATA”
DATA count TYPE i VALUE 10.
DATA name TYPE string VALUE `ABAP`.
DATA amount TYPE p LENGTH 8 DECIMALS 2.
DATA flag TYPE c LENGTH 1 VALUE 'X'.

Без VALUE обʼєкт отримує type-specific initial value: 0 для чисел, порожній рядок для string, пробіли для c, 00000000 для d тощо.

LIKE замість TYPE — створити обʼєкт того самого типу, що й існуючий:

DATA another_count LIKE count. " теж TYPE i

Тип виводиться з правої частини — не треба окремо DATA перед використанням:

DATA(n) = 42. " TYPE i
DATA(greet) = `hello`. " TYPE string
DATA(flights) = VALUE string_table( ( `LH` ) ( `AA` ) ).
SELECT SINGLE * FROM zdemo_abap_fli INTO @DATA(fli).
READ TABLE itab INTO DATA(wa) INDEX 1.
LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>). ENDLOOP.

FINAL(...) робить змінну immutable — присвоєння одноразове, далі не модифікується:

FINAL(config) = read_config( ). " далі config-* змінити не можна
LOOP AT items INTO FINAL(item). " item перевизначається на кожній ітерації,
" але в межах однієї — immutable
ENDLOOP.

Залишають частину властивостей відкритими. Використовуються тільки у типізації формальних параметрів методів і field symbols — як контейнер для “чогось”.

GenericЩо приймає
c, n, x, pбез LENGTH — будь-яка довжина
clikeбудь-який символьний тип, включно з string, d, t і символьними flat-структурами
csequencec і string
xsequencex і xstring
numericбудь-який числовий тип (b, s, i, int8, p, decfloat16, decfloat34, f)
decfloatdecfloat16 або decfloat34
anyбудь-який тип взагалі
any table, standard table, sorted table, hashed table, index table, tableкатегорії таблиць (table = standard table)
simpleбудь-який елементарний тип (включно з enum) або структура з елементарних flat-компонентів
dataбудь-який обʼєкт даних (тільки після TYPE REF TO — для data references)
objectбудь-який обʼєкт класу (тільки після TYPE REF TO — для object references)
METHODS process IMPORTING it TYPE any table
val TYPE simple.
FIELD-SYMBOLS <any> TYPE any.
FIELD-SYMBOLS <tab> TYPE INDEX TABLE.

Присвоєння і конвертація

Section titled “Присвоєння і конвертація”

Оператор = копіює значення. Якщо типи сумісні — пряме копіювання. Якщо ні — застосовуються conversion rules:

DATA(txt) = `42`.
DATA num TYPE i.
num = txt. " ок: `42` → 42
DATA(bad) = `abc`.
" num = bad. " CX_SY_CONVERSION_NO_NUMBER

Конструкторські оператори для явних перетворень:

DATA(as_int) = CONV i( `123` ). " явна конвертація
DATA(as_ref) = REF #( some_obj ). " посилання на обʼєкт
DATA(exact_val) = EXACT decfloat34( `1.23` ). " без втрат точності — інакше exception
DATA(casted) = CAST cl_child( oref ). " downcast object reference

Анонімні обʼєкти даних

Section titled “Анонімні обʼєкти даних”

Обʼєкт без імені, доступний лише через reference:

" NEW — створює і опційно ініціалізує
DATA(ref_to_i) = NEW i( 42 ).
DATA(ref_to_struc) = NEW addr_struc( name = `John` city = `Kyiv` ).
" CREATE DATA — старіший, гнучкіший синтаксис
DATA ref TYPE REF TO data.
CREATE DATA ref TYPE i.
CREATE DATA ref TYPE TABLE OF string.
" SELECT INTO NEW — одразу в anonymous structure
SELECT SINGLE * FROM zdemo_abap_carr INTO NEW @DATA(fli_ref).

Доступ до вмісту — через розіменування ->*:

DATA(ref) = NEW i( 42 ).
ref->* = 100. " модифікація значення
DATA(val) = ref->*. " читання

Константи та immutable-змінні

Section titled “Константи та immutable-змінні”

CONSTANTS — значення, що не змінюється протягом виконання. VALUE обовʼязкове:

CONSTANTS c_pi TYPE f VALUE '3.14159265358979'.
CONSTANTS c_empty TYPE string VALUE IS INITIAL.
CONSTANTS: BEGIN OF c_status,
active TYPE c LENGTH 1 VALUE 'A',
inactive TYPE c LENGTH 1 VALUE 'I',
END OF c_status.
" DATA(x) = c_status-active.

FINAL(...) — immutable-змінна inline, про неї йшлося вище. Відмінність: CONSTANTS обчислюється на етапі компіляції, FINAL — у runtime, але після присвоєння стає read-only.

Обмежує множину значень змінної до переліку. База — i за замовчуванням (значення автоінкрементуються з 0), можна змінити через BASE TYPE (flat, елементарний тип, максимум 16 байт). Рівно одне значення має бути VALUE IS INITIAL:

TYPES basetype TYPE i.
TYPES: BEGIN OF ENUM t_status BASE TYPE basetype,
new VALUE IS INITIAL,
active VALUE 1,
closed VALUE 2,
END OF ENUM t_status.
DATA status TYPE t_status.
status = active. " тільки з переліку — інакше syntax error
" Конверсія в базовий тип — явна
DATA(as_int) = CONV basetype( status ). " 1

Варіант BEGIN OF ENUM ... STRUCTURE ... — додатково створює константну структуру зі значеннями. Зручно, коли потрібно звертатися en_struc-active замість чистого active.

Доступні без оголошення:

ОбʼєктЩо це
sy / systструктура з системними полями (sy-subrc, sy-tabix, sy-index, sy-datum, sy-uzeit…)
spaceконстанта c LENGTH 1 зі значенням ’ ‘
meself-reference у методах екземпляру
abap_true / abap_falseбулеві константи типу abap_bool (значення 'X' / ' '); з type group ABAP
abap_undefinedконстанта-індикатор невизначеного значення ('-') для tri-state логіки

У ABAP Cloud багато полів sy заборонені до читання (тягнуться з dynpro/list-контекстів) — IDE показує syntax warning. Безпечні: sy-subrc, sy-tabix, sy-index, sy-dbcnt, sy-datum, sy-uzeit, sy-mandt, sy-langu.

Адаптовано з 16_Data_Types_and_Objects.md (Apache 2.0). Повний перелік нюансів — в оригіналі.