Периодически к нам в техническую поддержку обращаются люди с вопросом: как правильно объединить несколько отчетов в один, например, перед экспортом? Технически это сделать несложно, фактически же здесь есть свои нюансы. Например, что делать с разными единицами измерения или с нумерацией страниц в случае объединения отчетов? Тут нет универсального ответа, так как все зависит от целей и задач, которые ставит перед собой создатель отчетов. Для демонстрации объединения нескольких отчетов в один мы разработали несколько примеров - для JS и для .NET.

Метод MergeDocument()

Однако, даже в небольшом коде можно сделать много ошибок. Поэтому мы пошли дальше и добавили метод MergeDocument() экземпляра класса StiReport для объединения отчетов. В JavaScript-генераторе отчетов - mergeDocumentAsync().

На вход метод принимает отчет, страницы которого будут добавлены в текущий. Метод также имеет перегрузку, в которой вторым параметром передается булевское значение. Этот параметр определяет, необходимо ли предварительное построение отчета. Таким образом, объединение двух объектов StiReport возможно фактически в одну строку - report.MergeDocument(report2, true).

Также, при использовании этого метода объединения будут автоматически учитываться такие факторы как:
  • единицы измерения встраиваемого отчета будут сконвертированы в единицы измерения основного отчёта;
  • правильно учитывается кэширование;
  • копируются закладки.


Особенности работы с дашбордами

Файл шаблона может содержать как страницы отчета, так и дашборд. Дашборд в данном случае – это не статический объект, то есть, у него нет фиксированных размеров. Дашборд нельзя построить, хотя у него есть метод Render(), однако это просто заглушка. Конкретные размеры дашборду можно задать только при экспорте. Поэтому объединить отчет и дашборд в один готовый документ нельзя. Метод MergeDocument добавляет в основной отчет из другого шаблона только страницы отчета. Если шаблон содержит только дашборд, то метод выдаст исключение. Это следует учитывать при подготовке шаблонов для объединения.


Практическое применение метода

Во-первых, нужно понимать, какой отчет будет встроен в другой. Это важно, поскольку влияет на единицы измерения в отчете и порядок страниц. Разберем следующий пример кода:

report1.MergeDocument(report2);

Страницы из report2 будут добавлены в report1 после его страниц, и сконвертированы в единицы измерения report1.

Таким образом, команды report1.MergeDocument(report2) и report2.MergeDocument(report1) на выходе дадут два разных документа, несмотря на то, что и в первом, и во втором случае report1 и report2 одни и те же.

Другой важный аспект касается построения отчетов.
Чаще всего необходимо объединять уже построенные отчёты. Например, в разных местах приложения создаются отчеты, которые являются отдельными частями, и их надо потом объединить вместе в один финальный отчет.

Также часто встречается такой подход: отчеты создаются в одном месте, но сохраняются в виде готовых документов на диске или в базе, другими словами, сначала накапливаются, а уже потом все вместе объединяются в один. В этом случае код может выглядеть следующим образом:
var report = StiReport.CreateNewReport();
report.LoadDocument("documents\\Invoice.mdc");
var report2 = StiReport.CreateNewReport();
report2.LoadDocument("documents\\Christmas.mdc");

report.MergeDocument(report2);

report.Show();
Но в некоторых случаях нужно просто в одном месте загрузить, построить и объединить два шаблона отчета. Пример кода объединения отчетов:
var report = StiReport.CreateNewReport();
report.Load("Reports\\Invoice.mrt");
var report2 = StiReport.CreateNewReport();
report2.Load("Reports\\Christmas.mrt");

report.Render();
report2.Render();
report.MergeDocument(report2);

report.Show();
Для упрощения кода можно использовать перегрузку метода MergeDocument() с двумя параметрами, передавая во втором параметре true. В этом случае внутри метода будет автоматически вызван рендеринг обоих отчетов. Например, код метода объединения отчетов с перегрузкой построения:
var report = StiReport.CreateNewReport();
report.Load("Reports\\Invoice.mrt");
var report2 = StiReport.CreateNewReport();
report2.Load("Reports\\Christmas.mrt");

report.MergeDocument(report2, true);

report.Show();
В случае объединения более двух отчетов, важно соблюдать последовательность и помнить, что используются единицы измерения того отчета, в который происходит объединение. Пример объединения трех отчетов:
var report = StiReport.CreateNewReport();
report.Load("Reports\\Invoice.mrt");
var report2 = StiReport.CreateNewReport();
report2.Load("Reports\\Christmas.mrt");
var report3 = StiReport.CreateNewReport();
report3.Load("Reports\\Report3.mrt");

report.MergeDocument(report2, true);
report.MergeDocument(report3, true);

//report is containing a rendered pages of the report, report2 and report3
report.Show();
Для JavaScript-генератора отчетов используется асинхронный метод объединения - mergeDocumentAsync(). Глобально, все вышеописанное относится и к этому методу. Объединение страниц отчетов, как и их построение, происходит в асинхронном режиме. Соответственно, если метод mergeDocumentAsync() используется с одним аргументом, а отчеты перед объединением необходимо построить, то в JS следует вызывать у них метод renderAsync2(). Например, объединение нескольких отчетов:
var report = StiReport.CreateNewReport();
report.Load("Reports\\Invoice.mrt");
var report2 = StiReport.CreateNewReport();
report2.Load("Reports\\Christmas.mrt");

await report.renderAsync2();
await report2.renderAsync2();
await report.mergeDocumentAsync(report2);

viewer.report = report;
Объединение нескольких шаблонов в один отчет с построением в методе mergeDocumentAsync(,).
var report = StiReport.CreateNewReport();
report.Load("Reports\\Invoice.mrt");
var report2 = StiReport.CreateNewReport();
report2.Load("Reports\\Christmas.mrt");

await report.mergeDocumentAsync(report2, true);

viewer.report = report;
Таким образом объединить отчеты перед просмотром, печатью, экспортом стало гораздо проще.
Используя этот сайт, вы соглашаетесь на использование файлов Cookie для аналитики и персонализированного контента. Файлы Cookie хранят полезную информацию на вашем компьютере, чтобы помочь нам повысить эффективность и удобство использования. Для получения дополнительной информации, пожалуйста, прочтите Конфиденциальность и Использование Cookie.