Выбери формат для чтения
Загружаем конспект в формате docx
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Лекция 2. ABAP-словарь. Объекты данных и типов
1. Моделирование данных, элементы в ABAP-словаре.
2. Элементарные объекты данных: символьные типы, числа.
Моделирование данных
При разработке организационно-экономического программного обеспечения элементы реальной среды должны быть представлены в виде данных. Например, сущностью является бизнес-единица. Сущности находятся во взаимосвязи друг с другом, что фиксируется в базовой модели данных. Такая модель называется моделью отношений между сущностями (Entity Relationship Model – ERM).
Эта модель данных используется в качестве основы для внедрения соответствующих определений таблиц (прозрачных таблиц), включая их связи друг с другом в ABAP-словаре.
Путем активации определений таблиц в базе данных автоматически создаются соответствующие таблицы базы данных. Фактические прикладные данные вводятся в эти таблицы позже.
Рассмотрим на примере авиарейсов. Если клиенту турагентства требуется попасть из одного местоположения в другое, то он запрашивает у турагентства следующую информацию:
• Какие направления обеспечивают наиболее удобный и прямой маршрут?
• Каково время вылета для рейсов на требуемую дату?
• Каким образом можно улучшить условия перелета для выбора оптимального варианта; т. е. какой рейс является наиболее дешевым, быстрым и обеспечивает прибытие максимально близко к необходимому времени?
Точка зрения турагентства несколько отличается от точки зрения клиента. В модели данных, разработанной для управления необходимыми данными, данные в централизованной базе данных сортируются по техническим критериям в таблицах. Объем имеющихся данных существенно превышает объем, необходимый клиенту.
Необходимо обеспечить возможность программного выбора и вывода только тех данных, которые требуются клиенту.
Модель данных о рейсах содержит объекты для всей логически связанной бизнес-информации, например:
• города;
• аэропорты;
• авиакомпании;
• авиалинии;
• рейсы;
• ...
Эти объекты связаны друг с другом определенным образом:
• Каждое расписание рейсов содержит только одну авиакомпанию, один аэропорт вылета и один аэропорт прибытия.
• Каждый бронируемый рейс всегда относится только к одному существующему расписанию рейсов.
• Возможно присвоение городам близлежащих аэропортов.
С помощью этих взаимосвязей можно осуществлять управление всеми необходимыми данными без возникновения избыточной информации. В то же время турагентство сможет получать любые данные, запрошенные клиентом.
Для каждой сущности, зафиксированной в модели данных, разработчик создает прозрачную таблицу в ABAP-словаре. Сначала она представляет собой только не зависящее от платформы описание таблицы базы данных, а не фактическую таблицу базы данных. Однако при активации прозрачной таблицы в базе данных автоматически создается таблица с тем же именем.
Прозрачная таблица содержит различные поля (столбцы) для структурированного сохранения и управления записями данных. Поля таблицы должны быть описаны как ключевые поля в том случае, если их содержимое должно использоваться для четкой идентификации записей данных в таблице базы данных. Ключ таблицы (табличный ключ) состоит из ключевых полей. Этот ключ также называется первичным ключом. Записи данных в той же таблице должны быть уникальными с точки зрения значений первичного ключа. Таким образом, значение ключа записи данных представляет собой уникальный идентификатор в пределах таблицы.
Описательные элементы в ABAP-словаре
Перед рассмотрением прозрачных таблиц необходимо пояснить два дополнительных термина словаря: элемент данных и домен.
Элемент данных представляет собой общее описание поля. Оно включает в себя семантические и технические атрибуты поля.
Семантические атрибуты поля включают документацию к полю и названия полей. Они сохраняются непосредственно в определении элемента данных. Напротив, технические атрибуты поля, такие как тип данных и длина поля (а также возможность многократного использования), обычно не указываются в фактическом элементе данных, но доступны посредством ссылки на определенный домен.
Элементы данных используются для определения внутренних программных переменных или описания полей прозрачных таблиц.
В ABAP-словаре прозрачная таблица представляет собой внедренное описание соответствующей таблицы базы данных, содержащей фактические прикладные данные.
Поля прозрачной таблицы формируют столбцы с идентичными именами в соответствующей таблице базы данных.
Для ввода поля прозрачной таблицы обычно используется элемент данных. При многократном использовании элемента данных в определении полей различных таблиц можно обеспечить соответствие полей в разных таблицах.
Индикатор Ключ используется для определения поля как ключевого.
Как правило, структура в ABAP-словаре используется для централизованного описания переменных структуры, которые должны содержать поля различных таблиц. Затем эти структуры словаря данных можно использовать в ABAP-программе для определения объектов данных (конкретных переменных структуры), предназначенных для временного сохранения данных в программе или используемых в качестве интерфейса для переноса полей между экраном и ABAP-программой.
Определение структуры словаря данных почти идентично определению структуры прозрачной таблицы. Единственное различие заключается в том, что описание ключевых полей и указание технических параметров для структур не является ни целесообразным, ни необходимым.
Однако при использовании структур, в отличие от полей и элементов данных, определяются компонент и тип компонента, поскольку, в отличие от прозрачных таблиц, структура может являться компонентом другой структуры. Такие структуры с включенными подструктурами в качестве компонентов называются сложными структурами. Соответственно, структуры с простыми компонентами называются простыми структурами.
Использование элементов словаря для определения объектов данных в программе
Определения на приведенном выше рисунке имеют следующее значение:
• DATA mycarrid TYPE s_carr_id.
Возврат объекта данных (переменной) типа, указанного в элементе данных s_carr_id.
• DATA myconnid TYPE sbc400focc-connid.
Возврат объекта данных (переменной) того же типа, что и поле структуры sbc400focc-connid.
• PARAMETERS pa_carr TYPE spfli-carrid.
Возврат поля ввода на экране выбора, а также переменной того же типа, что и поле таблицы spfli-carrid.
• DATA wa_focc TYPE sbc400focc.
Возврат структурной переменной того же типа, что и структура словаря данных sbc400focc.
• DATA wa_spfli TYPE spfli.
Возврат структурной переменной того же типа, что и строка таблицы spfli.
PARAMETERS: определение с помощью элемента словаря
В случае использования элемента данных, структурного компонента или поля прозрачной таблицы для определения поля ввода на экране выбора (оператор PARAMETERS), в дополнение к техническим свойствам, можно использовать семантические свойства соответствующего элемента данных. Когда пользователь нажимает на экране выбора кнопку F1 или F4, автоматически генерируется диалог документации или диалог справки по вводу. Необходимая информация извлекается из ABAP-словаря (документация элемента данных или доступное средство поиска).
Типы данных и объекты данных
В АВАР используется два понятия: тип данных и объект данных.
Формальное описание переменной называется типом данных. Объектом данных является переменная, точно описанная посредством типа данных.
На следующем рисунке показаны возможности использования типов данных.
Использование типов данных
Определение объектов данных
Объекты объектов данных
По своей конструкции объекты данных делятся на следующие виды:
• Элементарные поля
• Структуры
• Внутренние таблицы
Структуры и внутренние таблицы могут вкладываться друг в друга практически до любого уровня вложенности. Структура может содержать в качестве компонентов другие структуры и даже целые внутренние таблицы. Такие объекты называются вложенными структурами. Если структура содержит внутреннюю таблицу или другой компонент переменной длины (компонент типа swing или xstring), она называется глубокой структурой. Напротив, плоские структуры содержат только компоненты фиксированной длины.
Для описания объектов данных используются встроенные типы, глобальные типы, которые описаны на основе встроенных и локальные типы, которые описываются на основе двух предыдущих.
Встроенные типы АВАР
Рассмотрим стандартные типы ABAP, предварительно определенные SAP (внедренные типы).
Characters
Поддерживается два символьных типа: с (собственно символьный)
и n (текст, состоящий из цифр)
Numbers
Поддерживается три цифровых типа: i (целые числа),
р (упакованные числа) и f (числа с плавающей запятой)
Date
Поддерживается один тип даты: d (дата)
Time
Поддерживается один тип для задания времени: t (время)
Hexadecimal
Поддерживается один шестнадцатеричный тип: х (шестнадцатеричный)
Они подразделяются на две группы: полные и неполные.
Перечисленные ниже стандартные типы ABAP являются полными. Это означает, что они уже содержат информацию о фиксированной длине, связанную с тем или иным типом.
Элементарный тип
Размер
Начальное значение
i
4
f
8
0.0
d
8
‘00000000’
t
6
‘000000’
string
Тип символьной строки динамической длины
xstring
Тип байтовой последовательности динамической длины (HeXadecimal string)
Следующие стандартные типы не содержат фиксированной длины (являются неполными). В случае их использования для определений объекта данных необходимо указывать длину переменной.
Неполные стандартные типы ABAP
Элементарный тип
Размер
Начальное значение
с
Тип символьной строки (Character)
1
Пробел
n
Тип числовой символьной строки (Numerical character)
1
‘0’
p
Тип упакованного числа (Packed number)
8
x
Тип для байтовой последовательности (HeXadecimal string)
1
X’00
Глобальные типы данных
Глобальные типы данных определяются в словаре. Они называются встроенными словарными типами и в основном соответствуют встроенным типам АВАР.
Локальные типы данных
Объекты данных определяются в программе с помощью оператора DATA. После указания имени объекта данных ему с помощью дополнения TYPE присваивается полностью определенный тип. Тип связан с объектом данных статически. Он не может быть изменен во время выполнения.
Для описания объектов данных могут использоваться встроенные, глобальные и локальные типы данных.
Если в определении переменной отсутствует информация о типе, то предполагается, что это переменная стандартного типа C.
Напротив, при отсутствии заданной длины используется соответствующая длина по умолчанию для стандартного типа (неполного).
Таким образом, оператор "DATA myvar." без информации о типе или длине определяет символьную переменную с длиной 1, что соответствует длине типа C по умолчанию.
При определении дополнительных переменных можно использовать ссылку на уже определенный объект данных (дополнение LIKE).
Для предварительного определения значения элементарного объекта данных можно добавить ключевое слово VALUE.
Элементарные объекты данных
Символьные типы
Классификация объектов данных как символьных определяется внутренним представлением символов. Поэтому сначала рассмотрим способы представления символов, прежде чем переходить к символьным объектам и их обработке.
Юникод и внутреннее представление символов
Таблица набора символов Юникода
Внутри системы символы представляются 2 байтами, что дает возможность представить 65536 уникальных символов. При этом отпадает необходимость в переключении между кодовыми страницами.
Байтовые и символьные объекты данных
Элементарные объекты данных с байтовым типом данных (х, xstring) называются байтовыми объектами данных.
Элементарные объекты данных с символьным типом данных (с, n, d, t, string) называются символьными объектами данных.
В системах, не использующих Юникод, байтовые объекты данных, как и все плоские структуры, могут обрабатываться как символьные объекты. Напротив, в системах Юникода байтовые и символьные объекты данных необходимо четко различать. Более того, плоские структуры можно обрабатывать как символьные объекты данных только в том случае, если они целиком состоят из символьных компонентов.
Обработка символов и байтов
На следующем рисунке показаны АВАР-операторы, предназначенные для обработки символьных объектов данных:
Обзор АВАР-команд обработки строк
Операнды каждого из этих операторов рассматриваются как поля типа с, независимо от их фактического типа. Они не подлежат преобразованию. Все эти операторы, кроме TRANSLATE и CONDENSE, устанавливают поле sy-subrc. Оператор SEARCH также устанавливает системное поле sy-fdpos, в котором содержится смещение найденной символьной строки.
Рекомендация: Рекомендуется по возможности использовать оператор FIND вместо SEARCH, поскольку он быстрее выполняется. Следует иметь в виду, что оператор FIND не устанавливает системное поле sy-fdpos. Позиция найденной строки возвращается в параметре команды.
Обработка строки/последовательности байтов
Все эти операторы, за исключением CONDENSE и OVERLAY, можно также использовать для обработки байтовых объектов данных. В системе Юникода необходимо использовать дополнение IN BYTE MODE, чтобы анализировать байты каждый в отдельности, а не парами. Для обработки символьных объектов данных аналогичное дополнение IN CHARACTER MODE необязательно.
Длина и сравнение
Для определения длины строки служит стандартная функция STRLEN (). Для байтовых объектов данных предусмотрена аналогичная функция XSTRLEN( ).
Для сравнения содержимого символьных объектов данных применяются следующие операторы: СО, CN, CA, NA, CS, NS, СР и NP. С введением Юникода стали доступны аналогичные операторы для байтовых объектов данных - с префиксом BYTE- .
В программе можно обратиться непосредственно к фрагменту символьного или байтового объекта данных, указав соответствующие значения смещения и длины.
В программе можно обратиться непосредственно к фрагменту символьного или байтового объекта данных, указав соответствующие значения смещения и длины.
Для символьных полей смещение/длина интерпретируется как число символов
Для байтовых полей значения смещения и длины считаются выраженными в байтах
Спецификации длины и смещения интерпретируются как количества байтов для байтовых объектов данных или как количества символов для символьных объектов (т. е. количества одиночных байтов или пар байтов, в зависимости от системной настройки).
В плоских структурах доступ по смещению возможен даже в случае, если объект не полностью символьный (т. е. символьными являются только первые поля), при условии, что доступ производится только в пределах символьной области.
Доступ к структурам с указанием смещения и длины
Внимание: По возможности избегайте доступа к содержимому структуры этим методом. Используйте компоненты и строковые операции - это сделает программу гораздо более надежной и удобочитаемой.
Как уже упоминалось, в языке АВАР/4 поддерживается два символьных типа. Тип с применяется для символов или текстовых полей, a n — для текстов, состоящих из цифр.
Символ (текст)
Текстовые поля, в которых задается обычная текстовая информация, имеют тип с (символьный). Если тип не указан, по умолчанию используется тип с. Рассмотрим пример:
data: name(25) type о,
city(25),
flag,
single_character value 'A'.
В этом примере поля city и flag имеют по умолчанию тип с, так как другой тип не задан. Поскольку размер поля flag не указан, он равен одному символу (напомним, что длина символьного поля по умолчанию — 1). Теоретически размер символьных полей в приложениях не ограничен, но по чисто техническим причинам он не должен быть выше 64 Кбайт. При превышении этого предела во время синтаксической проверки появляется сообщение об ошибке. Если в операторе data начальное значение поля не указано, до начала выполнения программы поля типа с заполняются пробелами, а поля с заданными начальными значениями не изменяются.
Если поле и соответствующее ему значение литерала или константы имеют разные размеры, это начальное значение или усекается (если оно больше размера поля) или дополняется пробелами справа (если оно меньше):
data language(2) value 'АВАР/4'.
В этом примере поле language будет иметь начальное значение АВ, так как последние 4 байт текстовой строки АВАР/4 будут отброшены.
Цифровой текст
Переменные типа n (цифровой текст) содержат текстовые строки, состоящие из цифр, например, 0123456789. С их помощью записываются цифры, которые используются для идентификации и сортировки внутренних таблиц. Например, поля типа n часто содержат различные идентификационные номера, такие как номера домов, почтовые индексы (коды ZIP), номера частей, номера счетов и т.д.
Начальные значения полей типа с заполняются пробелами справа, а поля типа n — цифрой 0 слева. Предположим, нужно вывести на экран список идентификаторов клиентов, имеющих разные длины и дополненных нулями слева. Запишите следующий программный текст:
data cuetomar_id (8) type n.
customer_id = '1234'.
write customer_id.
Идентификатор клиента будет напечатан как 00001254. Если использовать для идентификатора клиента тип с, появится число 1234____ (с завершающими пробелами).
Размер поля типа п по умолчанию равен 1, а начальное значение состоит из соответствующего длине числа нулей — 0000 для цифрового текста длиной 4.
Числа
Для чисел АВАР/4 поддерживает следующие типы: целые, упакованные числа и числа с плавающей запятой.
Целые
Поля типа i используются в основном для счетчиков, например, для подсчета числа клиентов или числа шагов цикла:
data: customer_number type i ,
loop_counter type i.
Целое поле имеет фиксированный размер — 4 байта, следовательно, нет необходимости задавать его длину в явном виде. Возможный диапазон допустимых значений — от -231 до 231-1. При выполнении начальное значение целого поля устанавливается равным 0, однако его можно задать следующим образом:
data word_length type i value 17.
Целые числа и целочисленная арифметика
Целые числа и целочисленная арифметика
Для целых чисел типа і используется внутреннее представление в виде двоичных чисел длиной 4 байта. Таким образом, их диапазон значений – от -1031+1 до 1031-l.
Вычислительные операции целочисленной арифметики выполняются быстрее, чем операции арифметики с фиксированной или плавающей запятой, поскольку при их выполнении непосредственно используется набор арифметических команд процессора.
Нецелые результаты округляются до ближайшего целого числа.
Внимание: В отличие от многих других языков программирования, в АВАР результат операции целочисленной арифметики округляется до ближайшего целого в большую или меньшую сторону.
Например:
DATA int TYPE i.int =4/10. "Ergebnis: Oint
=5/10. "Ergebnis: 1
Более того (опять же в отличие от большинства других языков программирования), округляются также все промежуточные результаты.
Например:
DATA int TYPE i.int = 10 * ( 4 /10
). "Ergebnis: Oint = ( 10 * 4 ) / 10
"Ergebnis: 4
Если промежуточный результат выходит за пределы диапазона значений типа данных і, возникает динамическая ошибка.
Числа с плавающей запятой
Число с плавающей запятой (тип f) используется в сложных арифметических вычислениях. Например, число age_of_earth, определяемое в приведенном ниже примере, имеет начальное значение 123х108 (т.е. с мантиссой, равной 123, и показателем степени 8):
data age_of_earth type f value '123E+8'.
Значение числа с плавающей запятой может быть представлено несколькими эквивалентными способами:
data: fl type f,
f2 type f,
f3 type f.
fl = 1.
f2 = '-12.34567'.
f3 = '-765E04'.
Начальное значение числа с плавающей запятой равно 0, если при определении в операторе data не задано другое. Допустимый диапазон значений — от 1Е-307 до 1ЕЗ07. Стандартный размер поля числа типа f, полученного в результате вычислений, равен 22.
Операции, использующие числа с плавающей запятой выполняются сервером очень быстро. Однако при работе с типом f следует быть особенно внимательным, так как даже при простейших вычислениях могут обнаружиться ошибки округления, как, например, в следующем простом выражении:
fl = ('1.0' / '3.0') * '3.0'.
Поскольку ошибки округления нельзя исключить, число с плавающей запятой лучше не использовать в условных выражениях с оператором " или eq:
if fl = '1'.
Условие, приведенное в примере (f1 = '1'), не может быть выполнено. Его следует заменить более сложным выражением типа
if '0.9999999999' < fl and fl < '1.0000000001.'
В коммерческих приложениях числа с плавающей запятой находят применение в основном для хранения промежуточных результатов очень сложных арифметических операций, например при графическом представлении результатов вычислений. Позже они обычно преобразуются в упакованные числа. Если использовать только упакованные числа, все промежуточные результаты будут округляться согласно правилам десятичной арифметики, поэтому могут значительно отличаться от результатов, полученных при использовании чисел с плавающей запятой, так как операции над числами с плавающей запятой выполняются по правилам двоичной арифметики. Для небольших чисел предпочтение следует отдать целым без десятичной запятой, а для операций с большими числами или с десятичными дробями — упакованным числам.
Числа с плавающей запятой и арифметика с плавающей запятой
Числа с плавающей запятой представляются в виде чисел с плавающей запятой двойной точности. Числа с плавающей запятой нормализуются, причем и характеристика, и мантисса хранятся в двоичной форме. Такое представление соответствует стандарту IEEE для чисел с плавающей запятой двойной точности (IEEE-754).
Арифметика с плавающей запятой
Внимание: Для вычислений в арифметике с плавающей запятой используются операции с плавающей запятой соответствующих процессоров. Поскольку алгоритмы выполняются над двоичными числами, могут возникать погрешности. Степень и эффект таких погрешностей не поддаются оценке.
Например:
Предположим, требуется вычислить процент от числа (7,27% от 73050) и вывести результат с точностью до двух десятичных разрядов. Ответ должен быть равен 5310,74 (73050 * 0,0727 = 5310,735). Однако в результате программирования получается следующее:
DATA: float TYPE f, pack TYPE p DECIMALS
2. float = 73050 * '0.0727'. "Ergebnis:
5.3107349999999997E+03pack = float. WRITE pack.
"Ergebnis: 5310.73
В силу таких причин арифметика с плавающей запятой не вполне подходит для деловых расчетов, поскольку они должны производиться с точностью "до цента" и в соответствии с общепринятыми правилами округления. Поэтому числа с плавающей запятой следует использовать только для приближенного представления. При сравнении чисел с плавающей запятой необходимо всегда использовать интервалы и округлять итоговые результаты вычислений.
Главное преимущество чисел с плавающей запятой заключается в широте диапазона допустимых значений: от 2,2250738585072014Е-308 до 1,7976931348623157Е+308, включая положительные числа, отрицательные и ноль. Кроме того, числа с плавающей запятой необходимо использовать в специальных функциях агрегации оператора SELECT.
Упакованные числа
Поле типа упакованного числа (типа р) дает возможность хранить числа во внутреннем представлении данных в упакованном виде. Такие числа имеют более широкий диапазон значений и могут использоваться в машинных вычислениях. Область применения полей этого типа:
• Очень большие числа (более 31 значащей цифры)
• Числа с фиксированным количеством знаков после запятой
• Округление по правилам десятичной арифметики
Упакованные числа и арифметика с фиксированной запятой
Упакованные числа и арифметика с фиксированной запятой
Упакованные числа были введены в АВАР с целью включить в диапазон допустимых значений десятичные числа, избежав при этом проблем округления, характерных для чисел с плавающей запятой.
При определении упакованных чисел можно указать длину числа в байтах. Связь между диапазоном значений и длиной определяется внутренним представлением упакованных чисел. Каждая десятичная цифра представляется полубайтом, причем последний полубайт зарезервирован для знака (плюс или минус). Следовательно, количество десятичных цифр выводится из числа байтов по формуле nразряд = 2 nбайт -1. Сколько из этих разрядов должно располагаться правее запятой, определяется дополнением DECIMALS. Впрочем, максимальное число десятичных разрядов равно 15. Кроме того, число должно содержать по крайней мере одну цифру левее запятой.
Предположим, нужно рассчитать популяцию москитов в данной местности. Возможно следующее определение переменной:
data numbar_of_mosquitoes type p.
Очевидно, что в этом случае значение по умолчанию будет равно 0. Размер поля по умолчанию — 8 байт, в них можно записать до 15 значащих цифр и знак (+ или -). Это и есть диапазон возможных значений для упакованного числа, размер которого задан по умолчанию (и которое не имеет знаков после запятой):
от -999,999,999,999,999 до + 999,999,999,999,999.
Если при подсчете число окажется больше, система немедленно прекратит выполнение программы, выведет на экран текущий выполняемый оператор и всю относящуюся к нему информацию (например, содержимое связанных с оператором полей).
Упакованные числа могут иметь десятичные позиции после запятой. Предположим, вы работаете в международной компании, выпускающей сумки для авиапассажиров, и хотите вычислить стоимость новой модели такой сумки. Чтобы получить результат в долларах США, поле следует определить следующим образом:
data airbug_price type p dacimals 2.
Этот оператор определяет число airbag_price (цену сумки) как десятичное с двумя знаками после запятой. Его начальное значение: 0.00.
Разрешается также задавать размер упакованного числового поля в явном виде, причем максимальная длина равна 16, что соответствует числу с S1 значащей цифрой плюс знак числа:
data packed_16 (16) type p.
Число packed_16 в данном примере содержит S1 значащую цифру и знак числа. В самом общем случае число значащих цифр в упакованном числе определяется длиной n и вычисляется из выражения: число цифр равно (2n-1).
В вычислениях используется арифметика с фиксированной запятой с выравниванием по запятой. Таким образом, числа с фиксированной запятой идеально подходят для деловых расчетов, где крайне важно правильно округлять результаты до требуемого разряда. Алгоритм выполнения таких арифметических операций аналогичен вычислению с помощью карандаша и бумаги. В качестве промежуточных результатов первоначально используются упакованные числа с 31 десятичным разрядом. В случае переполнения все выражение целиком пересчитывается заново с внутренней точностью в 63 десятичных разряда. Если опять возникает переполнение, генерируется особая ситуация (которая может быть обработана).
Рекомендация: Арифметику с фиксированной запятой можно отключить в атрибутах программы. В таком случае дополнение DECIMALS, определяющее упакованное число, будет влиять только на формат вывода числа. Внутри системы все числа интерпретируются как целые числа, независимо от положения запятой. Режим арифметики с фиксированной запятой всегда выбирается по умолчанию. Рекомендуется всегда оставлять этот режим в силе и использовать в деловых расчетах упакованные числа.
Смешанные арифметические выражения
Арифметическое выражение может включать комбинацию из разных числовых типов данных. Если в арифметическое выражение входит по крайней мере один объект данных числового типа, оно может также содержать объекты данных символьного типа при условии, что их содержимое может быть интерпретировано как числа. Значения, содержащиеся в таких объектах символьного типа, преобразуются в числовой тип.
Требуемая арифметика выбирается перед выполнением вычислений на основе типов данных. Поскольку разным видам арифметики соответствуют разные степени внутренней погрешности, одно и то же арифметическое выражение может дать разные результаты в зависимости от того, какие типы данных в нем участвуют. Этот факт иллюстрируется примерами, представленными на следующем рисунке.
Результаты смешанных арифметических выражений
При выборе арифметики принимаются во внимание типы данных всех операндов, наряду с типом данных поля результата. После определения подходящей арифметики все операнды преобразуются в числовой тип, соответствующий этой арифметике. Система выполняет вычисления, используя преобразованные значения, и в заключение приводит результат к требуемому типу.
Рекомендация: Следует иметь в виду, что все эти преобразования отражаются на производительности. Чтобы избежать этого, проследите за тем, чтобы все операнды и поле результата относились к одному числовому типу.
Арифметика, используемая в смешанных выражениях
Выбор арифметики производится по следующим правилам.
• Целочисленная арифметика используется только в случае, если все операнды и результат имеют тип данных і.
• Арифметика с плавающей запятой используется, если хотя бы один операнд или поле результата имеет тип данных f.
• .Арифметика с фиксированной запятой используется во всех остальных случаях, т. е. если хотя бы один операнд или результат имеет тип р, но ни один из них не относится к типу f.
Внимание: При использовании тригонометрических и прочих математических функций, логарифмов и экспоненциальных функций (включая оператор **) в вычислениях всегда применяется арифметика с плавающей запятой.
Например:
DATA int TYPE і. int = ( 1 / 4 ) * ( 2 * 2).
"Ergebnis: 0 int = (1/4) * (2** 2). "Ergebnis: 1
Внимание: Следует соблюдать осторожность при использовании числовых литералов с большими значениями. Они могут быть отнесены к типу і, только если не выходят за пределы диапазона значений для этого типа данных.
Например:
DATA int TYPE i.
int = 1000000000 / 300000000 * 3. "Ergebnis: 9
int = 10000000000 / 3000000000 * 3."Ergebnis: 10