Sql Server Reporting Services – 6 [Programlama]

Sql Server Reporting Services yazı dizisinin en önemli kısmına geldik. SSRS aracının nasıl programlanacağını, RDL veya RDLC dosyalarının nasıl kullanılacağını örneklendireceğiz. Önceki bölümlerde adım adım bir raporun tasarlanmasını, farklı SSRS senaryolarının oluşturulmasını, Table, Matrix ve Chart kontrollerini kullanarak raporların detaylandırılmasını, parameterik raporların hazırlanmasını yazmış ve örneklendirmiştik. Bu bölümde ise RDL dosyası üzerinde konuşacağız. Bu dosyanın kullanım alanlarına bakacağız.
SQL Server Reporting Services farklı programlama arabirimi veya API kullanarak programatik olarak raporlara erişilmesine, onların yönetilmesine gerekirse yeniden tasarlanmasına olanak tanır. Bu amaçla desteklediği yöntemler şunlardır;

  • URL erişimi
  • ReportViewer kontrolü
  • Web Service
  • Özel Assembly’ler
  • RDL dosya düzenleyiciler

URL Erişimi
En çok tercih edilen bu yöntemde http://HostAdi/RaporSunucuAdi?/folder/RaporAdi şeklinde bir adres kullanılır. Bu şekildeki erişimin güzel yanı URL adresine query string değerler göndererek raporların farklı formatta render edilmesi sağlanabilir. Bunun için Command ve Format parametreleri kullanılır. Örneğin yerel makinemde ReportServer isim rapor sunucusundaki Report Project1/Report1 altındaki raporu doğrudan çalıştırmak için şu adres kullanılabilir.
http://localhost/ReportServer?%2fReport+Project1%2fReport1&rs:Command=Render
“rs:Command=Render” parametresi raporu varsayılan tasarımını getirir. Bu adrese ek olarak “rs:Format” parametresi de gönderilebilir. Bu parametre raporun doğrudan belli bir formatta üretilmesini sağlar. Örneğin aşağıdaki adres raporu çalıştırır ve Excel formatında dışarı verir.
http://localhost/ReportServer?%2fReport+Project1%2fReport1&rs:Command=Render&rs:Format=Excel
Format parametresine bu şekilde aşağıdaki değerler atanarak farklı formatlar elde edilebilir.
HTML4.0
HTML3.2
MHTML
IMAGE
EXCEL
CSV
PDF
XML
Bu dosya formatları seçildiğinde arka tarafta hangi kütüphanelerin kullandığı gibi bilgileri “C:\Program Files\Microsoft SQL Server\MSSQL.3\Reporting Services\ReportServer” altındaki rsreportserver.config dosyasındaki Render bölümünde belirtilmiştir.
Başka bir örnek olarak aşağıdaki adres kolonları Tab (ASCII kodu 9) ile ayrılmış şekilde bir CSV dosyası oluşturur.
http://localhost/ReportServer$SQL2005?%2fReport+Project1%2fReport1&rs:Command=Render&rs:Format=CSV&rc:FieldDelimiter=%09
URL üzerinden erişmeye çalıştığımız rapor parametrik ise istediği parametreleri de query string olarak göndermemiz yeterlidir. Örneğin Sehir isimli parametresi olan raporu şu şekilde çalıştırırız.
http://localhost/ReportServer$SQL2005?%2fReport+Project1%2fReport1&rs:Command=Render&Sehir=Ankara
Reporting Services’te kullanılan diğer parametreler şunlardır;
rs:ClearSession=true sunucu üzerindeki mevcut kullanıcıya ait oturum bilgilerini temizler. Bu seçenek daha önbellekleme işlemlerinde güncel veriden yoksun kalmamak için kullanılır.
rc:Toolbar=true parametresi rapor ekranı üstündeki araç çubuğunun görülebilirlik durumunu ayarlar.
rc:Parameters=collapsed parametre araç çubuğunun daratılmış olmasını sağlar. Bu durumda parametrelerin tarayıcıya URL adresiyle birlikte gönderilmesi beklenir.
rc:StyleSheet=Css Dosyası parametresi rapor ekranında farklı bir css dosyası kullanılmasını sağlar. Varsayılan olarak HtmlViewer.css dosyası kullanılır. Parametre girilirken .css uzantısı girilmez.
Report Viewer kontrolü
SQL Server 2005 Reporting Services, “ASP.NET Web Forms Report Viewer (Microsoft.ReportViewer.WebForms.dll)” ve “Windows Forms Report ViewerMicrosoft.ReportViewer.WinForms.dll” olmak üzere iki rapor gösterici kontrolü sunar. Her iki kontrolün de Server ve Client modları bulunmaktadır. Server modu, sunucu raporlarını yani RDL uzantılı dosyaları çalıştırır. Client modu ise istemci raporlarını yani RDLC uzantılı dosyaları çalıştırır. RDL dosyaları SQL Server 2005 Reporting Services üzerinde oluşturulurken RDLC dosyası ise VS.NET içerisinde herhangi bir projede “Add » New Item” bölümünden Report türünde bir sayfa eklenerek oluşturulur. Nitekim Report Viewer kontrolünü VS.NET içerisindeki projede kullanmak istediğimizde ya daha önce oluşturulmuş uzaktaki bir raporsun adresi verilir veya kontrol üzerindeki “Design a new report” menüsü tıklanarak yeni bir RDLC oluşturulur. RDLC dosyası da RDL gibi XML tabanlı bir dosyadır.
Bir ASP.NET projesi oluşturup aspx sayfasına Toolbox’taki Data sekmesi altındaki ReportViewer kontrolünü taşıyalım. Kontrolün ReportServerUrl özelliğine sunucunun adresini(http://localhost/ReportServer), ReportPath özelliğine raporun konumunu yazalım.

Uzaktaki bir raporu ASP.NET uygulamasında göstermek bu kadar kolay. Hazırladığımız aspx sayfasını kolayca yayınlayabiliriz. Bu aşamada The permissions granted to user are insufficient for performing this operation. (rsAccessDenied) şeklinde bir hata alınırsa SQL Server Reporting Services içerisinde Report1 raporuna ASPNET kullanıcısına yetki vermeniz gerekir.
SQL Server Reporting Services üzerinde oluşturduğumuz RDL dosyasını SSRS’nin olmadığı bir ortamda çalıştırmak veya doğrudan projenin kendisinde çalıştırmak için RDLC’ye çevrilebilir. Bunun SSRS içerisinde RDL dosyası uzantısı RDLC olacak şekilde VS.NET projesinin içerisine kopyalanır. Visual Studio 2005 ve SQL Server 2005 sistemlerinde Dataset veya Data source kavramları farklı anlama geldiği için RDL dosyası RDLC dosyasına dönüştürürken data source’i manual olarak düzenlemek gerekir. Yani rapora ait dataset’in beslendiği veri kaynağını yeniden oluşturmalıyız. Ama tasarım tarafında herhangi bir değişiklik yapmamıza gerek bulunmamaktadır. RDLC dosyasını ASP.NET projesine kopyaladıktan sonra aspx sayfasına ReportViewer kontrolünü taşıyıp kontrole ait ReportViewer Tasks smart tag panelinden rdlc dosyasını seçiyoruz. Ardından aynı panelden Choose Data Sources menüsünü tıklayarak ilgili Dataset için bir veri kaynağı tanımlaması yapmalıyız. Veya varsa projede o veri kaynağını seçmeliyiz.

Bunun dışında herhangi birşey yapmamıza gerek kalmayıp projeyi sorunsuzca deploy edebiliriz. Aynı şekilde herhangi rdlc dosyasını da aynı mantıkla rdl dosyasına çevirip Business Intelligence projesinde kullanabiliriz. Burada sadece ASP.NET örneği verildi fakat ReportViewer kontrolünün Windows versiyonu kullanılarak rdl veya rdlc dosyaları windows uygulamalarında da kullanılabilir. ASP.NET Report Viewer kontrolü için IE tarayıcısının tercih edilmesi daha doğru olacaktır. Diğer tarayıcılarda istenmeyen sonuçlar oluşabilir.
ASP.NET uygulamasında aspx sayfasının Page_Load() yordamında aşağıdaki örnek gibi parametrelere dinamik olarak değer atayabiliriz.

ReportParameter[] parameters = new ReportParameter[1];
parameters[0] = new ReportParameter("Sehir", "Ankara");
ReportViewer1.LocalReport.SetParameters(parameters);

Veya RDLC dosyasındaki parametreler için default değer olarak null seçip sorgumuzu da aşağıdaki gibi değiştirirsek ilk yüklemede tüm liste gelmiş olur.

SELECT MusteriId, AdSoyad, Sehir, Aidat, Odenen
FROM Musteri WHERE (Sehir = ISNULL(@Sehir, Sehir))

Eğer herhangi bir arama paneli oluşturup kullanıcının parametreleri oradan girmesini istersek bunun bir button ekleyip buttonun click eventinde aşağıdaki gibi raporun bağlı olduğu datasource’in parametreleri yeniden düzenlenir.

protected void Button1_Click(object sender, EventArgs e)
{
    ObjectDataSource1.SelectParameters.Clear();
    ObjectDataSource1.SelectParameters.Add("Sehir", "Ankara");
    ObjectDataSource1.DataBind();

    ReportViewer1.LocalReport.Refresh();
}

Web Servisi Olarak Erişim
SQL Server Reporting Services’in en önemli özelliklerden biri de dağıtık uygulamaların raporlara web servisi üzerinden erişmesine olanak tanımasıdır.

Bu amaçla ReportService.asmx / ReportService2005.asmx ve ReportExecution.asmx / ReportExecution2005.asmx SOAP tabanlı iki API sunar. Bu API’ler Web veya Windows uygulamalarında SSRS bünyesinde oluşturulmuş olan raporlara web servisi üzerinden kolayca erişmek, onları yönetmek için birçok yordam ve tür içermektedir. Bu üyelerin listesi MSDN içerisindeki “Reporting Services Web Service” bölümünde verilmiştir. ASP.NET veya Windows uygulamalarımızda API’lere aşağıdaki gibi erişilir.
http:////ReportService.asmx
VS.NET içerisinde bir ASP.NET projesi oluşturalım ve projeye “Add Web Reference” bölümünden ReportService.asmx web servisinin url adresini kullanarak referans olarak kullanalım.

Web servisini seçip OK buttonunu tıkladığımız ilgili proxy sınıf tanımlamaları yapılır.

Bu web servisinden bir proxy nesnesi oluşturup rapor sunucusundaki klasörleri listeleyelim. Bunun için ReportService.asmx API’sini referans olarak projeye eklememiz yeterli olacaktır.

localhost.ReportingService2005 oRs = new localhost.ReportingService2005();

protected void Page_Load(object sender, EventArgs e)
{
    oRs.Credentials = System.Net.CredentialCache.DefaultCredentials;
    localhost.CatalogItem[] raporlar = oRs.ListChildren("/", false);
    for (int x = 0; x 
Herhangi bir raporu çalıştırmak için ReportExecution.asmx içerisinde <b>Render()</b> yordamına ihtiyacımız var. Bu yüzden projeye bu API'yi de referans olarak ekleyip aşağıdaki gibi altındaki raporu HTML olarak çıktı verecek şekilde çalıştıralım. Bu kodlar Page_Load() yordamında yazılmıştır.
localhost.ReportingService2005 oRs = new localhost.ReportingService2005();
//oRs.PreAuthenticate = true;
//Mevcut kullanıcı yetkileriyle bağlansın
//Client-side uygulamalar için o anda makineye logon olan kişidir
//ASP.NET uygulamalar için ASP.NET worker process'i çalıştıran kullanıcıdır
oRs.Credentials = System.Net.CredentialCache.DefaultCredentials;
//Veya
//oRs.Credentials = new System.Net.NetworkCredential("KullaniciAdi", "Sifre");

byte[] Result;
string[] StreamIdentifiers;
string OptionalParam = null;
string extension = String.Empty;
string mimeType = String.Empty;
string encoding = String.Empty;

localhost.Warning[] optionalWarnings = null;

Kodun devamını yazalım.

localhost.ReportExecutionService oRsExec = new localhost.ReportExecutionService();
oRsExec.Credentials = System.Net.CredentialCache.DefaultCredentials;

string historyID = null;
localhost.ExecutionInfo ei = oRsExec.LoadReport("/Report Project1/Report1", historyID);

//Parametrelerini tnaımlayalım
localhost.ParameterValue[] parameters = new localhost.ParameterValue[1];
parameters[0] = new localhost.ParameterValue();
parameters[0].Name = "Sehir";
parameters[0].Value = "Ankara";
oRsExec.SetExecutionParameters(parameters, "tr-TR");

Result = oRsExec.Render("HTML4.0", null, out extension, out mimeType,
out encoding, out optionalWarnings, out StreamIdentifiers);

Response.BinaryWrite(Result);

Çıktı HTML formatında olduğu için ve Response.BinaryWrite kullandığımız için doğrudan Internet Explorer içerisine yazılacaktır. Tabi chart kontroller kullanılmışsa bunlar görünmeyecektir. Bunun yerine HTML formatını kullanırsak içindeki görsel malzemelere de erişmiş oluruz.

Result = oRsExec.Render("MHTML", null, out extension, out mimeType,
	out encoding, out optionalWarnings, out StreamIdentifiers);

Response.AddHeader("content-disposition", "attachment; filename=MusteriListe.mhtml");
Response.OutputStream.Write(Result, 0, Result.Length);
	

Çıktıyı PDF formatında vermek için son 2 satırda aşağıdaki değişikliği yapıyoruz.

Result = oRsExec.Render("PDF", null, out extension, out mimeType,
	out encoding, out optionalWarnings, out StreamIdentifiers);

Response.AddHeader("content-disposition", "attachment; filename=MusteriListe.pdf");
Response.OutputStream.Write(Result, 0, Result.Length);

Response.End();

Web servisini kullanmaya çalışırken Microsoft.ReportingServices.Diagnostics.Utilities.AccessDeniedException: The permissions granted to user ‘SunucuAdi\ASPNET’ are insufficient for performing this operation. hatası alınırsa ASPNET kullanıcısının yetki vermemiz gerekir. “Report Manager”e bağlanıp Properties sekmesi altındaki Security bölümü altında makinedeki ASPNET kullanıcısına Browser rolünü vererek bu sıkıntıyı aşabiliriz.
Uygulama içerisinde veya komut satırında bir raporu yayınlamak için diğer yöntem ise SSRS 2005 içerisinde bulunan Rs.exe aracıdır.
SQL Server İçerisinde Rapor Dosyalarına Erişim
RDL dosyalarını önceki paragraflarda anlattığımız gibi gerek web üzerinden url erişimiyle gerekse uygulamalar içerisinden ReportViewer kontrolü aracılığıyla veya web servisi aracılığıyla kullanabilmekteyiz. Bunun yanısıra bazı basit raporları SQL Server içerisinden de çağrılabilir. RDL dosyasını SQL Server içerisinden çağırmak için herhangi bir database’i Object Explorer içerisindeki SQL Server instance’yi sağ tıklayıp “Reports » Custom Reports . . .” bölümü kullanılır. Buradan RDL dosyasının konumu verilerek çalıştırılır.

Sql Server Reporting Services – 6 [Programlama]” üzerine 14 düşünce

  1. Aysu

    Merhabalar,
    ReportViewer üzerinden raporumu deploy etmeye çalışıyorum. Internetten araştırdığım kadarıyla
    bunları ekledim:Microsoft.ReportViewer.WebForms.dll
    Microsoft.ReportViewer.Common.dllfakat Microsoft.ReportViewer.ProcessingObjectModel.dll ekleyemedim.
    Nasıl yapacağım konusunda kafam oldukça karışık? acaba bi kaç ip ucu verebilir misiniz?
    Teşekkür ederim
    iyi günler

    Cevapla
  2. Aysu

    Teşekkür ederim ahmet bey, kurmuştum aslında ReportViewer.exe yi ama referanslarda gözükmüyor hala.
    Acaba ReportViewer ı visual studio klasörünün içinde bir yere mi koymam gerekiyor?Teşekkürler tekrardan

    Cevapla
  3. Ahmet Kaymaz Yazar

    dll dosyasının GAC’a yüklenip yüklenmediğinden emin olmanız gerekiyor. Konuyla ilgili aşağıdaki linkleri inceleyebilirsiniz. Belki bu adreslere daha önce baktınız burada yazılanları yaptığınızda çalışıyor olması gerekir.http://aspadvice.com/blogs/ssmith/archive/2007/01/24/Could-not-load-file-or-assembly-Microsoft.ReportViewer.WebForms.aspxhttp://drowningintechnicaldebt.com/blogs/dennisbottjer/archive/2006/10/16/Hacking-Report-Viewer-Redistributable.aspx

    Cevapla
  4. Barış

    Ahmet Bey Merhaba,Sizin kaynaklarınızdan faydalanarak sqlserver reporting service üzerinde bir rapor hazırlamaya başladım. Kaynaklarınız bu konuda çok faydalı oldu. Ancak takıldıgım bir nokta var. Farklı farklı 10 Adet veritabanım var. Her bir veritabanı bir şubeye ait. konsolide raporlarda tüm veritabanlarını source ederek rapor alabiliyorum ancak parametreyle ayrı database seçemiyorum. (örnek USE DENEME Parametrem USE @SUBE) Bu konuda Yardımınıza ihtiyacım var.
    Şimdiden Teşekkürler.

    Cevapla
  5. Ahmet Kaymaz Yazar

    Barış,deneme imkanım olmadı fakat aklıma şu yöntemler geliyor;
    1 – Bir tane Genel veritabanı oluşturulur. Bu veritabanındaki procedure dışarından gideceği DB’nin adını parametre olarak alır ve geriye ilgili DataSet’i döndürür. Kullanıcıya mevcut DB’ler seçtirip prosedüre gönderebilirsin.
    2 – SSRS içerisinde dinamik connection string tanımlayabilirsin. Aşağıdaki linkler yardımcı olacaktır.http://kmukesh.wordpress.com/2008/10/15/microsoft-ssrs-2005-pass-dynamic-connection-string-to-report/http://www.simple-talk.com/community/forums/post/2735.aspxhttp://blogs.lessthandot.com/index.php/DataMgmt/DBAdmin/dynamics-server-connections-in-ssrs

    Cevapla
  6. Aysu

    Merhaba Ahmet Bey,
    Kullanıcıdan (bir aspx sayfasından) rapor parametresi alıp, onu rapor urline ekleyip, kullanıcı buttona bastığında göstermek istiyorum. yani aspx sayfasından url referansı vermek istiyorum. reportviewer kullanmadan bunu yapabilir miyim?Şimdiden teşekkürler
    iyi günler.

    Cevapla
  7. Ahmet Kaymaz Yazar

    Aysu Hanım,Rapor URL’ine parametre olarak ekleyeceğiniz değer nedir. Bir rapor dosyası mıdır (RDL, RDLC) yoksa içerideki rapor sorgusuna QueryString ile değer mi göndereceksiniz. Eğer RDL dosyasını göstermek istiyorsanız ReportViewer kontrolünü kullanmak zorundasınız. Eğer RDL dosyası yerine başka bir alternatif kullanmak isterseniz dinamik SQL aracılığıyla DataGrid gibi kontrolleri de kolayca kullanabilirsiniz.

    Cevapla
  8. Aysu

    Merhaba Ahmet Bey,
    Url e tarih gibi değerler vereceğim.amacım herhangi bir sayfada raporu göstermek değil, kullanıcı button a bastığında benim url i report servera gönderip kullanıcının bilgisayarına raporu indirmek istiyorum. deploy ettiğim rapor rdl tipinde ama excel halini indirmek istiyorum. yani reportviewer gibi birşeyde görüp parametre girip raporu gösterip sonra indirmek değil.
    Öğrenmek istediğim şeyde, urlim nasıl birşey olmalı ve ben arayüzden report server a nasıl ulaşırım.Çok teşekkür ederim yardımınız için.
    İyi günler

    Cevapla
  9. Çağdaş Şimşek

    Ahmet Bey teşekkür ederiz böyle bir sayfayı hazırlayıp paylaştığınız için.Raporlarda başta “Vier Report” butonu olmak üzere parametrelerin vs. girildiği sabit şeridin rengi vb. değiştirilebiliyor mu? Aradım, taradım ama sonuca ulaşamadım.Çalışmalarınızda başarılar.

    Cevapla
  10. Ahmet Kaymaz Yazar

    Çağdaş,CssStyle özelliğiyle yapılabileceğini düşünüyorum. Veya sayfanın html çıktısına bakıp o kontrollerin adına uygun olarak bir style tanımlaması yapılabilir.

    Cevapla
  11. emin coşkun

    merhaba ahmet bey ben reportviewer hakkında bir şey soracaktım reportviewer ile kendi bilgisayarımda oluşturduğum (vb.net ile winform projemde) rapor alabiliyorum ancak ağda bulunan diğer bilgisayarlar rapor alamıyor ağda istemciler rapora nasıl ulaşabilir ve rapor alabilirler teşekkürler.

    Cevapla
  12. Ahmet Kaymaz Yazar

    Emin Coşkun merhaba,ReportViewer aracını Remote Mode’da çalıştırman bu işlem için yeterli olmalı. Ağdaki makineler http üzerinden ilgili dosyalara erişebilir.

    Cevapla

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.