Low-code дизайнер > Приложение > Поисковые запросы на языке EQL365 / Синтаксис EQL-запроса

Синтаксис EQL-запроса

Чтобы найти элемент приложения по параметрам, в EQL-запросе его свойствам задаются определённые значения. Структура EQL-запроса составляется с соблюдением правил:

  1. Для обращения к свойствам приложения используются коды, присвоенные им при создании. Указывать код переменной необходимо в квадратных скобках: [property_name].
  2. Указывается операция поиска. Используются стандартные математические знаки или ключевые слова языка EQL365.
  3. Искомое значение указывается с учётом правил присвоения значений свойствам различных типов.
  4. Для присвоения значения или его вычисления в запросе можно использовать функции, например, для указания определённой даты или поиска в свойстве типа Пользователи текущего сотрудника.
  5. Чтобы осуществлять поиск по нескольким условиям, в запрос добавляются логические операторы. При этом можно указывать условие, выполнение которого будет проверяться первым.
  6. Для составления сложных выборок данных можно использовать подзапросы. Внутри подзапроса можно обращаться к свойствам любого приложения в системе.
  7. Все составляющие запроса указываются через пробел.

Для составления запроса можно использовать опцию автозаполнения строки. Чтобы вызвать выпадающее меню с доступными свойствами, функциями и операторами, нажмите Ctrl + Пробел.  

начало примера

Примеры поиска элементов по составленным EQL-запросам:

  • [company_name] = 'АвтоПром' or [company_name] like 'Авто' — поиск элементов приложения Компании, в которых поле Название полностью совпадает с первым указанным значением или содержит второе;
  • [__createdAt] = Datetime(2023, 1) and [price] > 4000 — поиск записей приложения Заказы, у которых в поле Дата создания указан январь 2023 года и поле Стоимость содержит значение большее, чем 4 000 рублей.
  • [contract] in (select [__id] from [documents.contracts] where [total] > 10000) — поиск записей приложения Контрагенты, где в поле Договор указан элемент приложения, в котором сумма превышает 10 000 рублей.

конец примера

Присвоение значения свойствам различных типов

Для корректной обработки EQL-запроса значения для различных типов свойств, используемых в контексте приложений, присваиваются определённым образом. Рассмотрим подробнее правила написания в приведённой таблице:

Тип данных

Правило присвоения значения

Пример

Строка

Задаётся строкой в одинарных кавычках.

  1. [authors_name] like 'Алекс' — поле Имя автора содержит значение Алекс.
  2. [product] in ('вентилятор', 'холодильник') — поле Продукт содержит одно из указанных значений.
  3. [authors_name] is null — имя автора не указано.

Число, Деньги

Используется значение искомого числа без кавычек.

Дробные числа разделяются точкой.

  1. [size] < 5.5 — в поле Размер указано значение меньше, чем 5,5 метров.
  2. [price] >= 5000 — значение поля Стоимость больше или равно 5 000 рублей.

Выбор «да/нет»

Задаётся значением true без кавычек.

  1. [prepayment] = true — в поле Предоплата выбрано значение Да.
  2. [prepayment] <> true — в поле Предоплата не указано значение или выбрано Нет.
  3. [prepayment] is null — поле Предоплата не заполнено.

Дата/время

Задаётся следующими способами:

  • функцией Datetime() или Time(), аргументы прописываются через запятую;
  • строкой в одинарных кавычках, даты прописываются через тире.  

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

 

Период времени относительно текущей даты вычисляется функцией RelativeDatetime('start', 'end'). В круглых скобках указывается начало и конец периода, параметры заключаются в одинарные кавычки и разделяются запятыми.

  1. [close_date] > Datetime(2023, 1, 31, 12);
  2. [close_date] > '2023-01-31-12'.

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

  1. [close_date] < '2023-01-31T12:30:00' — дата закрытия произошла ранее, чем 31 января 2023 года в 12:30.
  2. [close_date] < '2023-01-31T12:30+09:00' — дата закрытия со значением ранее, чем 31 января 2023 года в 12:30 с учётом часового пояса UTC+09:00.
  3. [__createdAt] IN RelativeDatetime('-1m','0d') — поиск всех элементов, созданных с начала прошлого месяца и до текущей даты.

Категория

Задаётся кодом категории в одинарных кавычках.

[payment] in ('half', 'full') — в поле Оплата выбраны значения Частично и Полная предоплата.

