4.1.1. Набор данных SQL
SQL – набор данных формируется выполнением SQL-запроса к базе данных. Поля результирующего набора запроса желательно снабдить алиасами с помощью оператора as
. Для исключения возможного преобразования базой данных регистра символов алиасы желательно заключить в двойные кавычки:
select u.name as "userName", u.login as "userLogin"
from sec_user u
В запросе можно использовать входные параметры отчёта и поля родительских полос. К параметрам нужно обращаться по имени, заключенному в конструкцию ${}
, например ${dateFrom}
. К полям родительской полосы нужно обращаться аналогично, добавляя имя полосы перед именем поля: ${band1.field1}
.
Пример SQL-запроса с параметром groupId
, полученным из родительской полосы group
, и внешним параметром active
:
select u.name as "userName", u.login as "userLogin"
from sec_user u
where u.group_id = ${group.groupId}
and u.active = ${active}
and u.delete_ts is null
В запросы на SQL необходимо вручную включать условия фильтрации мягко удаленных записей. |
По умолчанию SQL-запросы выполняются в основной базе данных. Если необходимо выполнить запрос в дополнительном хранилище данных, укажите его имя в поле Data store.
- Препроцессор запросов
-
Если вам нужно изменять запросы SQL/JPQL динамически в зависимости от значений параметров отчёта, используйте предварительную обработку SQL. Препроцессор позволяет модифицировать SQL/JPQL-запросы с помощью Groovy. Для активации препроцессора установите флажок Preprocess query as Groovy template под редактором полосы. Результирующий запрос будет обработан шаблонизатором
GStringTemplateEngine
, в котором доступны:-
параметры отчёта:
${<parameter_name>}
, -
значения из родительских полос:
${<band_name>.<parameter_name>}
.
Например, в зависимости от того, передан параметр запроса
createTs2
или нет, вам необходимо выбирать, какое из условий использовать в запросе:e.create_ts < ${createTs2}
илиe.create_ts < current_timestamp
.В этом случае запрос выглядит так:
select e.create_ts, e.id, e.vin from ref_car e where e.create_ts >= \${createTs1} and <% out << (createTs2 != null ? 'e.create_ts < ${createTs2}' : 'e.create_ts < current_timestamp')%>
Теперь, если параметр
createTs2
не передан, исходный запрос преобразуется в следующий:select e.create_ts, e.id, e.vin from ref_car e where e.create_ts >= \${createTs1} and e.create_ts < current_timestamp
Если же
createTs2
передан, для формирования полосы используется следующий результирующий запрос:select e.create_ts, e.id, e.vin from ref_car e where e.create_ts >= \${createTs1} and e.create_ts < ${createTs2}
-