8. Выражения

В DataExpress выражения имеют важное значение. Они используются для различных вычислений и фильтрации данных. Примеры выражений:

[цена] * [количество]
SUM('услуги', 'сумма') * 1.15
RurToWords([сумма])
IIF([дата]<>Null, [дата], 'дата не указана')
YearsBetween(date, cdate('12.10.2008'))

Составляющие выражения

Поля. Названия полей формы, заключены в квадратные скобки:

[Номер], [дата], [Название]

Если поле является объектом, то запись такая:

[Объект|поле объекта]
[Сотрудник|ФИО]
[Товар|Единица измерения|Название]

Можно обратиться к полю родительской формы. Для этого перед названием поставьте восклицательный знак:

[!Статус]

Регистр символов в названии не имеет значения.

Функции. Функции выполняют какое-либо действие и возвращают результат. Аргументы функции записываются в скобках и разделяются запятой. Если функция не имеет аргументов, то скобки можно не писать. Примеры:

ToWords([сумма])
LENGTH([Название])
cstr([цена])
date
period([Начальная дата], [начальное время], [Конечная дата], [конеЧное ВРемя])

Числа. Дробная часть отделяется точкой.

Текст. Текст заключается в одинарные или двойные кавычки. Например:

"Закрыто", 'В наличии'

Знаки операций. Арифметические операции:

+ - * /

Операции сравнения:

= <> < <= > >=

Логические операции:

 & (логическое И) | (логическое ИЛИ) ! (логическое НЕ)

Унарные операции. Все операции являются бинарными, кроме логической операции НЕ. Примеры:

!([Статус]='Выполнено' | [Статус]='В работе').

Минус тоже может быть унарной операцией:

-45, -[цена]

Приоритет знаков операций

Приоритет означает какая операция будет выполнена в первую очередь. Наивысший приоритет у выражений в скобках, затем функции, в порядке убывания: умножение/деление, сложение/вычитание, сравнение, логические. Пример:

[сумма] >= [скидка] + SUM('Товар', 'Сумма') * 2 & [Статус] = 'Выполнено'

Порядок вычислений с результатами вычислений для примера:

  1. [сумма] >= [скидка] + 100 * 2 & [Статус] = 'Выполнено'
  2. [сумма] >= [скидка] + 200 & [Статус] = 'Выполнено'
  3. [сумма] >= 20 + 200 & [Статус] = 'Выполнено'
  4. [сумма] >= 220 & [Статус] = 'Выполнено'
  5. 100 >= 220 & [Статус] = 'Выполнено'
  6. FALSE & [Статус] = 'Выполнено'
  7. FALSE & 'Выполнено' = 'Выполнено'
  8. FALSE & TRUE
  9. FALSE

FALSE (Ложь) и TRUE (истина) нет в выражениях, хотя они используются самим движком выражений.

Совместимость типов

Каждый операнд - текст, число, поле, результат функции, аргумент - имеет тип. Не допускается в операции использовать операнды разных типов. Например, '343' + 23 недопустимо, а так можно: cnum('343') + 23. Т. е. в таких случаях нужно выполнять преобразование типов. Это выполняется с помощью функций cnum, cstr, cdate, ctime.

Ошибки в выражении

Ошибка Описание
Несовместимость типов Вы пытаетесь, например, сложить строку с числом, число разделить на дату. Т. е. в арифметической или логической операции должны участвовать операнды одного типа.
Некорректная операция со строками Допускается складывать строки операцией сложения, а также сравнивать. Остальные операции недопустимы.
Некорректная операция с числами Допускаются все операции, кроме & и |.
Некорректная операция с датой или временем. Даты и время допускается только сравнивать. Складывать и вычитать можно при помощи функций.
Некорректная булева операция Для логического типа допустимы операции: = <> & | !.
Деление на нуль Попытка деления на нуль.
Некорректное число Число записано некорректно. Например: 34..234 или 23.432.34
Ожидается аргумент При записи функции пропущен аргумент. Например:
sum ('услуги', )
Ожидается конец строки При записи строки пропущена кавычка.
Ожидается квадратная скобка При записи поля пропущена закрывающая квадратная скобка.
Ожидается скобка При записи выражения пропущена закрывающая скобка.
Ожидается операция Пропущен знак операции.
Ожидается операнд Пропущен операнд (текст, поле и пр.).
Функция не найдена Ошибка в названии функции.
Неверное количество аргументов При вызове функции было указано большее, либо меньшее количество аргументов.
Несовместимый тип аргумента Тип введенного аргумента и требуемый тип не совпадают. Проверьте, аргументы какого типа нужно передавать функции.
Пропущена запятая При записи аргументов функции была пропущена запятая.
Не указано имя поля Имя поля не указано, например:
[] + 3
Поле не найдено Указанное поле не найдено. Проверьте правильность имени поля.
Неизвестный источник списка Попытка обратиться к полю объекта, для которого не указан источник списка.
Поле не является объектом Например, выражение
[Дата|Название]

даст такую ошибку, т. к. поле Дата не является объектом.

Комментарии в выражении

Комментарии используются для пояснения действий выражения. Однострочные комментарии начинаются символами //, многострочные парой /* … */.

Еще почитать