Показаны сообщения с ярлыком MS Reporting. Показать все сообщения
Показаны сообщения с ярлыком MS Reporting. Показать все сообщения

среда, января 20, 2010

Взляд на SSRS 2008

Некоторое время назад я был на тренинге под названием "Session on SSRS 2008", который был любезно представлен нам экспером из Microsoft. Остаток двоякий. С одной стороны радуют несколько фактов: то, что я всё ещё достаточно хорошо понимаю англоязычную речь; то, что на мои вопросы не было ответов "похоже я тебя не понимаю"; то, что не смотря на небольшой опыт работы с SSRS 2005 и только теоретический опыт работы с SSRS 2008, всего 2 фичи оказались новыми для меня; то, что всётаки почерпнул эти новые фичи; то, что у меня был ответ на все вопросы, задаваемые моими коллегами и даже на те, на которые презентер не мог дать ответ. С другой стороны есть и огорчающие факты: в первую очередь то, что ответом на мои вопросы было "НЕТ" - ну например ширину столбца таблицы нельзя вычислять динамически, отчёт может работать только с первым SELECTом из процедуры, редактор кода для отчёта по-прежнему ужасен и неудобен.
В общем вот такой я хороший.
Ещё немного огорчило то, что человек, представляющий нам новую технологию, имеет о ней поверхностное представление, знает только то, что собрался показать, а когда задают вопрос посложнее и поглубже - теряется и не может дать ответ. Это что же, все евангелисты из MS такие или просто так совпало? А быть может по тому, что презентер был выходцем из Индии?

суббота, ноября 28, 2009

Баг в MS Reporting

Не уверен, что это фича, потому как это больше похоже на баг. Если в MS отчёте назначить правило скрытия таблицы, то отчёт в просмотрщике не будет разбиваться на страницы - то есть Interactive height действовать не будет. Вроде бы, казалось, ничего страшного, но в случае построения отчёта по очень большому количеству данных, которые должны были отрендериться в большое количество страниц, рендерится огромнейший HTML, который отображается на клиенте очень долго и потом почти так же долго окно с отчётом закрывается. В нашем случае отчёт строился по ~1 000 000 записей, отображение HTML в IE занимало 10 минут.После того, как правило скрытия таблицы было убрано - отчёт разбился на странице и отобразился через несколько секунд.

вторник, ноября 24, 2009

Адвансированный экспорт

Заказчик проекта, который мы завершаем, вдруг захотел адвансированную функциональность, чтобы майкрософтовские отчёты, который открываются из ASP.NET приложения, экспортировались не так, как они выглядят на предварительном просмотре, а по-другому. Ломая голову над тем, как же это реализовать, в поле зрения попало несколько вариантов. Один из них - реализовать дополнительный Rendering Extension, про что сам Microsoft говорит, что лучше этого всячески избегать. Вариант был немного частично опробован и исключён из рассмотрения. Варианты с добавлением кнопок на пользовательский интерфейс были отметены сразу же, потому что внешний вид утверждён и дополнительную кнопку поверх Report Viewer лепить нельзя.
Через некоторое время мук творчества был разработан вот такой вариант решения:
1) на базе существующего отчёта, экспорт которого надо изменить, создаётся дополнительный отчёт, внешний вид которого соответвует тому виду, который заказчик хочет при экспорте;

2) на страницу, где расположен ReportViewer, добавляем
<iframe id="reportDownloader" src="../blank.html" width="10" height="10" style="display:none;"></iframe>

3) следующий javascript поможет нам перехватить вызов экспорта на клиенте

function HandleClientSideExportAlt()
{
  var formatDropDown = GetControl(this.m_formatsID);
  if (formatDropDown.selectedIndex == 0) return false;
  var selectedFormat = formatDropDown.value;
  var fullExportUrl = "/AdvancedExport.aspx?exportFormat=" + escape(selectedFormat);
  document.getElementById('reportDownloader').src = fullExportUrl;
  formatDropDown.selectedIndex = 0;
  this.m_exportController.SetViewerLinkActive(false);
  return true;
}

RSToolbar.prototype.HandleClientSideExport = HandleClientSideExportAlt;

4)в коде страничке AdvancedExport.aspx в теле метода Page_Load реализуем экспорт серверного отчёта:

String ExportFormat = String.IsNullOrEmpty(Request["exportFormat"]) ? "EXCEL" : Request["exportFormat"].ToUpper();