Номер телефона

Задаётся строкой в одинарных кавычках.

[phone] = '+71234567890' — поле Телефон заполнено указанным значением.

Электронная почта

Задаётся строкой в одинарных кавычках.

[email] = 'admin@example.com' — поле Электронная почта заполнено указанным значением.

Ф.И.О

Задаётся строкой в одинарных кавычках.

[contact] like 'Иван' — поле Контактное лицо содержит указанное значение.

Пользователи

Задаётся строковым представлением идентификатора в одинарных кавычках, без пробелов.

Чтобы найти идентификатор пользователя, перейдите в раздел Компания > Сотрудники, выберите нужную карточку и скопируйте значение в url-адресе страницы.

[responsible] = '95806fe5-f8e8-460c-b2be-ce607068726c' — в поле Ответственный указан определённый пользователь.

Приложение

Задаётся строковым представлением идентификатора в одинарных кавычках, без пробелов. Чтобы найти идентификатор элемента, перейдите на страницу нужного приложения, выберите запись и скопируйте значение в url-адресе страницы.  

[app] = '018a1c61-c2b9-7701-86ab-d8b39a143465' — в поле выбран элемент текущего приложения с указанным идентификатором.

Произвольное приложение

Задаётся двумя способами:

  • функцией Refitem(). В скобках через запятую прописывается код раздела, приложения и идентификатор элемента. Каждое значение отделяется одинарными кавычками;
  • строкой в одинарных кавычках. Путь до элемента указывается без пробелов, через двоеточие
  1. [contract] = Refitem('clients', 'contracts', '1415381a-1197-11ee-be56-0242ac120002');
  2. [client] = 'clients:contracts:1415381a-1197-11ee-be56-0242ac120002'.

Оба запроса используются для поиска элементов, у которых в поле Договор указана определённая запись из раздела Клиенты > Договоры.

Статус

Задаётся числовым представлением идентификатора статуса.

[__status] = 1 — элементу присвоен первый по счёту статус.

Можно искать элементы, в полях которых не указано никакого значения. Для этого в запросе используется операция Is null. Исключения составляют свойства типа Номер телефона и Электронная почта.

Операции поиска

Для присвоения значения в EQL-запросе используются операции поиска. Они могут обозначаться математическими знаками или ключевыми словами языка EQL365.

Операции с использованием знаков

Такие операции строятся по одинаковому принципу. В качестве первого операнда указывается код свойства. Ему присваивается определённое значение. Вторым операндом выступает заданное значение, другое свойство или функция. К таким операциям относятся:

  1. Равенство — обозначается знаком =. Операция проверки точного совпадения. Не рекомендуется использовать со свойствами типа Дата/время, так как точное совпадение значения поля маловероятно.

начало примера

Примеры запросов:

  • [client] = 'Иванов' — поиск клиента с указанным именем;
  • [payment] = [budget] — поиск полей Оплата, совпадающих с полем Бюджет;
  • [responsible] = CurrentUser() — поиск элементов с текущим пользователем в качестве ответственного.

конец примера

  1. Неравенство — обозначается знаком <>. Операция проверки исключения точного совпадения.

начало примера

Примеры запросов:

  • [product] <> 'Оборудование' — поиск заказов, где в поле Продукт не значится указанное значение;
  • [payment] <> [budget] — поиск заказов, где поле Оплата не совпадает с полем Бюджет;
  • [responsible] <> CurrentUser() — поиск элементов, в которых в качестве ответственного не значится текущий пользователь.

конец примера

  1. Более чем — обозначается знаком >. Операция проверки строгого большего.

начало примера

Примеры запросов:

  • [price] > 10000 — поиск заказов со стоимостью, превышающей указанное значение;
  • [payment] > [budget] — поиск заказов, где поле Оплата больше поля Бюджет;
  • [shipping_date] > Datetime(2023, 1, 31, 12) — поиск заказов с датой отгрузки позднее, чем указанная дата и время 12:00.

конец примера

  1. Больше или равно — обозначается знаком >=. Операция проверки нестрогого большего.

начало примера

Примеры запросов:

  • [price] >= 10000 — поиск заказов со стоимостью, равной или превышающей указанное значение;
  • [payment] >= [budget] — поиск заказов, где поле Оплата больше или равняется полю Бюджет;
  • [shipping_date] >= Datetime('Today') — поиск заказов с отгрузкой в текущую дату на момент времени 00:00:00 или позднее.

