1.2.1.1. Перекрёстные отчёты
Перекрёстные, или матричные, отчёты создаются с помощью Microsoft Office или LibreOffice.
Шаблон такого отчёта должен содержать горизонтальную полосу с вертикальной вложенной полосой, и не наоборот, так как вложенные (или дочерние) полосы обрабатываются генератором отчётов только для горизонтальных родительских полос. Результаты в родительской полосе будут использоваться дочерней полосой в качестве параметров запроса.
Ниже приведён пример шаблона, выводящего по вертикали список имён Operators
и горизонтально количество Calls
каждого оператора, сгрупированное по датам звонков.

Вертикальная полоса DataHeader
заполняет отчёт датами вправо:
select distinct c.dateOfCall as date from matrix$Call c order by c.dateOfCall
Горизонтальная полоса Operators
выводит имена операторов сверху вниз:
select o.name as name, o.id as operator_id from matrix$Operator o order by o.createTs
Дочерняя вертикальная полоса Data
использует id
операторов из результатов родительской полосы как параметр для заполнения матрицы:
def result = []
transactional { em ->
def query = em.createQuery('select distinct c.dateOfCall from matrix$Call c order by c.dateOfCall ')
query.resultList.each { date ->
def query2 = em.createQuery('select c from matrix$Call c where c.operator.id = ? 1 and c.dateOfCall = ? 2 ')
query2.setParameter(1, parentBand.getParameterValue('operator_id'))
query2.setParameter(2, date)
result.add(['calls': query2.resultList.size()])
}
}
return result
В результате, отчёт заполняется как вниз по вертикали, так и вправо по горизонтали:
