English version

Очень часто необходимо сформировать отчет, который содержит несколько циклов по горизонтали.

Нужно заметить, что в подобных кросс-отчетах необходимо получать итоги как по строкам так и по столбцам с одновременным расчетом промежуточных итогов по группам.

Вроде бы сводная таблица PivotGrid с этим хорошо справляется. Однако и в ней есть недостаток – она не умеет формировать более одного цикла по оси строк или колонок.

Рассмотрим на примере Расчетно-платежной ведомости.

Расчетно-платежная ведомость содержит 2 горизонтальных цикла по начислениям и по удержаниям. Это две различные коллекции в источнике данных (в другом отчете в первом и втором циклах может быть разное число уровней). Кроме этого в данном отчете есть еще расчетная колонка «Сумма к выдачи» колонка № 14.

cross-report

Сформировать подобную ведомость с помощью ExtraPivotGrid невозможно.

Для разработки подобных отчетов используют следующий подход (на основе опыта FastReport):

  1. Располагают несколько сводных таблиц горизонтально, в нашем примере
    1. Первая таблица содержит колонки 1-2, 3-8
    2. Первая таблица содержит колонки 1-2, 9-13
    3. Первая таблица содержит колонки 1-2, 14-15
    4. Во всех трех сводных таблицах в области строк одинаковый набор измерений «1» и «2». Но видимы они только в первой таблице, во второй и третьей стоит ширина = 0

При печати у нас должны «склеится» все три таблицы и визуально получится одна общая.

Однако если сделать подобный XtraReport отчет, то к большому сожалению можно увидеть, что XtraReport не умеет сдвигать элементы расположенные справа от сводной таблицы. В результате при формировании подобного отчета каждая из сводных таблиц расширяется вправо и в итоге все три таблицы перекроют друг-друга.

Печальная ситуация и это ограничение текущей версии и XtraReport 13.2.8, можете проголосовать за тикет Q575588.

Однако в XtraReport есть возможность программно по событию сдвинуть элементы расположенные справа от сводной таблицы. Используя обработчик «BeforePrint» для элемента расположенного справа от расширяемой сводной таблицы.

Но и тут нас ждет разочарование… оказывается поле сводной таблицы «RightF» - никак не реагирует на расширение. Поэтому ширину сводной таблицы нам придется считать самим. Тут необходимо заметить, что компонент XtraPivotGrid очень функционален и рассчитать его ширину не так уж и просто.

Была попытка сделать один раз функцию корректного сдвига при расширении сводной таблицы, которую прикладные разработчики смогут многократно использовать в своих шаблонах. В текущий момент приведенная ниже функция Shift2Pivot работает корректно для большинства случаев дизайна сводной таблицы.

Что необходимо сделать прикладному разработчику шаблона отчета:

  1. Добавить в скрипт отчета код функции Shift2Pivot
  2. В событии BeforePrint для таблицы справа вызвать функцию Shift2Pivot(LeftTable, RightTable);

При разработке подобных отчетов – нужно четко контролировать высоту строк, иначе может нарушится соответствие сводных таблиц. Поэтому приходится отказаться от использование опцию WordWrap для заголовков строк.

Надеюсь, что в будущих версиях XtraReport элементы будут сдвигаться сами и подобное ухищрения не понадобятся.

Возможно у Вас есть другие идеи реализации подобных отчетов просьба написать.

Проект с примером можно скачать тут Q575588, ниже приведен код метода сдвига таблицы: