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

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

// объявление предиката DebtorAgents

predicate Debtor(Agent): DebtorAgents

 

group SampleGroup: en(Sample group), ru(Пример группы)

  var Amount
      // использование предиката в качестве фильтра для итога AgentDebts
      total AgentDebts: 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