Вы находитесь на странице: 1из 12

Пояснения по типам в ABAP

В документе поясняется многоуровневая система типов данных в языке ABAP. Приводится


таблица соответствия между тем типом, что обычно пишет консультант в спецификации (data
type), и самым низкоуровневым техническим типом (technical type), что виден в отладчике.
Содержимое (Table of Contents)
Многоуровневая система типов в ABAP............................................................................................2
Технический тип P и словарные типы DEC, CURR, QUAN..........................................................2
Примеры числовых типов................................................................................................................... 3
Пример хранения числа 3502567 в разнотипных переменных........................................................5
Программа-пример............................................................................................................................. 6
Описание........................................................................................................................................ 6
Первый экран (селекционный экран, экран выбора)....................................................................6
Результат работы с параметрами по умолчанию........................................................................7
Исходный код.................................................................................................................................. 9
Ссылки............................................................................................................................................... 11

Рисунки (Pictures)
Рис. Пример хранения числа 3502567 в разнотипных переменных (скриншот отладчика)...........5

Таблицы (Tables)
Табл. Соответствие между уровнем 2 (Dictionary Type) и уровнем 1 (ABAP Type)........................2
Табл. Примеры числовых типов CURR, QUAN, DEC, FLTP, INT4, NUMC, RAW в системе с ABAP
7.01...................................................................................................................................................... 3
Многоуровневая система типов в ABAP
Пояснения по типам данных в ABAP, на основе официальной справки Data Types in
ABAP Dictionary | SAP Help Portal к языку версии 7.01

Типы данных в ABAP делятся на несколько уровней, среди которых, начиная с самого
простого:
1. Встроенный ABAP-тип, он же технический тип (built-in ABAP type, Technical type).
2. Предопределенный тип из словаря данных (predefined ABAP Dictionary type), словарный
тип. Их больше, чем ABAP-типов.
3. Элементарный тип (Elementary type): это словарный тип плюс обозначение длины. Его
еще называют просто data type.
4. Прочие типы, построенные из элементарных: домены, элементы данных, структуры,
типы таблиц.
В спецификациях обычно указываются элементарные типы, т.е. уровня 3. Несколько разных
типов данных (data type) могут иметь один и тот же технический тип (Technical type).

Табл. Соответствие между уровнем 2 (Dictionary Type) и уровнем 1 (ABAP Type)


Dictionary Type Meaning Maximum Length n ABAP Type
DEC Calculation/amount field 1-31, 1-17 in tables P((n+1)/2)
INT1 Single-byte integer 3 Internal only
INT2 Two-byte integer 5 Internal only
INT4 Four-byte integer 10 I
CURR Currency field 1-17 P((n+1)/2)
CUKY Currency key 5 C(5)
QUAN Amount 1-17 P((n+1)/2)
UNIT Unit 2-3 C(n)
PREC Accuracy 16 Internal only
FLTP Floating point number 16 F(8)
NUMC Numeric text 1-255 N(n)
CHAR Character 1-255 C(n)
LCHR Long character 256-max C(n)
STRING String of variable length 1-max STRING
RAWSTRING Byte string of variable length 1-max XSTRING
DATS Date 8 D
ACCP Accounting period YYYYMM 6 N(6)
TIMS Time HHMMSS 6 T
RAW Byte String 1-255 X(n)
LRAW Long byte string 256-max X(n)
CLNT Client 3 C(3)
LANG Language internal 1, external 2 C(1)

Технический тип P и словарные типы DEC, CURR, QUAN


