ОПЕРАЦИИ И СТАНДАРТНЫЕ ФУНКЦИИ


ОПЕРАЦИИ


Все операции в ABL можно разделить на: арифметические операции, операции сравнения и логические операции, а так же на операции с определенными типами данных, такие как: операции с датами и операции со строками.


АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ

 

Операции Операнд Пример
Вычитание - A – B
Используется также для смены знака
переменной или целого выражения
A (унарный минус)
Сложение + A + B
Умножение * A * B
Деление / A / B
Остаток от деления MODULO A MOD B
Результатом является целочисленное
значение (тип INTEGER или INT64)

DISPLAY 10 + 12.
DISPLAY 10 - 12.
DISPLAY 10 * 12.
DISPLAY 12 / 4.
DISPLAY 13 mod 5.

 Результат: 22 -2 120 3 3 


ОПЕРАЦИИ СРАВНЕНИЯ

Результатом операций сравнения является логическое значение, принимающее TRUE в случае выполнения условия сравнения и FALSE в противном случае.

Описание Символьный операнд Буквенный операнд
Больше > GT
Меньше < LT
Равно = EQ
Больше или равно >= GE
Меньше или равно <= LE
Не равно <> NE

Сравнение может осуществляться только со значениями одного типа данных.

DEF VAR iLog AS LOGICAL  NO-UNDO.
DEF VAR iDec AS DECIMAL  NO-UNDO.

iDec = 10.
iLog = (iDec <> 20).

DISPL iLog.


ЛОГИЧЕСКИЕ ОПЕРАЦИИ

Существуют следующие логические операции:

Описание Операнд
Инверсия (Отрицание) NOT
Конъюнкция (И) AND
Дизъюнкция (ИЛИ) OR

Операция NOT осуществляет инверсию логического значения. Операция инверсии логического значения TRUE дает результат FALSE, а инверсия значения FALSE - TRUE.

Результатом операция AND будет логическое значение TRUE, если все операнды входящие в нее равны TRUE. Если хотя бы один из операндов равен FALSE, то результатом такой операции будет FALSE.

Операция OR реализует логическое ИЛИ, результатом такой операции будет TRUE, если хотя бы один из операндов равен TRUE.

DEF VAR a  AS LOGICAL NO-UNDO.
DEF VAR b AS LOGICAL NO-UNDO.
DEF VAR c1 AS LOGICAL NO-UNDO.
DEF VAR c2 AS LOGICAL NO-UNDO.
DEF VAR c3 AS LOGICAL NO-UNDO.

a = TRUE.
b = FALSE.

c1 = NOT a.
c2 = (a AND b AND c1).
c3 = (a OR b).

DISPLAY c1 c2 c3.


ОПЕРАЦИЯ ПРИСВАИВАНИЯ

Операция присваивания ( = ) используется для присвоения значения, например, переменным или полям записи таблицы. При этом, тип данных чему присваивается значение и тип присваиваемого значения должны быть совместимы.

a = b [NO-ERROR].

  • a - приемник (переменная, поле записи);
  • b – значение присваиваемое приемнику a.

Оператор ASSIGN также является оператором присваивания. Его основная отличительная особенность от простого оператора присваивания заключается в том, что в рамках одного оператора ASSIGN может быть присвоены значения нескольким приемникам. Таким образом, по производительности оператор ASSIGN значительно превосходит простой оператор присваивания ( = ).  

ASSIGN  
a = b

   c = d
   x = y
NO-ERROR.


ОПЕРАЦИИ С ДАТАМИ

C датами можно совершать операции сложения или вычитания даты и количества дней. Результатом таких операций будет являться дата (значение типа DATE) смещенная на вычитаемое или складываемое число дней.


Сложение даты и числа:

DISPLAY 10/02/11 + 11.

Результатом данной операции будет смещенная на 11 календарных дней вперед дата.

В данном случае дата 10/02/11 воспринимается как 2 октября 2011 года, т.е. в формате mm/dd/yy. Результат 13/10/11 отображается в формате dd/mm/yy, о чем было разъяснено ранее.


Вычитание числа из даты:

