Язык описания виртуальных итогов позволяет описывать большинство самых распространенных комбинаций итогов, которые могут потребоваться для отчетов. Однако он все-таки существенно уступает в гибкости языку запросов SQL. Для тех ситуаций, где выразительных средств языка недостаточно, предусмотрен механизм предикатов.
Предикаты — это механизм, позволяющий встраивать в виртуальные итоги условия фильтрации произвольной сложности. Один и тот же предикат можно использовать в нескольких виртуальных итогах в качестве фильтров для источников-итогов. Предикаты формулируются на языке SQL, для чего требуется квалифицированный программист. Использование готовых предикатов в виртуальных итогах участия программиста уже не требует:
// объявление предиката DebtorAgents predicate Debtor(Agent): DebtorAgents
group SampleGroup: en(Sample group), ru(Пример группы) var Amount predicate Debtor(AgentID) end |
Текст предиката представляет собой SELECT-запрос, выбирающий одну или несколько колонок, которые будут аргументами предиката. В виртуальном итоге фильтр-предикат будет отбирать только те строчки, которые будут выбраны SELECT-запросом предиката. Текст предиката DebtorAgents описывается в справочнике предикатов виртуальных итогов:
SELECT AGENT_ID AGENT FROM VTR_AGENT_DEBTS WHERE TRANSACTION_DATE < :vDateTo GROUP BY AGENT_ID HAVING SUM(AMOUNT) > 0 |