Технический тип P — это так называемое упакованное число. Оно занимает в памяти
столько байт, сколько в нем всего цифр, в целой и в дробной части вместе. Этот технический
тип используется для словарных типов CURR, QUAN и DEC. Максимальное количество цифр
для последнего — 31, для первых — 17. То есть из них можно построить, например, такие
элементарные типы данных (наличие знака не сокращает количество цифр):
CURR(17,2) — 17 цифр всего, 2 из них после запятой;
QUAN(8,3) — 8 цифр всего, 3 из них после запятой;
DEC(25,0) — 25 цифр в целой части, дробная часть отсутствует.
Отличие в том, что CURR предназначен для сумм в какой-либо валюте, QUAN — для
количеств в какой-либо единице измерения, а DEC не привязан ни к какой валюте или единице
измерения. Валюта и единица измерения указываются в полях типа CUKY и QUAN.
Примеры числовых типов
Табл. Примеры чисел типов CURR, QUAN, DEC, FLTP, INT4, NUMC, RAW в ABAP 7.01
Прим. Назначение Описание числа и Число с максимальным Техничес- Тип Домен Элемент данных
типа какой максимум можно количеством цифр, цифры кий тип данных (пример) (пример)
ввести пользователю обозначают номер позиции
Суммы со Максимальная дробная 1,123456789012345 P(9, 15) CURR(1,15) Пример не Пример не найден
знаком в неких часть – 15 цифр. найден
ABAP-тип P = упакованное число, у него явно задано

валютах, с 15 цифр, 5 из них после 1 234 567 890,12345 P(8, 5) CURR(15,5) BASE_ BASE_PRICE_
дробной запятой. PRICE SCALE
количество цифр в целой и дробной части

частью и без 9,9 млрд.


Максимальная целая 12 345 678 901 234 567,00 P(9, 0) CURR(17,0) Пример не Пример не найден
часть — 17 цифр. найден
Нет цифр после запятой.
99,9 квадрлн.
Количества со Знак и 16 цифр, 12 345 678 901 234,12 P(9,2) QUAN(17,2) T_PRES TV_CLEAN_
знаком в неких 2 из них после запятой. VAL PRICE_PC
единицах Знак и 16 цифр, 12 345 678 901 234,12 P(9, 2) QUAN(16,2) /ISDFPS/ /ISDFPS/
измерения, с 2 из них после запятой. DO_LM_ DE_LM_CNT_
дробной 99,9 трлн. QUAN VALUE_Q
частью и без Нет знака, 15 цифр, 123 456 789 012,123 P(8, 3) QUAN(15,3) MENG15 PL_QUANTITY
3 из них после запятой.
999,9 млрд.
Просто числа с Нет знака, 25 цифр, 1234567890123456789012345 P(13, 0) DEC(25,0) DEC_25 DEC_25
дробной 0 из них после запятой.
частью и без, Нет знака, 25 цифр, 123456789012345678901234,1 P(13, 1) DEC(25,1) SWNCDOM SWLVMCELAA
со знаком и 1 из них после запятой. DEC24D
без Знак и 25 цифр, 123456789012345678901234 P(13,0) DEC(25,0) Нет Нет
0 из них после запятой
Плавающая 1 цифра в целой части и 1,7976931348623157EE+308 F(8) FLTP ALFLOAT ALITSPFVAL
точка, см. 16 после запятой, число (это 1,7976931348623157*10308,
IEEE-754 умножено на 10N, см. [2] максимальное значение типа)
Целые числа от -2147483648 -1234567890 I(4) INT4 INT4 INT4
до 2147483647
Натуральные От 0 до 2147483647 1234567890 I(4) INT4 INT4_NOS NUMEQ
числа и ноль Строка символов, где 12345 N(5) NUMC(5) NUMC5 NUMC_5
каждый – это цифра
16-ричные Последовательность FF FF FF FF FF FF FF FF FF FF X(10) RAW Нет нет
числа байт (2 цифры каждый)
Пример хранения числа 3502567 в разнотипных переменных

Рис. Пример хранения числа 3502567 в разнотипных переменных (скриншот отладчика)


Программа-пример
Описание
Программа демонстрирует ввод и вывод чисел с разными типами данных: CURR, QUAN,
DEC, FLTP, INT4. На первом экране, экране выбора, работают встроенные проверки на ввод.
На первом и на втором экране работает форматирование вывода чисел, т.е. разделитель групп
разрядов и разделитель целой и дробной частей берутся из настройки Decimal Notation
(транзакция SU01, вкладка Defaults). На втором экране также показан сжатый вывод чисел: без
разделения на группы разрядов (тысячи, миллионы), с выравниванием по левому краю.

