Makale Özeti

Bu makale de C# ve Reporting Servis web servislerini kullanarak bir raporu dogrudan yerel veya bir ag yazicisina göndermek islemi.

Makale

Konu: Reporting Servis XML Web Service ini ve C# kullanarak programmatik olarak rapor yazdirmak.

Bu makale de C# ve Reporting Servis web servislerini kullanarak bir raporu dogrudan yerel veya bir ag yazicisina göndermek islemi.


Kisaca Reporting Services hakkinda bilgi vererek konumun detayina geçmek istiyorum.(Temel bilgiler olarak Yeliz Korkmaz ve Kivanç Özüölmez hocalarimin makalelerine bakabilirsiniz.) Microsoft SQL Server 2000 Reporting Services Microsoft un Business Intelligence pazar alaninda var olan ve diger BI ürünleri olarak SQL Server 2000 icine dahil olmustur. Çok boyutlu ve Iliskili data kaynaklarinda ki verilerle kisilerin tabüler, matrix, grafiksel ve free-form raporlari olusturmasini ve yönetmesini, server tabanli raporlama ortaminda saglamis olur. Raporlar web-tabanli baglantilarda yaratilabilir ve yönetilebilirler. Yazilimcilar Reporting Services API leri sayesinde elverisli ve uygun çesitli yazilimlar yapabilirler. Reporting Servislerinin en çok cezbeden yönlerinden birisi açik ve esnek web servis API si sunmaktir(SOAP API olarak bilinir). Bu API bizim Windows ve Web uygulamalari için yazmis oldugumuz raporlama servislerine ve yönetim araçlarina Reporting Services in mevcut yeteneklerini entegre etmemizi saglar. SOAP API, uygulamalarimizda raporlama yapmak için Report Management tan herhangi bir seyi entegre etmekte kullanabilecegimiz 100 e yakin XML Web method u içermektedir.

Web Servis Referans i olusturmak:

Ilk once Console Uygulamasi açip Reporting Services in Web Servisini Add Web Referens diyerek eklemek. Local imizde Web Servisi mevcuttur. Eger ki baska Report Server üzerinden Referans alacaksak url olarak http://ServerName/reportserver/reportservice.asmx olarak ya da http://ServerName/reportserver/reportservice.asmx?wsdl yazmaliyiz(wsdl= Web Service Description Language).

Web Servisimizi ekledikten sonra Methodlari kullanmaya baslayabiliriz. Bunun için ReportingServices in instance i almak ve credentials ini ayarlamak.

public PrintExample()
{
//proxy obje si yaratip yetkilendirmesini yapacagiz.
ReportingService insReportingServices;
Console.WriteLine("Web Servis üzerinde yetkilendirme yapiliyor...");
insReportingServices=new ReportingService();
insReportingServices.Credentials=System.Net.CredentialCache.DefaultCredentials;
}


Obje mizi yarattiktan sonra Method lara artik ulasabiliriz. Simdi ise ReportingService.Render method una dikkat çekmek istiyorum.Ki burada en önemli methodlardan biri olarak report server a yayinlayacak rapor u bu method araciligi ile yapacagiz.Örnek olarak ta :

public Byte[] Render(
string Report,
string Format,
string HistoryID,
string DeviceInfo,
[Namespace].ParameterValue[] Parameters,
[Namespace].DataSourceCredentials[] Credentials,
string ShowHideToggle,
out string Encoding,
out string MimeType,
out [Namespace].ParameterValue[] ParametersUsed,
out [Namespace].Warning[] Warnings
out string[] StreamIds);
Member of [Namespace].ReportingService

Daha farkli Method argümanlari için Reporting Services Books Online a bakabilirsiniz.


Kod lara bakacak olursak, gönderdigimiz imaj çiktisinin formatini dizayn eden Format argümanidir. Deger olarak örnegin “IMAGE” verebiliriz.Çikti olarak çesitli çiktilar elde edebiliz(farklı çıktılar için : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rsprog/htm/rsp_prog_extend_security_87oi.asp ) tabii ki Render method u çagirmak için makine bilgilerini tayin etmeye ihtiyacimiz vardir.Bunu XML string türünde DeviceInfo argümani sayesinde kabul ettiririz. Örnek olarak:
"<DeviceInfo><OutputFormat>EMF</OutputFormat></DeviceInfo>".

