Периодически к нам в техническую поддержку обращаются люди с вопросом: как правильно объединить несколько отчетов в один, например, перед экспортом? Технически это сделать несложно, фактически же здесь есть свои нюансы. Например, что делать с разными единицами измерения или с нумерацией страниц в случае объединения отчетов? Тут нет универсального ответа, так как все зависит от целей и задач, которые ставит перед собой создатель отчетов. Для демонстрации объединения нескольких отчетов в один мы разработали несколько примеров - для 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;
Таким образом объединить отчеты перед просмотром, печатью, экспортом стало гораздо проще.
By using this website, you agree to the use of cookies for analytics and personalized content. Cookies store useful information on your computer to help us improve efficiency and usability. For more information, please read the privacy policy and cookie policy.