SSRS Raporunu Sql Server Standart Edition ile Dağıtımı

Sql Server Standart Edition lisansına sahip olduğumuzu ve SSRS ile bir rapor hazırladığımızı düşünelim. Raporun çıktısını da Excel olarak (veya PDF, Word..vs) merkezi bir yerden kullanıcılara e-posta ile planlı bir şekilde (günlük, haftalık, aylık..vs) göndermek istiyoruz diyelim. Hatta şöyle yapalım; bu rapor her kullanıcı için farklı parametre alarak çalışsın ve her kullanıcı için farklı bir çıktı üretsin..

İlk aklımıza gelen Data-Driven Subscriptions özelliğini Sql Server lisansımız yüzünden kullanamayacağız çünkü Standart Edition bu özelliği kapsamıyor. Peki ne yapabiliriz? İşte bu noktada zamanında benim için hayat kurtaran bir yöntemden bahsetmek istiyorum..

Gelin öncelikle senaryomuz üzerine konuşalım.. Raporların parametre alarak çalıştırılması, istediğimiz formatta çıktı üretmesi ve son olarak da bu çıktıların e-posta ile gönderilmesi işlemleri için SSIS‘i kullanacağız. Raporların kişiye özel çalışması için de raporun kullanıcı adını (Domain) parametre almasını ve içeriğinin bu parametreye göre oluşmasını sağlamalıyız. Bu sayede kullanıcı SSRS’e giriş yaparak raporu görmek istediği takdirde dahi kendisine özgü verileri görecektir. Tamam ama biz bu raporu merkezi bir yerden dağıtmak istiyoruz. Bu yüzden öncelikle bir tablo oluşturmalı ve raporu göndereceğimiz kişileri orada saklamalıyız. SSIS içersinden de bu tabloyu dönmeli, Script Component (C#) kullanarak SSRS web servisine bağlanmalı ve raporları çalıştırmalıyız. Çıktılarını da bir dizine kaydedip, sonrasında bu çıktıları ilgili kullanıcılara ekli bir e-posta ile göndermeliyiz. SSIS paketimizi de planlamak için Sql Server Agent‘i kullanıyor olacağız.

Aslında kurgu değişebilir. Mesela SSIS yerine kendi uygulamanızı da yazabilirsiniz. Buradaki püf nokta bir programlama dili ile SSRS web servisine bağlanıp raporları dışarıdan çalıştırabilmek ve çıktılarını dışa aktarabilmek.

Başlayalım..

Örnekte AdventureWorks veritabanını kullandım. Çıkan sonuçlar çok mantıklı olmayabilir. Burada daha çok teknik olarak neleri yapmamız gerektiği üzerinde durdum.

İlk aşamada raporu göndereceğimiz kullanıcılar için bir sorgu yazıyoruz.

SSRS1-1

UserID ve ‘MYDOMAIN\TR”yi birleştirdiğimizde kişinin domain kullanıcı adına ulaştığımızı düşünelim (Örn: UserID:47 ise Domain User Name:MYDOMAIN\TR47). Bunu rapora parametre olarak göndereceğiz. FullName’i bilgi amaçlı koydum, belki e-posta içersinde kullanırız. EMail’i de bir şekilde uydurduk, geldi. E-postayı gönderebilmek için gerekli.

Sonrasında raporda kullanacağımız pek de mantıklı olmayan bir sorgu hazırladım. İleride buna parametre ekleyeceğiz.

SSRS1-2

SSRS’deki raporumuza basitçe bir Table ekleyip daha önce oluşturduğum sorgudaki alanları ekledim. Sonrasında rapor içersinde UserID adında bir parametre oluşturdum. Buradaki önemli nokta parametrenin görünürlüğünün Hidden seçilmesi. Visible olsaydı senaryomuzu bozmazdı ama kişi SSRS’e bağlandığında bunu görecek ve isterse başkası adına raporu çalıştırabilecekti. Bunu istemiyoruz. Öte yandan Internal‘ı seçersek de bu parametreye rapor dışından erişemiyoruz.

SSRS1-4

Daha sonra yine parametre ekranında Default Values sekmesine gelerek, Specify values seçeneğini seçip fx butonu ile ulaştığımız Expression ekranında mevcut özelliklerden (Built-in Fields) UserID‘yi seçiyoruz. Bu sayede eklediğimiz parametre raporu çalıştıran kullanıcı adını varsayılan olarak alacaktır.

SSRS1-5

Parametreyi rapora tanımladıktan sonra kullanmak gerek. Bu sebeple SSRS Dataset‘i içersindeki sorguya parametremizi ekliyorum. Burada şunu unutmamak gerek; oluşturduğumuz parametreye varsayılan olarak kullanıcı adı domain ile birlikte geliyor. Şartımızı da buna uygun yazmak lazım.

SSRS1-6

Sorgumuza şartmızı ekledikten sonra onu refere etmek gerekiyor. Dataset’in Parameters sekmesinde sorguda kullandığımız @UserID parametresini raporda oluşturduğumuz UserID’ye yönlendiriyoruz.

SSRS1-7

Bu hali ile (varsayılan SSRS ayarlarının yapıldığını düşünerek) raporumuz çalışır durumdadır. SSRS’e deploy ettikten sonra artık SSRS Web Servisini kullanarak raporumuza erişebiliriz. Tabi buradaki senaryoda kullanıcı adı sallama olduğu için kendi ortamımıza uyarlamalıyız.

Raporumuz hazır olduğu için artık SSIS projesi oluşturabiliriz. Oluşturduğumuz projeye bir paket ekliyoruz. Raporu göndereceğimiz kişileri tek tek dönüp her biri için ayrı bir rapor çalıştıracağımız için bir Data Flow Task nesnesini pakete ekliyoruz ve oradan Data Flow aşamasına geçiyoruz.

SSRS1-8

Sorgumuzu oluşturmak için bir OLE DB Source nesnesi ekliyoruz ve bağlantıları kurup daha önceden oluşturduğumuz sorguyu yazıyoruz. Artık kullanıcı adı, kişi adı ve e-posta adreslerine tek tek erişebilir durumdayız.

SSRS1-9

Parametrelerimiz hazır olduğuna göre artık raporumuzu işletebiliriz. Bunu C# aracılığıyla yapacağız. Bu yüzden de bir Script Component ekliyorum ve tipini Destination olarak belirliyorum.

SSRS1-10

Script Component ile C# veya VB kullanabiliyoruz ve paketten istediğimiz verileri bu nesneye gönderip, istersek geri de alabiliyoruz. Burada ReadOnlyVariables ile kullanıcı adı, kişi ismi ve e-posta adresini kod bloğumuza gönderiyoruz.

SSRS1-11

SSRS1-12

Artık kod yazabiliriz ama bir saniye. Henüz SSRS Web Service‘ine nasıl bağlanacağımız noktasında herhangi birşey yapmadık. Bilindiği üzere web servislerin WSDL dosyasını kullanarak WSDL Tool ile servisi kullanabileceğimiz bir class oluşturabiliyoruz. Kısaca Visual Studio Command Prompt‘a girip aşağıdaki kodu çalıştırdığımızda C dizinine ReportService.cs adında bir class oluşacaktır. Buradaki önemli nokta [servername] yazan alana SSRS’in çalıştığı sunucu adını yazmamız gerekiyor.

SSRS1-13

Şimdi tekrar Script Component’e dönüyoruz ve Edit Script diyerek açılan ayrı bir Visual Studio ortamında karşımıza C# kodlarının yer aldığı bir proje geliyor. Buraya az evvel oluşturduğumuz ReportService.cs class’ını ekliyoruz.

SSRS1-14

Kullanacağımız değişkenleri tanımlıyoruz.

SSRS1-15

SSRS bağlantı ayarlarını tanımlıyoruz. Bunu PreExecute event’ında yaptım ben ama seçim sizin.

SSRS1-19

Artık Input0_ProcessInputRow event’ı içersinde raporumuzu işletebiliriz. Burada raporumuzu yüklüyor, parametrelerini ekliyor ve çalıştırıyoruz. Hangi formatta render edeceğimizi belirtiyor ve oluşan çıktıyı bir dizine kaydediyoruz. Dosyanın adını belirlerken dikkat etmeliyiz ki bir sonraki aşamada bu dosyayı e-posta ile gönderebilelim. E-posta gönderim kısmını yazmadım, kendi kullandığınız class’ı eklersiniz. Ola ki lazım oldu, ufak bir arama ile bulunabiliyor. Son olarak da farkettiğiniz üzere Row nesnesi içersinde Script Component’e gönderdiğimiz değişkenler yer alıyor, bunları seçimimize (ReadOnly / ReadWrite) göre kullanabiliyoruz.

SSRS1-20

Paketimizi başarılı bir şekilde oluşturduktan sonra artık bunu Sql Server’a deploy edip, Sql Server Agent ile schedule edebiliriz.

Evet, anlatacaklarım bu kadar. Her aşamanın detaylarına girmedim. Pek ihtiyaç olmaz diye düşündüm, zira buradaki nokta SSRS veya SSIS nasıl kullanılır değildi. Umarım faydalı olmuştur.. : )