конец примера

  1. Менее чем — обозначается знаком <. Операция проверки строгого меньше.

начало примера

Примеры запросов:

  • [price] < 10000 — поиск заказов со стоимостью ниже указанного значения;
  • [payment] < [budget] — поиск заказов, где поле Оплата меньше, чем поле Бюджет;
  • [shipping_date] < Datetime('Today') — поиск заказов с датой отгрузки ранее, чем текущая дата на момент времени 00:00:00.

конец примера

  1. Меньше или равно — обозначается знаком <=. Операция проверки нестрогого меньшего.

начало примера

Примеры запросов:

  • [price] <= 10000 — поиск заказов, в которых стоимость ниже или равняется указанному значению;
  • [payment] <= [budget] — поиск заказов, где поле Оплата меньше или равняется полю Бюджет;
  • [shipping_date] <= Datetime('Today') — поиск заказов с отгрузкой в текущую дату на момент времени 00:00:00 или ранее.

конец примера

Операции с ключевыми словами языка EQL365

  1. Частичное совпадение строки — обозначается значением LIKE. Регистронезависимая операция частичного совпадения строки. Определяет наличие указанного значения в выбранном свойстве приложения.

начало примера

Пример:

[responsible] like 'Алекс' — поиск всех элементов, где в поле Ответственный присутствует данное значение.

конец примера

  1. Проверка на отсутствие значения — обозначается значением IS NULL. Регистронезависимая операция проверки свойства приложения на пустое значение.

начало примера

Пример:

[budget] is null — заказы, где не указан бюджет.

конец примера

  1. Вхождение в множество — Обозначается значением IN. Регистронезависимая операция проверки содержания свойства приложения. Искомые значения указываются в круглых скобках, перечисляются через запятую и не разделяются пробелами. При использовании в запросе функции поиска текущего пользователя аргументы можно указывать в любом порядке. Кроме того, в качестве значения может выступать подзапрос.

начало примера

Примеры запросов:

  • [order_number] in (6,7,8,9) — поиск всех заказов, в номерах которых содержатся перечисленные числа;
  • [client] in ('Алексей', 'Андрей', 'Иванов') — поиск всех клиентов с перечисленными именами;
  • [__createdBy] in CurrentUser() или CurrentUser() in [__createdBy] — равнозначные запросы для поиска всех элементов, созданных текущим пользователем системы;  
  • [orders] in (select [__id] from [documents.contracts] where [total] > 10000) — выборка всех заказов, в договорах которых в поле Сумма указано значение более 10 000 рублей. Подробнее о составлении таких выражений читайте в подзаголовке «Подзапросы».

конец примера

Логические операторы-связки

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

  1. Логическое И — оператор AND объединяет несколько условия. При этом все условия должны выполняться.

начало примера

Примеры запросов:

  • [prepayment] = 1000 and [budget] < 3000 — поиск заказов, за которые внесли предоплату равную 1 000 рублей и бюджет которых превышает 3 000 рублей;
  • [__createdAt] >= Datetime(2023, 1) and [__createdAt] < Datetime(2023, 3) — поиск всех элементов, которые были созданы за январь и февраль 2023 года, т. е. дата равняется или больше января и не превышает март.

конец примера

  1. Логическое ИЛИ — оператор OR объединяет несколько условий и запрашивает выполнение хотя бы одного из них.

начало примера 

Примеры запросов:

  • [order_number] in (6,7) or [client] is null — в результате поиска отобразятся заказы, в номерах которых присутствуют указанные числа или для которых не заполнен клиент;
  • [client] like 'Алекс' or [orders] in (from [documents.contracts] select [__id] where [total] > 10000) — поиск заказов, в которых имя клиента содержит указанное значение или сумма договора превышает 10 000 рублей.

конец примера

  1. Логическое НЕ оператор NOT применяется для одного условия. Оно не должно выполняться.

начало примера

Примеры запросов:

  • not [payment] is null — поиск всех счетов, по которым внесена оплата, т. е. в поле значится не пустое значение;
  • not [client_name] in ('Петров', 'Иванов') — поиск заказов, в которых имя клиента не совпадает с указанным значением.

конец примера

Приоритеты логических операций

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

начало примера

