Содержание
8. Выражения
В DataExpress выражения имеют важное значение. Они используются для различных вычислений и фильтрации данных. Примеры выражений:
[цена] * [количество]
SUM('услуги', 'сумма') * 1.15
RurToWords([сумма])
IIF([дата]<>Null, [дата], 'дата не указана')
YearsBetween(date, cdate('12.10.2008'))
Составляющие выражения
Поля. Названия полей формы, заключены в квадратные скобки:
[Номер], [дата], [Название]
Если поле является объектом, то запись такая:
[Объект|поле объекта] [Сотрудник|ФИО] [Товар|Единица измерения|Название]
Можно обратиться к полю родительской формы. Для этого перед названием поставьте восклицательный знак:
[!Статус]
Регистр символов в названии не имеет значения.
Функции. Функции выполняют какое-либо действие и возвращают результат. Аргументы функции записываются в скобках и разделяются запятой. Если функция не имеет аргументов, то скобки можно не писать. Примеры:
ToWords([сумма]) LENGTH([Название]) cstr([цена]) date period([Начальная дата], [начальное время], [Конечная дата], [конеЧное ВРемя])
Числа. Дробная часть отделяется точкой.
Текст. Текст заключается в одинарные или двойные кавычки. Например:
"Закрыто", 'В наличии'
Знаки операций. Арифметические операции:
+ - * /
Операции сравнения:
= <> < <= > >=
Логические операции:
& (логическое И) | (логическое ИЛИ) ! (логическое НЕ)
Унарные операции. Все операции являются бинарными, кроме логической операции НЕ. Примеры:
!([Статус]='Выполнено' | [Статус]='В работе').
Минус тоже может быть унарной операцией:
-45, -[цена]
Приоритет знаков операций
Приоритет означает какая операция будет выполнена в первую очередь. Наивысший приоритет у выражений в скобках, затем функции, в порядке убывания: умножение/деление, сложение/вычитание, сравнение, логические. Пример:
[сумма] >= [скидка] + SUM('Товар', 'Сумма') * 2 & [Статус] = 'Выполнено'
Порядок вычислений с результатами вычислений для примера:
- [сумма] >= [скидка] + 100 * 2 & [Статус] = 'Выполнено'
- [сумма] >= [скидка] + 200 & [Статус] = 'Выполнено'
- [сумма] >= 20 + 200 & [Статус] = 'Выполнено'
- [сумма] >= 220 & [Статус] = 'Выполнено'
- 100 >= 220 & [Статус] = 'Выполнено'
- FALSE & [Статус] = 'Выполнено'
- FALSE & 'Выполнено' = 'Выполнено'
- FALSE & TRUE
- FALSE
FALSE (Ложь) и TRUE (истина) нет в выражениях, хотя они используются самим движком выражений.
Совместимость типов
Каждый операнд - текст, число, поле, результат функции, аргумент - имеет тип. Не допускается в операции использовать операнды разных типов. Например, '343' + 23 недопустимо, а так можно: cnum('343') + 23. Т. е. в таких случаях нужно выполнять преобразование типов. Это выполняется с помощью функций cnum, cstr, cdate, ctime.
Ошибки в выражении
Ошибка | Описание |
Несовместимость типов | Вы пытаетесь, например, сложить строку с числом, число разделить на дату. Т. е. в арифметической или логической операции должны участвовать операнды одного типа. |
Некорректная операция со строками | Допускается складывать строки операцией сложения, а также сравнивать. Остальные операции недопустимы. |
Некорректная операция с числами | Допускаются все операции, кроме & и |. |
Некорректная операция с датой или временем. | Даты и время допускается только сравнивать. Складывать и вычитать можно при помощи функций. |
Некорректная булева операция | Для логического типа допустимы операции: = <> & | !. |
Деление на нуль | Попытка деления на нуль. |
Некорректное число | Число записано некорректно. Например: 34..234 или 23.432.34 |
Ожидается аргумент | При записи функции пропущен аргумент. Например: sum ('услуги', ) |
Ожидается конец строки | При записи строки пропущена кавычка. |
Ожидается квадратная скобка | При записи поля пропущена закрывающая квадратная скобка. |
Ожидается скобка | При записи выражения пропущена закрывающая скобка. |
Ожидается операция | Пропущен знак операции. |
Ожидается операнд | Пропущен операнд (текст, поле и пр.). |
Функция не найдена | Ошибка в названии функции. |
Неверное количество аргументов | При вызове функции было указано большее, либо меньшее количество аргументов. |
Несовместимый тип аргумента | Тип введенного аргумента и требуемый тип не совпадают. Проверьте, аргументы какого типа нужно передавать функции. |
Пропущена запятая | При записи аргументов функции была пропущена запятая. |
Не указано имя поля | Имя поля не указано, например: [] + 3 |
Поле не найдено | Указанное поле не найдено. Проверьте правильность имени поля. |
Неизвестный источник списка | Попытка обратиться к полю объекта, для которого не указан источник списка. |
Поле не является объектом | Например, выражение [Дата|Название] даст такую ошибку, т. к. поле Дата не является объектом. |
Комментарии в выражении
Комментарии используются для пояснения действий выражения. Однострочные комментарии начинаются символами //, многострочные парой /* … */.