Первый экран (селекционный экран, экран выбора)


Результат работы с параметрами по умолчанию
Numbers with 17 significant digits (max for CURR, QUAN): Numbers with 17 significant digits (max for CURR, QUAN):
12,345,678,901,234,568 CURR(17,0) 12,345,678,901,234,568 CURR(17,0)
1,234,567,890,123,456.1 CURR(17,1) 1,234,567,890,123,456.1 CURR(17,1)
123,456,789,012,345.12 CURR(17,2) 123,456,789,012.12345 CURR(17,5)
123,456,789,012.12345 CURR(17,5) 12.12345678901234 CURR(17,14)
12.12345678901234 CURR(17,14) 12.123456789012345 CURR(17,15)
12.123456789012345 CURR(17,15)
The same numbers condensed (left-justified, no grouping):
The same numbers condensed (left-justified, no grouping): 12345678901234567890 ← positions
12345678901234567890 ← positions 12345678901234568 CURR(17,0)
12345678901234568 CURR(17,0) 1234567890123456.1 CURR(17,1)
1234567890123456.1 CURR(17,1) 123456789012.12345 CURR(17,5)
123456789012345.12 CURR(17,2) 12.12345678901234 CURR(17,14)
123456789012.12345 CURR(17,5) 12.123456789012345 CURR(17,15)
12.12345678901234 CURR(17,14)
12.123456789012345 CURR(17,15) Quantities (ST unit truncates all zeroes after 3rd):
1,234,567,890,123.1200 QUAN(17,4)
Quantities (ST unit truncates all zeroes after 3rd): 123,456,789,012.120 QUAN(16,4) with UNIT = ST
1,234,567,890,123.1200 QUAN(17,4)
123,456,789,012.120 QUAN(16,4) with UNIT = ST Big numbers (25 significant digits, max for DEC) & their output length
(sufficient output length is autocalculated in domain in SE11)
Big numbers (25 significant digits, max for DEC) & their output length 12345678901234567890123456789012345 ← positions ↓ output length
(sufficient output length is autocalculated in domain in SE11) 1,234,567,890,123,456,789,012,345 DEC(25,0) 35 (over sufficient)
12345678901234567890123456789012345 ← positions ↓ output length 1,234,567,890,123,456,789,012,345 DEC(25,0) 34 (sufficient)
1,234,567,890,123,456,789,012,345 DEC(25,0) 35 (over sufficient) 1234567890123,456,789,012,345 DEC(25,0) 30 (insufficient)
1,234,567,890,123,456,789,012,345 DEC(25,0) 34 (sufficient) 1234567890123456789012345 DEC(25,0) 26 (minimum)
1234567890123,456,789,012,345 DEC(25,0) 30 (insufficient) 1234567890123456789012345 DEC(25,0) condensed
1234567890123456789012345 DEC(25,0) 26 (minimum) *7890123456789012345 DEC(25,0) 20 (below minimum)
1234567890123456789012345 DEC(25,0) condensed Place for sign is reserved by default, NO-SIGN option exists
*7890123456789012345 DEC(25,0) 20 (below minimum) 12,345,678,901.12345678901234- DEC(25,14) 35 (over sufficient)
Place for sign is reserved by default, NO-SIGN option exists 12,345,678,901.12345678901234- DEC(25,14) 30 (sufficient)
12,345,678,901.12345678901234- DEC(25,14) 35 (over sufficient) 12,345,678,901.12345678901234 DEC(25,14) 30 NO SIGN
12,345,678,901.12345678901234- DEC(25,14) 30 (sufficient) 12345678,901.12345678901234- DEC(25,14) 28 (insufficient)
12,345,678,901.12345678901234 DEC(25,14) 30 NO SIGN 12345678901.12345678901234- DEC(25,14) 27 (minimum)
12345678,901.12345678901234- DEC(25,14) 28 (insufficient) 12345678901.12345678901234- DEC(25,14) condensed
12345678901.12345678901234- DEC(25,14) 27 (minimum) *901.12345678901234- DEC(25,14) 20 (below minimun)
12345678901.12345678901234- DEC(25,14) condensed
*901.12345678901234- DEC(25,14) 20 (below minimun) Integers from -2147483648 to 2147483647 (4 bytes long):
1,234,567,890- INT(4)
Integers from -2147483648 to 2147483647 (4 bytes long): 1,234,567,890 INT(4) NO SIGN
1,234,567,890- INT(4)
1,234,567,890 INT(4) NO SIGN Floating point number (scientific notation):
1.2345123449999999E+04 FLTP(8) simple 12345.12345 is not exact
Floating point number (scientific notation): here
1.2345123449999999E+04 FLTP(8) simple 12345.12345 is not exact 1.2345123449999999E+04 FLTP(8) 2469.2469/2 isn't either
here
1.2345123449999999E+04 FLTP(8) 2469.2469/2 isn't either
Исходный код
*&---------------------------------------------------------------------*
*& Report ZTG_NUM_DATA_TYPES
*&
*&---------------------------------------------------------------------*
*& This program demonstrates input and output of numeric values having
*& different data types: CURR, QUAN, DEC, FLTP, INT4. Selection screen
*& shows internal input checks.
*&---------------------------------------------------------------------*