Примеры запросов:

  • not ([client_name] like 'Алексей' or [client_name] like 'Андрей') — в результате поиска будут выбраны заказы, имена клиентов которых не содержат первое или второе указанное значение;
  • (not [client_name] = 'Алексей') and [client_name] like 'Ал' — в результате поиска отобразятся заказы, в которых имя клиента не равняется первому значению — Алексей, но содержит второе значение — Ал.  

конец примера

Функции

Функции в EQL-запросах можно использовать для присвоения значения свойствам приложения, а также для его вычисления:

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

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

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

  • СегодняToday текущая дата;
  • СейчасNow текущее время.  

начало примера

Примеры запросов:  

  • [__createdAt] > Datetime(2022) — поиск элементов с датой создания позднее 2022 года;
  • [__createdAt] > Datetime(2023, 1, 31) — поиск элементов с датой создания позднее, чем 31 января 2023 года;
  • [finish_date] > Datetime(2023, 2, '+09:00') — поиск заказов, сборку которых завершили позднее, чем февраль 2023 года с учётом часового пояса;
  • [__createdAt] < Datetime('Now') — поиск элементов с датой создания ранее, чем текущее время;
  • [closing_date] > Datetime('Today') — поиск сделок, дата закрытия которых позднее, чем текущая дата.

конец примера

  1. Время Time() определяет представление времени, заданное в параметрах. В качестве параметров указываются числовые значения часа, минуты и секунды. Обязательным параметром является только обозначение часа. Параметры прописываются в круглых скобках с перечислением через запятую.

начало примера

Примеры запросов:  

  • [closing_time] < Time(17) — поиск сделок, закрытых позднее, чем 17:00;
  • [closing_time] < Time(12, 30, 00) — поиск сделок, закрытых позднее, чем 12:30.

конец примера

  1. Относительное время RelativeDatetime('start', 'end') определяет временной промежуток, который рассчитывается относительно текущей даты, с учётом заданной в системе временной зоны. Для вычисления функции используются операторы = или IN.

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

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

Доступные буквенные обозначения разряда временного промежутка:

Вычисление параметров выполняется последовательно. При этом расчёт осуществляется не в единицах от текущей даты, а по календарному периоду времени.

Например, если текущая дата — 11 декабря 2023 года, и в функции начало периода задано параметром '-1m' (минус один месяц), то вычитаться будут не 30 дней от наступившей даты, а календарный месяц. Таким образом началом периода в результатах поиска будет считаться 1 ноября 2023 года.

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

  • параметр start — начало периода относительно текущей даты. В результат поиска включается вычисленное значение. Примеры ввода параметра:
    • '0h' — поиск с текущей даты и начала текущего часа;
    • '+1m' — поиск с начала следующего месяца;
    • '-1w+1d' — дата начала поиска рассчитывается следующим образом: от текущего дня отнимается календарная неделя и прибавляется один день. Так, если текущий день недели — понедельник, поиск производится с начала вторника прошлой недели.
  • параметр end — окончание периода относительно текущей даты. При вычислении к наименьшему отрезку времени, указанному в функции, добавляется единица. Полученное временное значение не включается в поиск, т. е. учитываются все значения являющиеся меньшими, но не равными вычисленному результату. Примеры ввода параметра:
    • '0h' — поиск до конца текущего часа;
    • '0d' — поиск до конца текущего дня;
    • '+1m' — до конца следующего месяца;
    • '-1w+1d' — дата окончания поиска рассчитывается следующим образом: вне зависимости от текущего дня недели расчёт начинается с понедельника прошлой календарной недели. Затем прибавляется прописанный в параметре один день, а также единица наименьшего отрезка времени — в данном случае это ещё один день. При вычислении получаем среду прошлой недели. Поскольку в окончание периода включаются все значения меньшие, но не равные вычисленному параметру, поиск производится до конца вторника прошлой недели.

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

начало примера