DISPLAY 10/13/11 – 11.

Результатом данной операции будет смещенная на 11 календарных дней назад дата - 02/10/11.

Так же возможно вычитание одной даты из другой, результатом при этом является число дней между этими датами, выраженное значением целочисленного типа (INTEGER).

DISPLAY 01/01/2013 - 01/01/2012.

Результатом данной операции является число дней между вычитаемыми датами - 366 дней.


ОПЕРАЦИИ СО СТРОКАМИ

Сцепление строк (Конкатенация):

Для сцепление строк применяется операнд "+".

DISPLAY "Иванов" + " " + "Иван" + " " + "Иванович".

Результат: Иванов Иван Иванович

Если один из сцепляемых элементов имеет значение - ?, то результат конкатенации тоже будет - ? (неизвестное значение).

DEF VAR vDate AS DATE NO-UNDO.
vDate = ?.
DISPL "Сегодня: " + STRING(vDate).

Результат: ?


Сравнение строк:

Сравнение строк осуществляется посимвольно, слева направо. При этом, фактически осуществляется сравнение кодов символов.

"abcd" = "ABCD "

Стоит учитывать, что при сравнении, строки приводятся к верхнему регистру и конечные пробелы опускаются. Результатом сравнения строк будет являться сравнение первых не совпадающих символов.

"ABCD" < "ACDE"

Данное выражение будет верно. Первые символы этих строк равны "A" = "A" . Таким образом, на результат влияют 2-е символа в строках "B"< "C".


Сравнение строки с шаблоном:

Оператор MATCHES осуществляет проверку соответствия строки указанному шаблону. При описании шаблона применяются следующие символы:

* - любая последовательность символов;
. - любой единичный символ.

IF "Иванов Иван Иванович" MATCHES *Иван* THEN
DISPLAY "соответствует".
ELSE DISPLAY "не соответствует".

Сравнение начала строки с последовательностью символов:

Для сравнения совпадения начальных символов строки указанной последовательности символом используется операнд BEGINS.

IF "Иванов Иван Иванович" BEGINS "ива" THEN
DISPLAY "соответствует".
ELSE DISPLAY "не соответствует".


ПРИОРИТЕТ ОПЕРАЦИЙ

Все операции имеют свой приоритет выполнения в составе выражения.

Операции Приоритет
Унитарные - и + 7
MODULO, / (деление), * (умножение) 6
+ (сложение), - (вычитание) 5
BEGINS, MATCHES, <, >, <=, >=, =, <> 4
NOT 3
AND 2
OR 1
 

Очередность выполнения операций, составляющих выражения, определяется их приоритетами. Операции с высшим приоритетом выполняются ранее чем операции с низшим приоритетом.

Очередность выполнения может быть измена путем заключения выражения в круглые скобки.

Таким образом, при вычислении выражения первым делом необходимо расставить приоритеты всех операций составляющих его.


СТАНДАРТНЫЕ ФУНКЦИИ



АРИФМЕТИЧЕСКИЕ ФУНКЦИИ

MINIMUM(X1,X2,...,Xn). Возвращает минимальное значение из последовательности X1,X2,...,Xn. Последовательность X1,X2,...,Xn должна быть однотипных переменных или констант, но их тип может быть любой, например: последовательность чисел, дат, текстовых символов. Допускается сокращение до MIN

DISPL MIN(4,10,3.5,24).
DISPL MIN('j', 'l', 'c', 'w').
DISPL MIN(TRUE,FALSE).

Результат: 3.50 c No.

MAXIMUM(X1,X2,...,Xn).Возвращает максимальное значение из последовательности X1,X2,...,Xn. Последовательность X1,X2,...,Xn такая же, как и для функции MINIMUM. Допускается сокращение до MAX.

DISPL MAX(4,10,3.5,24).
DISPL MAX('j', 'l', 'c', 'w').
DISPL MAX(TRUE,FALSE).

Результат: 24 w Yes.

LOG(a, b). Возвращает логарифм a по основанию b

SQRT(X). Возвращает корень квадратный из x.

