.. _journal_expressions: Использование выражений в журналах ===================================== .. contents:: :depth: 3 В журналах Citeck помимо простых атрибутов (``name``, ``counterparty`` и др.) можно использовать выражения — SQL-подобные конструкции, вычисляемые в момент запроса к базе данных. Они поддерживают математические операции, функции работы с датами, а также поиск, группировку и сортировку с гарантией актуальности данных. **Выражение** — набор функций, операторов, скобок и атрибутов, который позволяет вычислить значение на основе данных в БД. .. note:: :ref:`Вычисляемые атрибуты `, которые описаны в типе, имеют схожую с выражениями функциональность и позволяют более гибко настраивать значения атрибутов, но у них есть ограничения при поиске, группировке и сортировке. Эти операции доступны, только если для вычисляемого атрибута настроено сохранение в БД, но и в этом случае есть ограничение — их перерасчёт будет произведён только когда произойдёт обновление сущности. Если обновляются связанные сущности или глобальные объекты, которые использовались для вычисления, то вычисляемый атрибут не пересчитается. В отличие от вычисляемых атрибутов, выражения в журнале позволяют настраивать вычисления, которые вычисляются в момент запроса для каждой записи, что позволяет искать, группировать и сортировать по ним с гарантией актуальности данных. Выражения настраиваются в дополнительных настройках колонки в поле **«Атрибут для загрузки»**. .. list-table:: :widths: 20 20 :class: tight-table :align: center * - | .. image:: _static/expressions/01.png :width: 400 :align: center - | .. image:: _static/expressions/02.png :width: 400 :align: center Для настройки выражения нужно, чтобы в содержимом этого поля была или функция, или выражение, полностью обёрнутое в скобки. Примеры ------- Расчёт разницы между датами в днях ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: none ceil(((date_part('epoch', date0) - date_part('epoch', date1)) / (60 * 60 * 24))) - **date0** и **date1** — атрибуты с датой или датой-временем, между которыми происходит расчёт. - **ceil** — округлить до ближайшего целого, которое больше или равно аргументу. Вместо этой функции можно использовать: - **floor** — отбросить дробную часть; - **round** — округлить результат до ближайшего целого. Произвольные математические операции ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: none ceil(field0 + field1) (field0 + field1) (10 * (field0 + field1)) - **field0** и **field1** — атрибуты сущности. Сложность выражений и количество атрибутов не ограничены. Получить месяц и год ~~~~~~~~~~~~~~~~~~~~~ .. code-block:: none to_char(date0, 'MM.YYYY') - **date0** — атрибут с датой или датой-временем.