Примеры наиболее распространённых запросов:

  • [date] IN RelativeDatetime('0d', '0d') — поиск за текущую дату;
  • [date] IN RelativeDatetime('-1d', '-1d') — поиск за предыдущий день;
  • [date] IN RelativeDatetime('0w', '0w') — элементы за текущую неделю;
  • [date] IN RelativeDatetime('-1w', '-1w') — поиск за прошлую неделю;
  • [date] IN RelativeDatetime('-7d', '-1d') — элементы за предыдущие семь дней;
  • [date] IN RelativeDatetime('+1w', '+1w') — учитывается вся следующая неделя;
  • [date] IN RelativeDatetime('-1w+2d', '-1w+3d') — поиск с прошлой среды до конца прошлого четверга;
  • [date] IN RelativeDatetime('-1m', '+1m') — поиск с начала прошлого месяца и до конца следующего месяца;
  • [date] IN RelativeDatetime('0y+3q','0y') — элементы за третий и четвёртый квартал текущего года, т. е. поиск с третьего квартала по конец года;
  • [date] IN RelativeDatetime('0y-2m', '0y-1m') — поиск за последний и предпоследний месяц прошлого года;
  • [date] IN RelativeDatetime('+1y', '+1y0m') — учитывается весь первый месяц следующего года.

конец примера

  1. КоличествоCount() регистронезависимая функция определяет количество элементов параметра. В качестве параметра может выступать свойство, содержащее множественное значение или подзапрос. В операциях сравнения функция указывается перед вычисляемым параметром без пробела.

начало примера

Примеры запросов:

  • count([orders]) > 3 — поиск компаний, для которых создано более трёх заказов;
  • count(from [documents.contract] where parent.[__id] in [client] and [total] > 10000) > 2 — поиск компаний, для которых создано более двух договоров, где общая сумма превышает 10 000 рублей.

конец примера

  1. Текущий пользователь CurrentUser() функция возвращает идентификатор текущего пользователя. Используется для определения значения свойства приложения.

начало примера

Пример:

[responsible] = CurrentUser() — заказы, за которые ответственен текущий пользователь.

конец примера

  1. Элемент коллекцииRefitem() функция получения элемента из поля типа Произвольное приложение. Возвращает элементы, поля которых ссылаются на определённый элемент другого приложения. В функции указывается путь до элемента, включая код раздела и приложения, в котором он создан, и строковое представление его идентификатора.

Параметры прописываются двумя способами. Каждое значение заключается в одинарные кавычки и разделяется запятой. Также весь путь можно указать в одинарных кавычках и объединить параметры двоеточием.  

начало примера

Примеры запросов:

  • [bill] = Refitem('documents', 'bills', '018a8dbb-04cd-7798-a363-aae245148b10') или [bill] = Refitem('documents:bills:018a8dbb-04cd-7798-a363-aae245148b10') — равнозначные запросы, в которых осуществляется поиск по полю Счет в элементах приложения Договоры. В результате отобразится договор, к которому привязан определённый счёт из другого раздела и приложения;
  • [bill] is null — поиск договоров, в которых не указан счёт, т. е. нет ссылки на элемент приложения Счета.

конец примера

Подзапросы

Подзапрос — это вложенный EQL-запрос, который является частью другого запроса. При составлении выражения из нескольких запросов подзапрос выделяется круглыми скобками.

начало примера 

Пример:

not ([__name] like 'Алекс' or [__name] like 'Ан') — элементы, название которых не содержит указанные значения.

конец примера  

В подзапросе можно обращаться к элементам приложения из других разделов системы. Для этого используется оператор выборки данных по критериям. Указывается функцией вида SELECT_FROM_WHERE или FROM_SELECT_WHERE.

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

начало примера

Пример:

[clients] in (select [__id] from [clients.orders] where [total] > 1000) — выборка клиентов, для которых созданы заказы с суммой в 1 000 рублей.

конец примера

В подзапросе для функции Count указываются только операторы FROM_WHERE.

начало примера

Пример:

count(from [bookstore.book] where parent.[__id] in [authors]) > 0 — поиск авторов, в карточке которых указана хотя бы одна книга.

конец примера

Подзапросы могут включать в себя другие подзапросы. Чтобы понимать уровень вложенности, для обращения к свойствам приложения используются операторы:

  • PARENT — используется для обращения к свойствам родительского приложения;
  • ROOT — обращается к полям корневого приложения, которое указывается в начале запроса. Например, это приложение, на странице которого осуществляется EQL-поиск.

начало примера

Примеры запросов:

  • count(from [clients.contacts] where parent.[__id] in [contact]) > 1 — поиск заказов, в которых указано более одного клиента;
  • count(from [bookstore.book] where root.[__id] in [authors] and (count(from [bookstore.copyright] where parent.[__id] = [book] and [finish_date] > Datetime('Now')) > 0)) > 1 — поиск авторов книг, с которыми заключено более одного действующего договора о правах на книгу.

конец примера