Sql Server Reporting Services – 6 [Programlama]

SQL Server, Oracle Add comments

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://<Ana Sunucu>/<Rapor Sunucu>/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 < raporlar.Length; x++)
        Response.Write(raporlar[x].Name.ToString() + "
"); }

Herhangi bir raporu çalıştırmak için ReportExecution.asmx içerisinde Render() 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.

12 Responses to “Sql Server Reporting Services – 6 [Programlama]”

  1. Aysu Says:

    Merhabalar,
    ReportViewer üzerinden raporumu deploy etmeye çalışıyorum. Internetten araştırdığım kadarıyla
    bunları ekledim:

    Microsoft.ReportViewer.WebForms.dll
    Microsoft.ReportViewer.Common.dll

    fakat 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

  2. Ahmet Kaymaz Says:

    Aysu Hanım,

    hangi .dll dosyalarını deploy edeceÄŸini ve bunların nerede olduÄŸunu bulmak sıkıntılı olduÄŸu için Microsoft “Microsoft Report Viewer Redistributable 2005″ isminde bir paket çıkardı. Bu paketi sunucuya kurduÄŸunuz zaman ilgili bileÅŸenleri yükleyecektir. Paketi aÅŸağıdaki adresten indirebilirsiniz.

    http://www.microsoft.com/DOWNLOADS/details.aspx?familyid=8A166CAC-758D-45C8-B637-DD7726E61367&displaylang=en

  3. Aysu Says:

    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

  4. Ahmet Kaymaz Says:

    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.aspx

    http://drowningintechnicaldebt.com/blogs/dennisbottjer/archive/2006/10/16/Hacking-Report-Viewer-Redistributable.aspx

  5. Barış Says:

    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.

  6. Ahmet Kaymaz Says:

    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.aspx

    http://blogs.lessthandot.com/index.php/DataMgmt/DBAdmin/dynamics-server-connections-in-ssrs

  7. Aysu Says:

    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.

  8. Ahmet Kaymaz Says:

    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.

  9. Aysu Says:

    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

  10. Ahmet Kaymaz Says:

    URL üzerinden hem rapor içerisindeki parametrelere değer göndermek için çıktıyı belli formatta dışarı vermek için gerekli link bu makalede anlatılıyor aslında. Aşağıdaki link rapordaki Sehir parametresine Ankara değerini gönderir ve çıktıyı Excel olarak dışarı verir.

    http://localhost/ReportServer$SQL2005?%2fReport+Project1%2fReport1&rs:Command=Render&rs:Format=Excel&Sehir=Ankara

  11. Çağdaş Şimşek Says:

    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.

  12. Ahmet Kaymaz Says:

    Ç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.

Leave a Reply


× 2 = 6

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS GiriÅŸ