REPORT ztg_num_data_types.

PARAMETERS:
* Zero decimal places mean that 0.999 will be rounded to 1.000
cur17_0 TYPE p LENGTH 9 DECIMALS 0 DEFAULT '12345678901234567.999',
cur17_1 TYPE p LENGTH 9 DECIMALS 1 DEFAULT '1234567890123456.1',
cur17_5 TYPE p LENGTH 9 DECIMALS 5 DEFAULT '123456789012.12345',
cur17_14 TYPE p LENGTH 9 DECIMALS 14 DEFAULT '12.12345678901234',
* 15 decimal places are allowed with warning "Maximum allowed is 14".
cur17_15 TYPE p LENGTH 9 DECIMALS 15 DEFAULT '12.123456789012345',
* cur17_16 TYPE p LENGTH 9 DECIMALS 16. "16 decimals are not allowed

*Technical type P of length X allows CURR, QUAN, DEC of length 2*X-1


quan17_3 TYPE p LENGTH 9 DECIMALS 3 "P(9,3) allows type QUAN(17,3)
DEFAULT '1234567890123.100',
quan17_u TYPE rstt_rtiml "The type is Time QUAN(17,3), it needs UNIT
DEFAULT '1234567890123.100',

dec25_0 TYPE p LENGTH 13 DECIMALS 0


DEFAULT '1234567890123456789012345',
dec25_14 TYPE p LENGTH 13 DECIMALS 14
DEFAULT '-12345678901.12345678901234',

int4 TYPE i
DEFAULT -1234567890,
int4_nos TYPE logsizetot "The type is "INT4 without sign"
DEFAULT 1234567890.

* Type F is not allowed for input field (see message id 37 number 048)
* PARAMETERS p_fltp type f. <-- This will not work, must use DATA
DATA:
gv_fltp TYPE f VALUE '12345.12345',
gv_fltp_calculated TYPE f.
gv_fltp_calculated = '24690.2469' / 2.