Burada Render Method u raporu 64 tabaninda sifreli byte dizisi olarak geri dönderir. Bu byte dizileri çiktiya sabit diskteki bir dosyaya saklamak ya da daha da önemlisi yaziciya akim olarak byte lari göndermek gibi pek çok islevi gerçeklestirebilir. Burada örnek rapor olarak daha önce yapmis oldugum Reportserver altinda ki raporu yazdiracagim.

Raporu programmatik olarak yazdirma

Burada C# ve Reporting Servislerini kullanarak bir raporu yazdirabilmek için birkaç ufak zorluk bulunmaktadir. Birincisi C# kullanarak yazma islemini .Net te nasil yapildigini anlamaktir. Bu makale içinde EMF çiktisini yaziciya göndermek için System.Drawing.Printing siniflarini kullandim. Burada ki kod örnegi bunlarin nasil gerçeklestigini göstermektedir. Reporting Servis açisindan, ana zorluk raporda kaç sayfa bulundugudur. Reporting Servis için SOAP API si raporda kaç sayfa bulundugunu rapor özellikleri araciligi ile tespit edemez. Bundan dolayi baska anahtar yol bulmak gerekir kaç sayfa oldugunu bulmak için. Iyi ki SOAP API, Render her çagrildiginda stream ID leri dizisini bize verir. Peki bu stream ID ler nedir, ne ise yarar? EMF çiktisi seçildiginde, Render Method u bize olusturulan rapor un sonuçlarini bir byte dizisi olarak geri gönderir. Sonra ki sayfalar ise raporla beraberinde getirdikleri ID ler ile iliskili olurlar. Sonuçlanan karakter dizisinde StreamID lerin sayisini sayarak, rapor da kaç sayfa oldugunu tespit edebiliriz. Asagida ki kod örnek olarak bunu anlatir :

int m_numberOfPages = streamIDs.Length + 1;

Kaç sayfa ile ugrasacagimizi eger ki biliyorsak rapordaki her sayfa için Render method unu kullanip yaziciya gönderebiliriz. Özel sayfalari ise alet bilgisi ile ayni method u uygulayabiliriz. Bunun için alet sayfasi baslangiç sayfasidir(Start Page). Örnek kodda siradaki her bir saglama çagrisi (orjinalinden sonraki her bir çagri) için alet bilgisi suna benzer :

"<DeviceInfo><OutputFormat>EMF</OutputFormat><StartPage>guncel sayfa
</StartPage></DeviceInfo>".

Her bir sayfa saglandiktan sonra sayfayi(byte toplulugu) sayfa dizine(çok boyutlu byte dizisi) yükleriz. Her bir byte dizisi için bir memory akimi(stream) olusturulup ve bu hafiza akiminin resmini yazici dökümanina yükleriz. Buradan sonra her bir sayfayi yazdirabiliriz artik. Aslinda bu method baslangiç seviyesi için olanlar için degildir ancak daha fazla bilgi için .NET Framework Developers Guide ' a basvurabilirsiniz.

Asagida en son olarak yazici ismi vererek islemimizi sonlandirabiliriz.

static void Main(string[] args)
{
PrintExample printExample = new PrintExample();
printExample.PrintReport(@"PrinterName");
}

Kaynak Kodlari Download link inden indirebilirsiniz.

Iyi Günler…
metin.altuntas@gmail.com


Kaynaklar :

Reporting Services Sınırlı Versiyon indirmek için:

http://www.microsoft.com/downloads/details.aspx?FamilyId=BA517C01-2E2F-4BC7-84AF-149B7637F807&displaylang=en

MSDN üzerinden Reporting Services Books Online:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/RSPORTAL/HTM/rs_gts_portal_3vqd.asp?frame=true

Printing Report