Типи даних і обʼєкти
Тип даних (data type) описує технічні властивості — як ABAP інтерпретує вміст памʼяті. Обʼєкт даних (data object) — конкретний екземпляр типу, що займає память і зберігає значення. Співвідношення те саме, що між класом і екземпляром: тип — опис, обʼєкт — існує у runtime.
Тип може бути автономним (оголошений через TYPES) або привʼязаним до конкретного обʼєкта (властивість цього обʼєкта). Обʼєкт завжди має тип — або вказаний явно, або виведений компілятором з контексту.
Категорії типів
Section titled “Категорії типів”ABAP ділить типи на три великі групи:
- Елементарні — скалярні, неподільні: числові, символьні, байтові, дата/час.
- Складні (complex) — побудовані з інших типів: структури, внутрішні таблиці, mesh-типи.
- Посилальні (reference) — вказують на інший обʼєкт даних або екземпляр класу.
Елементарні типи
Section titled “Елементарні типи”Поділяються на фіксованої і змінної довжини:
| Група | Типи | Примітка |
|---|---|---|
| Числові | b, s, i, int8, p, decfloat16, decfloat34, f | b (1 байт), s (2 байти) — не оголошуються напряму, тільки через DDIC; p потребує LENGTH і DECIMALS |
| Символьні | c, n, string | c/n — фіксована (вимагають LENGTH), string — динамічна |
| Байтові | x, xstring | x — фіксована (вимагає LENGTH), xstring — динамічна |
| Дата/час | d, t, utclong | d = 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. " динамічна довжинаСкладні типи
Section titled “Складні типи”Структури — через 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.Посилальні типи
Section titled “Посилальні типи”Власних вбудованих посилальних типів нема — всі оголошуються через REF TO:
DATA dref TYPE REF TO i. " data reference на integerDATA oref TYPE REF TO zcl_demo. " object reference на класDATA generic_dref TYPE REF TO data. " узагальнений data referenceDATA generic_oref TYPE REF TO object. " узагальнений object referenceREF 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 з DDICDATA 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 iInline-оголошення (7.40+)
Section titled “Inline-оголошення (7.40+)”Тип виводиться з правої частини — не треба окремо DATA перед використанням:
DATA(n) = 42. " TYPE iDATA(greet) = `hello`. " TYPE stringDATA(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 перевизначається на кожній ітерації, " але в межах однієї — immutableENDLOOP.Узагальнені (generic) типи
Section titled “Узагальнені (generic) типи”Залишають частину властивостей відкритими. Використовуються тільки у типізації формальних параметрів методів і field symbols — як контейнер для “чогось”.
| Generic | Що приймає |
|---|---|
c, n, x, p | без LENGTH — будь-яка довжина |
clike | будь-який символьний тип, включно з string, d, t і символьними flat-структурами |
csequence | c і string |
xsequence | x і xstring |
numeric | будь-який числовий тип (b, s, i, int8, p, decfloat16, decfloat34, f) |
decfloat | decfloat16 або 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` ). " без втрат точності — інакше exceptionDATA(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 structureSELECT 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.
Enumerated-типи (7.51+)
Section titled “Enumerated-типи (7.51+)”Обмежує множину значень змінної до переліку. База — 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.
Built-in обʼєкти
Section titled “Built-in обʼєкти”Доступні без оголошення:
| Обʼєкт | Що це |
|---|---|
sy / syst | структура з системними полями (sy-subrc, sy-tabix, sy-index, sy-datum, sy-uzeit…) |
space | константа c LENGTH 1 зі значенням ’ ‘ |
me | self-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). Повний перелік нюансів — в оригіналі.