ABSOLUTE(X). Возвращает абсолютное значение (значение по модулю) переменной X. Допускается сокращенная запись ABS(x).

RANDOM(min, max). Генератор случайного числа в пределах между min и max.

ROUND(X, n). Округляет число X до n знаков после точки.

TRUNCATE(X, n). Обрезание числа X до n знаков после точки.

EXP(a, b). Возведение числа a в степень b.

 
ФУНКЦИИ ПРИВЕДЕНИЯ ТИПОВ

В ABL осуществляется два вида приведения (преобразования) значения одного типа данных в значение другого типа: неявное и явное. Неявное приведение осуществляется автоматически компилятором.

Явное приведение типов задается программистом при помощи специальных функций:

DECIMAL(s). Преобразование переменной s любого типа в численный тип DECIMAL.

INTEGER(s). Преобразование переменной s любого типа в целочисленный тип INTEGER. При необходимости производится округление.

DISPLAY INTEGER("23.67").

Результат: 24

INT64(s). Преобразование переменной s любого типа в целочисленный тип INT64. При необходимости производится округление.

Функции DECIMAL, INTEGER и INT64, в случае когда аргументом является переменная логического типа, возвращают значение 1 для логического значения TRUE и 0 для значения FALSE.

Все гораздо сложнее и вместе с тем интереснее становится, когда аргументами данных функций являются переменные типа DATE. Запустим на исполнение следующий код:

DEF VAR i AS DATE NO-UNDO.
i = 01/01/-32768.
DISPLAY INTEGER(i) FORMAT "->>>,>>>,>>9".

Результат: -10,247,087

Выбранная нами дата 01.01.32768 до н.э является, как говорилось ранее, минимально возможной датой для переменной типа дата. Теперь попробуем проделать тоже самое но для даты 31.12.4714 до н.э:

DEF VAR i AS DATE NO-UNDO.
i = 12/31/-4714.
DISPLAY INTEGER(i) FORMAT "->>>,>>>,>>9".

Результат: 0

Повторим еще раз, но уже для даты 31.12.32767 н.э., т.е. максимально возможной даты:

DEF VAR i AS DATE NO-UNDO.
i = 12/31/32767.
DISPLAY INTEGER(i) FORMAT "->>>,>>>,>>9".

Результат: 13,689,326

Все выше описанное дает аналогичный результат при использование функции DECIMAL вместо INTEGER.

Таким образом, дата представляется в виде числа дней прошедших с полудня 01.01.4713 до н.э., иначе говоря, Юлианским днем. 4 октября 1582 года в католических странах папой Григорием XIII был введен новый - Григорианский календарь и следующим днём после четверга 4 октября стала пятница 15 октября.

DEF VAR JulianGregorianDate AS DATE NO-UNDO INIT 10/04/1582.
MESSAGE
   JulianGregorianDate WEEKDAY(JulianGregorianDate) SKIP
   JulianGregorianDate + 1 WEEKDAY(JulianGregorianDate + 1) SKIP
VIEW-AS ALERT-BOX INFO BUTTONS OK.

STRING(s [, format]). Преобразовывает переменную s к строковому типу, при этом возможно указание формата, но не обязательно.

DATE(month, day, year). Преобразование трех целочисленных соответствующих значений в  значение типа DATE.

DATE(s). Преобразование строки s в тип DATE. Строка s может представлять разделенные при помощи символов "/" или "." текстовых значений месяца, дня и года, либо данные разделители могут отсутствовать. Дни и месяцы обязательно должны быть представленный двумя символами, а год либо четырьмя, либо двумя.

DISPLAY DATE(09.10.11) DATE(09/10/2011) DATE(091011) DATE(09102011).

DATETIME(month, day, year, hours, minutes [, seconds [, milliseconds ] ] ). Функция преобразования списка соответствующих целочисленных значений в значение типа DATETIME.

DATETIME(s). Преобразование строки s в тип DATETIME.

DATETIME (date-exp [, mtime-exp ] ). Преобразование значения date-exp типа DATE и числа миллисекунд прошедших с полуночи mtime-exp типа INTEGER в значение DATETIME.