String exportFileName = String.Format("Report{0}.{1}",
DateTime.Now.ToString("ddMMyyhhmmss"),
ExportFormat.Contains("EXCEL") ? "xls" : "pdf");

using (ReportViewer rv = new ReportViewer())
{
  ServerReport serverReport = rv.ServerReport;

  serverReport.ReportServerUrl = ...
  serverReport.ReportPath = ... <- имя нового экспортируемого отчёта
  serverReport.SetParameters(...);

  Warning[] warnings;
  string[] streamids;
  string mimeType;
  string encoding;
  string extension;

  byte[] bytes = serverReport.Render(ExportFormat, null, out mimeType, out encoding, out extension, out streamids, out warnings);
  Response.Clear();
  Response.ContentType = mimeType;
  Response.AddHeader("content-length", bytes.Length.ToString());
  Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", exportFileName));
  Response.BinaryWrite(bytes);
}

Для примера приведён вариант распознавания экспорта в Excel или PDF, но таким же образом можно реализовать и для других форматов.

пятница, сентября 11, 2009

Crystal Reports vs MS Reports

Коль скоро уж речь зашла об опыте использования MS Reports, хотелось бы провести некоторое сравнение этих отчётов с отчётами Crystal, основываясь на собственном, пусть и небольшом, но опыте применения обоих. Оба типа поддерживаются Visual Studio, что предоставляет разработчику выбор, но чтобы он пал в пользу одной или другой системы, следует знать их различия.
К сожалению детального анализа я не производил, а напишу лишь о том, с чем я столкнулся сам.
И так, первое - это печать. Об этом я писал ранее. В случае с Crystal всё просто, в случае с MS необходимо устанавливать дополнительные серверные службы. Если не используется MS SQL Server, то и печать отчётов из ASP.NET приложения сделать будет сложно. Это, пожалуй, основной минус отчётов от Microsoft.
Плюсов же, в сравнении с Crystal'ом, больше:
  • один и тот же набор данных можно по-разному отображать в одном отчёте;
  • отчёты хранятся в открытом XML формате;
  • деплоймент отчётов не требует наличия дополнительных файлов, в отличии от Crystal, который требует установки вместе с приложением ещё и Merge Modules;
  • богатые возможности по настройке серверной части, как, например, кастомизация отображения форматов экспорта;
  • возможность разработки и подключения дополнительных модулей, например, для того же экспорта существует возможность написать модуль для форматов, не предусмотренных по-умолчанию;
  • немаловажным фактором является цена. В простейшем случае, цена уже включена в цену средства разработки, то есть Visual Studio. Но при необходимости использования выделенного сервера отчётов, цена за вариант с Crystal неимоверно возрастает, так как MS SSRS уже включён в SQL Server, а Crystal Enterprise стоит на несколько порядков дороже;
  • ну и напоследок о справочной документации - от MS она в MSDN, а от Crystal, которая была Segate, потом Business Objects, теперь SAP, справку найти не просто.
В общем для меня на лицо выигрыш отчётов от Microsoft, и, учитывая тот факт, что большинство разрабатываемых решений на платформе ASP.NET используют MS SQL Server, я отдаю своё предпочтение им. В случае же отсутствия SQL Server'а, клиентскую печать отчётов из ASP.NET приложения, придётся реализовывать обходными путями, например через экспорт в PDF или обычную браузерную печать.

Непростая печать отчётов

Жил да был один проект и всё на нём было хорошо: и инженеры при деле, и менеджеры спокойны, и заказчик доволен. Но заказчик на то и заказчик, чтобы что нибудь новенькое заказывать. И вот приснилось этому заказчику, что он хочет отчёты распечатывать прямо из ASP.NET приложения. Раньше то у него как было - открыл окошко с отчётом, экспортировал это в Excel или PDF и сиди себе спокойно. Ан нет, теперь подавай прямую печать. Ну надо так надо, сказали инженеры.
В общем то, имея опыт общения с Crystal Reports, я ошибчно полагал, что с печатью у MS проблем не будет. Но не тут то было. Оказалось, что для реализации клиентской печати нужно переходить на серверные отчёты. То есть сам компонент, используемый для отображения отчёта, не может осуществить печать, а нужно отдельно ставить SQL Server Reporting Services (SSRS). Но нет таких задач, с которыми не справился бы наш инженер. В кратчайшие сроки проблемы была решена, заказчик удовлетворён и вновь ввергнут в шаткое состояние перманентного счастья.
Для заказчика и потомков был рождён на свет документ с детальным описанием процесса перехода от локальных отчётов к серверным. Документ лежит здесь.