среда, 24 ноября 2010 г.

Создание пользовательского логотипа в SSRS отчете.

Недавно передо мной встала задача вместо статического логотипа в SQL server reporting service сделать показ лого, которое храниться базе. Следует отметить, что отчет хранится внутри приложения, не на сервере SSRS.

Погуглив я нашел три способа сделать это:
1) Передавать картинку в параметрах
2) Использовать дополнительный DataSource к базе в отчете
3) Создать SubReport с лого и включать его во все репорты.

По идее наиболее просто это создать сабрепорт и использовать его во всех отчетах, но оказалось, что его нельзя вставить в header отчета.

С DataSource тоже не сразу получилось, оказывается контрол Image в заголовке не может ссылаться на DataSource. MSDN подсказал финт ушами - создаем невидимый textbox, он вычитывает данные из DataSource, а картинка в заголовке уже берет данные из textbox. Реализовал эту стратегию, но кода получилось довольно много.

В результате наиболее выгодной стратегий оказалось передавать картинку в параметре. Но тут тоже ограничение, пареметр не может быть бинарным, поэтому картинку нужно вначале перекодировать в Base64, а потом уже в отчете раскодировать обратно.

Формируем параметр:

byte[] logo = GetLogoFromDB();
string paramLogo = Convert.ToBase64String(logo);

Передаем его в отчет:

ReportViewer.LocalReport.SetParameters(
new List<ReportParameter>()
{
new ReportParameter("logo", paramLogo )
});

В самом отчете создаем параметр "logo" а для картинки ставим
value=System.Convert.FromBase64String(Parameters!logo.Value)

В итоге кода не очень много и получаем наше кастомное лого в отчете.

Описание решений по работе с картинками в SSRS:
Images (Report Builder 3.0 and SSRS)
http://technet.microsoft.com/en-us/library/dd239394.aspx