Переменные и типы данных
ABL позволяет определять программные переменные для использования в приложении. Переменная должна быть определена с определенным типом данных. Переменная может быть инициализирована значением при её определении или же ей может быть присвоено значение позже. Для определения переменных используется оператор VAR или оператор DEFINE VARIABLE. Оператор VAR— это более новая сокращённая запись оператора DEFINE VARIABLE. Большинство переменных можно определить с помощью оператора VAR.
Оператор VAR
Базовый упрощённый синтаксис оператора VAR:
VAR datatype varname [ = expression[, expression ]...].
Здесь,
- datatype – указывает тип данных переменной, например, CHAR, INT, DECIMAL, DATE, LOGICAL. Ниже приведён список поддерживаемых типов данных;
- varname – задаёт имя переменной;
- expression – выражение, результатом которого является тип данных, соответствующий типу данных определённому переменной. См. таблицу значений по умолчаний для каждого типа данных.
В следующем примере кода показаны некоторые определения переменных с использованием оператора VAR.
/* Символьная переменная с начальным значением */ VAR CHAR s1 = “abc”. /* Целочисленная переменная */ VAR INT count. /* Переменная с типом даты с начальным значением */ VAR DATE d1 = 1/1/2020. /* Логическая (булева) variable */ VAR LOGICAL isPaidFor. /* Символьный массив из трёх элементов */ VAR CHAR[3] s2. /* Целочисленный массив из двух элементов */ VAR INT[2] z = [100, 200]. /* Объектная переменная с созданием экземпляра класса */ VAR myclass myobj = NEW myclass(“Progress”, 2021, ?). /* Массив объектной переменной с созданием экземпляра класса для каждого элемента*/ VAR StateClass[2] objArrayA = [NEW StateClass(“MA”), NEW StateClass(“NH”)]. /* Неопределённый массив объектной переменной */ VAR StateClass[] objArrayB = [NEW StateClass(“MA”), NEW StateClass(“NH”)]. /* Объектная переменная, использующая выражения в качестве параметров */ VAR point p1 = NEW point(x – 5, y + 5).
Оператор DEFINE VARIABLE
Базовый упрощённый синтаксис оператора DEFINE VARIABLE:
DEFINE VARIABLE varname AS datatype
[ INITIAL { value } ]
[ EXTENT [ n ] ]
[ NO-UNDO ].
Здесь,
- varname – задаёт имя переменной;
- datatype – указывает тип данных переменной, например, CHAR, INT, DECIMAL, DATE, LOGICAL. Ниже приведён список поддерживаемых типов данных;
- INITIAL value – указывает начальное значение для переменной (необязательная опция). Если указано, значение должно быть константой. Список начальных значений по умолчанию для каждого типа данных представлен в таблице ниже.
- EXTENT n – указывает на то, что переменная является массивом размера n (необязательная опция). Размер массива должен быть целым числом. После определения массива вы можете ссылаться на отдельные элементы массива в коде, заключая индекс массива в квадратные скобки, на пример, myVar[2] = 5.
- NO-UNDO – указывает на то, что для переменной не требуется поддержка транзакций. Лучше всего всегда использовать NO-UNDO для переменных, если это явно не требуется, чтобы предотвратить ненужные накладные расходы.
Типы данных
ABL поддерживает ряд типов данных. Каждый тип данных имеет значение по умолчанию, которое можно переопределить. Типы данных ABL перечислены в следующей таблице.
| Тип данных | Значение по умолчанию |
| CHARACTER или CHAR | «» (пустая строка) |
| CLASS jbject-type-name | Неопределённое значение (?) |
| DATE | Неопределённое значение (?) |
| DATETIME | Неопределённое значение (?) |
| DATETIME-TZ | Неопределённое значение (?) |
| DECIMAL | 0 |
| HANDLE | Неопределённое значение (?) |
| INTEGER или INT | 0 |
| INT64 | 0 |
| LOGICAL | Неопределённое значение (?) |
| MEMPTR | Неопределённое значение (?) |
| RAW | Последовательность байтов нулевой длины |
| ROWID | Неопределённое значение (?) |
Присвоение значений переменным
ABL присваивает значения переменным с помощью оператора присваивания ( =). В следующем примере переменной name присваивается строка NewCustomer.
/* Установить для локальной строковой переменной значение "NewCustomer" */ name = "NewCustomer".
Дополнительные сведения см. в разделе Assigning a value to a variable.
В ABL есть составные операторы присваивания ( +=, -=, *=, /=), которые позволяют комбинировать операторы сложения, вычитания, умножения и деления с присваиванием. Дополнительные сведения см. в разделе «Составные операторы присваивания».
Неопределённое значение в ABL
Для определенных типов данных, когда элементу данных ещё не присвоено значение, ABL связывает неопределённое значение с элементом данных. В ABL неопределённое значение представлено знаком вопроса (?). Обратите внимание, что вопросительный знак не заключается в кавычки; вопросительный знак действует как специальный символ сам по себе. Неопределённое значение (?) не равно какому-либо определенному значению.
В ABL следующий оператор «IF ShipDate = ?» выглядит так, как будто выполняется сравнение значения со знаком вопроса, но на самом деле оператор спрашивает, переменная ShipDate имеет ли неопределённое значение, или другими словами, переменная не имеет конкретного значения. Неопределённое значение похоже на значение NULL в SQL, а выражение IF ShipDate = ? похоже на выражение SQL IF ShipDate IS NULL.
Дополнительные сведения см. в разделе Using the ABL Unknown value.
Составные операторы присваивания
В ABL есть четыре составных оператора присваивания ( +=, -=, *=и /=), которые можно использовать для выполнения операции и присвоения значения с использованием сокращённой записи. Эти операторы присваивания делают ваш код более кратким и более лёгким для чтения и понимания. Поддерживаемые операции включают сложение (числовое и основанное на дате) и конкатенацию, вычитание (числовое и основанное на дате), умножение и деление.
В следующей таблице синтаксис каждого оператора присваивания сравнивается с эквивалентным базовым синтаксисом, а также указывается, какие типы операций поддерживаются.
| Оператор | Синтаксис оператора присваивания | Эквивалентный базовый синтаксис | Поддерживаемые операции |
| += | field += expression | field = field + (expression) | Конкатенация, числовое и основанное на дате сложение |
| -= | field -= expression | field = field – (expression) | Числовое и основанное на дате вычитание |
| *= | field *= expression | field = field * (expression) | Числовое умножение |
| /= | field /= expression | field = field / (expression) | Числовое деление |
Дополнительные сведения см. в разделах:
- += Оператор присваивания сложения
- -= Оператор присваивания вычитания
- *= Оператор присваивания умножения
- /= Оператор присваивания деления
Формат отображения переменных
Оператор DISPLAY — это оператор ABL, который можно использовать для отображения вывода. Этот оператор можно использовать вместе со встроенным пользовательским интерфейсом (UI). Большинство современных приложений не используют встроенный пользовательский интерфейс для отображения вывода, но встроенный пользовательский интерфейс может быть полезен при прототипировании или отладке кода. Встроенный пользовательский интерфейс полезен при изучении ABL, поскольку вы можете попробовать код ABL и быстро отобразить вывод без необходимости изучения другого пользовательского интерфейса.
При использовании оператора DISPLAY для отображения значения переменной вы можете либо использовать формат отображения ABL по умолчанию для типа данных переменной, либо указать пользовательский формат отображения. Пользовательский формат указывается с помощью фразы FORMAT в операторе DEFINE VARIABLE.
Упрощённый синтаксис оператора DEFINE VARIABLE с фразой FORMAT:
DEFINE VARIABLE variable-name AS data-type [ FORMAT "format-phrase" ] [ NO-UNDO ].
В следующем примере кода операторы DEFINE VARIABLE для переменных myStrCustom и myDecCustom переопределяют форматирование по умолчанию. myStrCustom определен для отображения двадцати символов. myDecCustom определен для отображения четырёх знаков после запятой. Для целей сравнения определены две дополнительные переменные, myStrDefault и myDecDefault, которые не изменяют форматирование по умолчанию.
DEFINE VARIABLE myStrDefault AS CHARACTER NO-UNDO. DEFINE VARIABLE myStrCustom AS CHARACTER FORMAT "x(20)" NO-UNDO. DEFINE VARIABLE myDecDefault as DECIMAL NO-UNDO. DEFINE VARIABLE myDecCustom as DECIMAL FORMAT "->>,>>9.9999" NO-UNDO. myStrDefault = 'abcdefghijklmnopqrstuvwxyz'. myStrCustom = 'abcdefghijklmnopqrstuvwxyz'. myDecDefault = 123.456789. myDecCustom = 123.456789. DISPLAY myStrDefault myStrCustom myDecDefault myDecCustom.
Выполнение кода приводит к следующему выводу:
myStrDefault myStrCustom myDecDefault myDecCustom ------------ -------------------- ------------ ------------ abcdefgh abcdefghijklmnopqrst 123.46 123.4568
Примечание: к оператору MESSAGE не применяются ни стандартные, ни пользовательские форматы отображения.
