7.2. Пример перекрестного отчёта
Для создания перекрестного, или матричного, отчёта выберите ориентацию полосы Crosstab на вкладке Report structure редактора отчётов. При выборе этой ориентации к полосе автоматически добавляются три набора данных:
-
<band_name>
_dynamic_header – данные из этого набора заполняют отчёт значениями слева направо, то есть он ведет себя, как вертикальная полоса с заголовками столбцов матрицы. -
<band_name>
_master_data – данные из этого набора заполняют отчёт значениями сверху внизу, то есть он ведет себя, как горизонтальная полоса с заголовками строк матрицы. -
<band_name>
– набор данных, названный так же, как полоса, в которой он создан. Этот набор содержит данные для заполнения ячеек матрицы.
Для примера создадим матричный отчёт для сущности Order
из демо-приложения Sales со следующей структурой:
-
Структура данных отчёта.
Рассмотрим полосы отчёта.
-
набор данных
orders_dynamic_header
возвращает список названий месяцев:orders_dynamic_header datasetimport java.text.DateFormatSymbols List result = new ArrayList() DateFormatSymbols dateFormatSymbols = DateFormatSymbols.getInstance(Locale.ENGLISH) for (i in 0..dateFormatSymbols.months.length - 1) { result.add(["header_id" : i + 1, "month_name" : dateFormatSymbols.months[i]]) } return result
-
набор данных
orders_master_data
возвращает имена и идентификаторы покупателей, выбранных пользователем в качестве внешнего параметра отчёта:orders_master_data datasetselect name as name, id as customer_id from SALES_CUSTOMER where id in (${selected_customers})
-
набор данных
orders
генерирует данные для заполнения ячеек матрицы, то есть сумму всех заказов, сделанных конкретным покупателем в конкретном месяце. Он используетorders_master_data@customer_id
(идентификатор покупателя) как вертикальную координату ячейки иorders_dynamic_header@header_id
(название месяца) как горизонтальную координату, а затем заполняет ячейку суммой значенийamount
.В примере ниже мы использовали два дополнительных внешних параметра:
start_date
иend_date
, которые определяют временной диапазон заказов. Мы рекомендуем использовать перекрестную валидацию значений введенных параметров, чтобы избежать ошибок, вызванных неправильным диапазоном дат.orders datasetselect o.customer_id as orders_master_data@customer_id, month(o.date_) as orders_dynamic_header@header_id, sum(o.amount) as "amount" from sales_order o where o.date_ >= ${start_date} and o.date_ <= ${end_date} and o.customer_id in (${orders_master_data@customer_id}) and month(o.date_) in (${orders_dynamic_header@header_id}) group by o.customer_id, month(o.date_) order by o.customer_id, month(o.date_)
-
-
Параметры отчёта.
На вкладке Parameters and Formats объявлены внешние параметры отчёта –
selected_customers
,start_date
,end_date
:Рисунок 62. Внешние параметры отчётаЭти параметры запрашиваются у пользователя при запуске отчёта. Выбор покупателей производится через экран
sales_Customer.browse
, имеющийся в приложении. -
Шаблон отчёта.
Теперь создадим шаблон отчёта, используя Microsoft Office или LibreOffice.
Создайте в шаблоне именованные регионы для всех трех наборов данных полосы
orders
, а также, дополнительно, регион для заголовка столбца:<band_name>_header
. В нашем случае этоorders_header
.Вот так будет выглядеть шаблон отчёта, выводящего по вертикали список имен
Customers
и горизонтально суммуOrders
, сгруппированных по месяцам:
В результате, отчёт заполняется как вниз по вертикали, так и вправо по горизонтали агрегированными значениями суммы заказа для каждого покупателя в каждом месяце:
Если вы хотите добавить к получившейся таблице итоговые суммы, это необходимо делать в отдельных полосах и получать для них данные в отдельном запросе.