Периодически к нам в техническую поддержку обращаются люди с вопросом: как правильно объединить несколько отчетов в один, например, перед экспортом? Технически это сделать несложно, фактически же здесь есть свои нюансы. Например, что делать с разными единицами измерения или с нумерацией страниц в случае объединения отчетов? Тут нет универсального ответа, так как все зависит от целей и задач, которые ставит перед собой создатель отчетов.
На вход метод принимает отчет, страницы которого будут добавлены в текущий. Метод также имеет перегрузку, в которой вторым параметром передается булевское значение. Этот параметр определяет, необходимо ли предварительное построение отчета. Таким образом, объединение двух объектов StiReport возможно фактически в одну строку -
Также, при использовании этого метода объединения будут автоматически учитываться такие факторы как:
Страницы из report2 будут добавлены в report1 после его страниц, и сконвертированы в единицы измерения report1.
Таким образом, команды
Другой важный аспект касается построения отчетов.
Чаще всего необходимо объединять уже построенные отчёты. Например, в разных местах приложения создаются отчеты, которые являются отдельными частями, и их надо потом объединить вместе в один финальный отчет.
Также часто встречается такой подход: отчеты создаются в одном месте, но сохраняются в виде готовых документов на диске или в базе, другими словами, сначала накапливаются, а уже потом все вместе объединяются в один. В этом случае код может выглядеть следующим образом:
Метод 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;
Таким образом объединить отчеты перед просмотром, печатью, экспортом стало гораздо проще.