ФУНКЦИИ РАБОТЫ СО СТРОКАМИ

LENGTH(s). Возвращает длину строки s выраженную в количестве символов. Результатом является целочисленное значение типа INTEGER.

NUM-ENTRIES(list, delimeter). Возвращает число слов входящих в список list, представляющий собой набор слов разделенных символом delimeter. Если разделитель (delimetr) неуказан, он по умолчанию принимает значение запятой.

LOOKUP(s, list, delimeter). Возвращает порядковый номер строки s из списка list (такого же, как и в функции NUM-ENTRIES) если данная строка найдена в списке, и 0 если строка не найдена.

ENTRY(n, list, delimeter). Возвращает строку с порядковым номером n из списка list. Указание n большим чем число слов в списке list вызовет ошибку.

CAN-DO(list, s). Возвращает логическое значение сравнения соответствия текстового значения s хотя бы одному из значений входящему в список list. Список list должен представлять собой набор текстовых значений, заданных либо конкретными значениями, либо масками значений.

 

Символ маски Описание
* любая последовательность символов
. любой одиночный символ
! исключение "НЕ"

 

DISPLAY CAN-DO ("100*,*99,22,*45*" , "1452").

Результат: YES

Значение "1452" соответствует маске *45*

INDEX(s, s1). Возвращает порядковый номер (индекс) первого найденного символа s1 в строке s. В том случае, если символ s1 не найден в строке s возвращается значение 0. Просмотр строки s производится слева направо.

DISPL INDEX('Переворот',е).

Результат: 2 (Первый символ "е" в слове Переворот находится на второй позиции).

R-INDEX(s, s1). Аналогична функции INDEX, но просмотр строки s осуществляется справа налево.

CAPS(s). Преобразовывает строчные символы строки s в заглавные символы.

LC(s). Преобразовывает заглавные символы строки s в строчные символы.

TRIM(s, s1). Если текстовая строка начинается и заканчивается символами из списка s1, то данная функция производит их обрезание до первого символа не входящего в список s1. Поиск первого не входящего в список s1 символа в строке s при обрезании справа осуществляется слева направо, а при обрезании слева – справа налево. В случае если список символов s1 не задан, такими символами по умолчанию являются символ пробел, символ табуляции и возврат каретки. Строка s1 представляет собой набор последовательно указанных символов.

DISPLAY TRIM("**$**\__море__\**$" , "*$") FORMAT "X(20)".
DISPLAY TRIM(' |Переворот событий| ') FORMAT "X(20)".

Результаты: \__море__\

|Переворот событий|

RIGHT-TRIM(s, s1). Аналогичен функции TRIM, но обрезание строки s производится только справа.

LEFT-TRIM(s, s1). Аналогичен функции TRIM, но обрезание строки s производится только слева.

SUBSTRING(s, i, n). Возвращает из строки s - n символов начиная с позиции i. Если n не указано, то возвращает все символы, начиная с позиции i по конец строки s. При указании значения n = 1 функция SUBSTRING возвращает символ с индексом i строки s.

DISPLAY SUBSTRING("Перекресток",3,1).

Результат: р

REPLACE(s, rs, ps). Функция заменяет строку rs входящую в строку s строкой ps.

Результат функции REPLACE зависит от  регистрозависимости значения исходной строки rs. Для демонстрации этого рассмотрим два примера:

Пример 1:

DEF VAR iStr    AS CHAR NO-UNDO.
DEF VAR iStrRpl AS CHAR NO-UNDO.

iStr    = "ABCDabcd".
iStrRpl = REPLACE(iStr,"A","i").

DISPL iStr iStrRpl.

Результат: ABCDabcd iBCDibcd

Пример 2:

DEF VAR iStr    AS CHAR CASE-SENSITIVE NO-UNDO.
DEF VAR iStrRpl AS CHAR NO-UNDO.

iStr    = "ABCDabcd".
iStrRpl = REPLACE(iStr,"A","i").
DISPL iStr iStrRpl.

Результат: ABCDabcd iBCDabcd