END-OF-SELECTION.
WRITE:
/ 'Numbers with 17 significant digits (max for CURR, QUAN):',
/(29) cur17_0, 'CURR(17,0)',
/(29) cur17_1, 'CURR(17,1)',
/(29) cur17_5, 'CURR(17,5)',
/(29) cur17_14, 'CURR(17,14)',
/(29) cur17_15, 'CURR(17,15)'.
ULINE.
WRITE:
/ 'The same numbers condensed (left-justified, no grouping):',
/ '12345678901234567890 ← positions',
/(29) cur17_0 LEFT-JUSTIFIED NO-GROUPING, 'CURR(17,0)',
/(29) cur17_1 LEFT-JUSTIFIED NO-GROUPING, 'CURR(17,1)',
/(29) cur17_5 LEFT-JUSTIFIED NO-GROUPING, 'CURR(17,5)',
/(29) cur17_14 LEFT-JUSTIFIED NO-GROUPING, 'CURR(17,14)',
/(29) cur17_15 LEFT-JUSTIFIED NO-GROUPING, 'CURR(17,15)'.
ULINE.
WRITE:
/ 'Quantities (Time unit truncates all zeroes after 1st):',
/(29) quan17_3, 'QUAN(17,3)',
/(29) quan17_u UNIT 'STD', 'QUAN(17,3) with UNIT = Time'.
ULINE.
WRITE:
/ 'Big numbers (25 significant digits, max for DEC)' &
' & their output length',
/ '(sufficient output length is autocalculated in domain in SE11)',
/ '12345678901234567890123456789012345 ← positions |↓ output length',
/(35) dec25_0, (1)' ', 'DEC(25,0) |35 (over sufficient)',
/(34) dec25_0, (2)' ', 'DEC(25,0) |34 (sufficient)',
/(30) dec25_0, (6)' ', 'DEC(25,0) |30 (insufficient)',
/(26) dec25_0, (10)' ','DEC(25,0) |26 (minimum)',
/(37) dec25_0 LEFT-JUSTIFIED NO-GROUPING,
'DEC(25,0) |condensed',
/(20) dec25_0, (16)' ','DEC(25,0) |20 (below minimum)'.
WRITE:
/ 'Place for sign is reserved by default, NO-SIGN option exists',
/(35) dec25_14, (1)' ', 'DEC(25,14)|35 (over sufficient)',
/(30) dec25_14, (6)' ', 'DEC(25,14)|30 (sufficient)',
/(30) dec25_14 NO-SIGN, (6)' ',
'DEC(25,14)|30 NO SIGN',
/(28) dec25_14, (8)' ', 'DEC(25,14)|28 (insufficient)',
/(27) dec25_14, (9)' ', 'DEC(25,14)|27 (minimum)',
/(37) dec25_14 LEFT-JUSTIFIED NO-GROUPING,
'DEC(25,14)|condensed',
/(20) dec25_14, (16)' ','DEC(25,14)|20 (below minimun)'.
ULINE.
WRITE:
/ 'Integers from -2147483648 to 2147483647 (4 bytes long):',
/(29) int4, 'INT(4)',
/(29) int4_nos, 'INT(4) NO SIGN'.
ULINE.
WRITE:
/ 'Floating point number (scientific notation):',
/(29) gv_fltp, 'FLTP(8) simple 12345.12345 is not exact here',
/(29) gv_fltp_calculated, 'FLTP(8) 2469.2469/2 isn''t either'.
Ссылки
1. ABAP 7.01 Documentation, Data Types in ABAP Dictionary —
https://help.sap.com/docs/SAP_NETWEAVER_701/6da3d9466c4b1014a5a2e370bd8c5dc8/
fceb3138358411d1829f0000e829fbfe.html?version=7.01.22
2. ABAP 7.54 Documentation, Predefined Numeric Types —
https://help.sap.com/doc/abapdocu_754_index_htm/7.54/en-US/index.htm?
file=abenbuiltin_types_numeric.htm
3. ABAP 7.54 Documentation, Overview of All Built-In Dictionary Types —
https://help.sap.com/doc/abapdocu_754_index_htm/7.54/en-US/index.htm?
file=abenddic_builtin_types.htm
4. ABAP 7.54 Documentation, Integers, Packed Numbers, Binary Floating Point Numbers —
https://help.sap.com/doc/abapdocu_754_index_htm/7.54/en-US/index.htm?
file=abenddic_builtin_types.htm

Вам также может понравиться