1.2.1.1. Перекрёстные отчёты

Перекрёстные, или матричные, отчёты создаются с помощью Microsoft Office или LibreOffice.

Шаблон такого отчёта должен содержать горизонтальную полосу с вертикальной вложенной полосой, и не наоборот, так как вложенные (или дочерние) полосы обрабатываются генератором отчётов только для горизонтальных родительских полос. Результаты в родительской полосе будут использоваться дочерней полосой в качестве параметров запроса.

Ниже приведён пример шаблона, выводящего по вертикали список имён Operators и горизонтально количество Calls каждого оператора, сгрупированное по датам звонков.

crosstab template

Вертикальная полоса 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

В результате, отчёт заполняется как вниз по вертикали, так и вправо по горизонтали:

crosstab report