Как мы видим результаты данных примеров совершенно разные. Во втором примере, в отличие от первого, переменная iStr объявлена регистрозависимой, с атрибутом CASE-SENSITIVE. Этот факт и повлиял на результат функции REPLACE.

FILL(S, n). Повторяет строку S n-раз.

DISPLAY FILL('стул',3) FORMAT "X(20)".

Результат: стулстулстул


ФУНКЦИИ РАБОТЫ С ДАТАМИ И ВРЕМЕНЕМ

Используемая ниже переменная в качестве аргумента функций - d может являться переменной типа DATE,DATETIME или DATETIMETZ.

DAY(d). Возвращает значение дня даты d. Результатом является значение типа INTEGER.

WEEKDAY(d). Возвращает порядковый номер дня в недели даты d. Результатом является значение типа INTEGER.

MONTH(d). Возвращает порядковый номер месяца даты d. Результатом является значение типа INTEGER.

YEAR(d). Возвращает значение года даты d. Результатом является значение типа INTEGER.

TODAY. Возвращает текущую дату из системы.Результатом является значение типа DATE.

TIME. Возвращает значение текущего времени из системы, выраженное в секундах, начиная с 00:00:00 текущей даты. Результатом является значение типа INTEGER.

DISPLAY TIME.

При преобразовании значения функции TIME в строку c указанием формата возможно получить значение текущего времени в указанном формате.

DISPLAY STRING(TIME,"hh:mm:ss").

ETIME(lPar). Функция возвращает количество миллисекунд прошедших с момента начала сессии ABL. Для обнуления значения, функции необходимо передать логический входной параметр со значением TRUE. Результатом является значение типа INTEGER1.

ETIME(TRUE).
RUN proc1.p.
DISPLAY ETIME.
END.

ISO-DATE(d). Функция текстового представления даты в соответствии со стандартом ISO 8601. Результатом является значение CHARACTER типа.

DISPLAY ISO-DATE(NOW) FORMAT "x(30)".

Результат: 2013-07-29T11:39:21.016+04:00

INTERVAL(date1, date2, interval-unit). Позволяет определить количество полных указанных временных интервалов interval-unit между двумя датами. interval-unit может принимать одно из следующих значений: "years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds". Результатом является значение типа INTEGER1.

DEF VAR beg-date      AS DATE     NO-UNDO.
DEF VAR end-date      AS DATE     NO-UNDO.
DEF VAR intervalUnit  AS CHAR     NO-UNDO.
DEF VAR iResult       AS INTEGER  NO-UNDO.

ASSIGN
   beg-date     = 01/02/2010
   end-date     = 10/06/2013
   intervalUnit = "weeks"
.
iResult = INTERVAL(beg-date, end-date, intervalUnit).

DISPLAY iResult.

Результат: -196

Результатом функции может быть как положительное, так и отрицательное число в зависимости от порядка указания во входных параметрах дат. Так если date1 < date2 результат будет отрицательный, а в случае date1 > date2  результат будет положительный.


СИСТЕМНЫЕ ФУНКЦИИ

PAUSE(n). Прерывает выполнение программного кода на n секунд, или до нажатия пользователем любой клавиши, если данное действие пройдет раньше истечения указанного времени.

KEYLABEL(s). Возвращает метку клавиши (например SHIFT) по ее коду s INTEGER типа.

KEYCODE(s). Функция обратная KEYLABEL, возвращает код клавиши по ее метке s, CHARACTER типа.

READKEY. Считывает код нажатой клавиши.

LASTKEY. Возвращает код последней нажатой клавиши.

PAUSE(0).
READKEY.
DISPLAY "код " + STRING(LASTKEY).

ASC(s). Возвращает ASCII код символа s.

CHR(s). Функции обратная ASC(). Возвращает символ соответствующий указанному ASCII коду s.

UNIX. Запускает программы, скрипты, UNIX команды.

OPSYS. Возвращает значение используемой операционной системы "UNIX" или "WIN32". 


 1 Начиная с версии 10.1B результатом действия функции является значение INT64 типа.

Вы здесь: Главная Основы ABL ОПЕРАЦИИ И СТАНДАРТНЫЕ ФУНКЦИИ