Projenin raporlama evrensini çok seviyorum, çünkü yazdığınız programın ne kadar işe yaradığını, neler yapabildiğini ve hatta neleri eksik yaptığını görebilmenizi sağlıyoru. Birde teknik işin çoğu drag&drop olduğu için biraz daha eğlenceli geliyor. Yine bir e-ticaret projesinin raporlama evresinde bir kaç sorunla karşılatık ve nasıl aştığımızı hatta bir tanesini aşamadığımızı paylaşmak istiyorum.
Report Builder 3.0’ın ve SQL Server 2008 R2’nin piyasaya çıkmasından doğal olarak gaza gelip raporlarımızı Reporting Services R2 üzerinden yayınlamaya ve oluşturmaya karar verdik.
Report Builder 3.0 çok kolay kullanılabilen ve hazırladığınız raporu direkt sunucuya göndermenizi sağlayan özelliklerle donatılmış. Raporlarınızı hemen oluşturup sunucuya gönderip servis üzerinden ister Web ister Windows Ugulamalarında kullanabiliyorsunuz. Müthiş rahatlık! ama bir kaç problem var.
Raporlarımızı oluşturup yayına hazır hale getirdikten sonra sıra kendi sistemimize implemente etmeye geldi .Net’in native kontrollerinden ReportViewer’ı kullanarak işe başladık. Karşımıza çıkan ilk sorun sunucudaki rapor’a ulaşırken Reporting Services’in kimlik doğrulama istemesiydi (Gerçi bunu kaldırabiliyorsunuz ama güvenlik nedeni ile pek yanaşmadık). ReportViewer kontorolünün içindeki "ServerReport.ReportServerCredentials" özelliğini kullanarak bu sorunu hallettik ama bunun için aşağıdaki kendi sınıfımızı hazırlamamız gerektir.
using System.Net;
using System.Security.Principal;
using Microsoft.Reporting.WebForms;
public class ReportServerCredentials : IReportServerCredentials
{
private string _username;
private string _password;
private string _domain;
public ReportServerCredentials(string UserName, string Password, string Domain)
{
_username = UserName;
_password = Password;
_domain = Domain;
}
public bool GetFormsCredentials(out Cookie authCookie, out string user, out string password, out string authority)
{
authCookie = null;
user = password = authority = null;
return false;
}
public WindowsIdentity ImpersonationUser
{
get
{
return null;
}
}
public ICredentials NetworkCredentials
{
get
{
return new NetworkCredential(_username, _password, _domain);
}
}
}
Aslında çok bir şey yok IReportServerCredentials Interface’ini implemente edip gerekli boşlukları doldurmanız yeterli. Bu class’ı kullanarak aşağıdaki şekilde ReportViewer’ın sunucudaki Repor’a erişmesini sağaladık.
ReportViewer1.ServerReport.ReportServerCredentials = new ReportServerCredentials("user","pass","domain");
Bu sayede kullanıcının herhangi bir şifre girmesine gerek kalmadan rapor’u görmesini sağlayabildik.
Akabinde karşımıza çıkan başka bir sorunda SQL Server 2008 R2 ile gelen Reporting Services’in raporları yayınlamak için kullandığı ReportViewer kontrolünün versionu oldu.
Reporting Services’in kullandığı kontrolün versionu 10.50.1600.1 fakat VS.NET 2010 ile gelen ReportViewer kontrolünün versionu 10.0.0.0’dı böyle olunca bazı yeniliklerden faydalanamıyorsunuz ve raportunuzdaki ileri, geri, arama ve yeni çıkan "Export to Data Feed" butonu çalşmıyordu biraz uğraşıp Reporting Services’deki kontrolleri local projemde çalıştırmayı denedim fakat fazla zamanımız olmadığından vaz geçtik ve bir sonraki refactoring’e bıraktık.
Burdan çıkabilecek ufak bir ipucu vermek gerekirse. Reporting Services’i çalıştığı dizin : C:Program FilesMicrosoft SQL ServerMSRS10_50.MSSQLSERVERReporting ServicesReportServer şeklindeydi. Şimdilik direkt sunucu üzerinden raporları çağırıyoruz. Sanırım VS.NET 2010’un SP1’i ile ReportViewer kontrolünün versionu 10.50.1600.1’e yükselir ve direkt projemize implemente edebiliriz.
Not: Report Builder 3.0 aracı sadece SQL Server R2 ile gelen Reporting Services ile entegre çalışabiliyor. Reporting Services’ın içinden çıkıyor setup’ı ama yinede burdan çekebilirsiniz.