Reporting Service Pivot Operatörüyle Pivot Tablo Oluşturmak

Pivot operatörü belirli bir kolondaki farklı verileri bağımsız kolonlar şekline dönüştürür.
Ya da basitçe satırları sütunlara dönüştürür. Örneğin şirket çalışanlarının farklı yıllardaki,
dört farklı dönem için aldıkları puanları tutan bir tablo olduğunu düşünelim.

Dönem alanındaki verileri (Q1, Q2, Q3, Q4) bağımsız kolonlar haline dönüştürmek için
şöyle bir sorgu kullanılabilir :

Select * from dbo.PersonelPuan
pivot (avg(Puan)
for Donem in (“Q1″,”Q2″,”Q3″,”Q4”)) PVT

Reklamlar

Reporting Service Filtreleme Teknikleri

Özellikle çok miktarda veri içeren veri tabanlarından, raporlama amacıyla veri alınırken, sadece ve gerçekten gerektiği miktarda veri çekmek gerekir. Böylece hem kaynak kullanımı azalır hem de raporun render edilişi hızlanır. İşte filtreleme bu gerekçelerle uygulanan bir işlemdir. Burada sorun; kullanıcının aynı oturumda, aynı raporu farklı seferlerde alırken, veri çekme kriterini değiştiriyor olma sorunudur.

Not  : Bu yazı “Reporting Service ile Raporlama” isimli kitabımdan bir alıntıdır. Konunun detayı ve devamı bu kitapta yer almaktadır. Bu yazıdan izinsiz alıntı yapılamaz !

Okumaya devam et

Reporting Service 2 Renkli Dinamik Table

İpucu : Reporting Service’te Table kontrolüyle kayıtlar gösterildiğinde bir kayıtta farklı bir arka plan rengi diğer bir kayıtta farklı bir arka plan rengi olsun istenebilir. (ASP.NET’teki Grid gibi) Bu durumda satır içindeki tüm Textbox’ların BackgroundColor özelliğine aşağıdaki gibi bir expression yazılmalıdır :

=iif(RowNumber(Nothing) Mod 2 = 0, “Silver”, “White”)

Bu konuda daha detaylı bilgi ve farklı örnekler görmek için
https://aykuttasdelen.wordpress.com/2010/08/16/how-to-conditional-formatting-in-reporting-services/
yazımı okuyunuz.

İlk Ve Tek Türkçe Reporting Services Kitabı Çıktı !

Konusunda ilk ve tek Türkçe kaynak olma özelliğini taşıyan Reporting Services ile Raporlama isimli 6. kitabım Pusula Yayıncılıktan çıktı. Öncelikle kitaba yoğun emeği geçen; Selahattin Sarı (Grafik), Alper Zorlu (Düzelti), Gülendam Mallı, Derkan Karakoyun ve Mustafa Arslantunalı‘ya teşekkür ediyorum.Kitap düzgün bir Türkçeyle yazılmış tam bir “nasıl yapılır ?” kitabı karakteristiğini taşıyor. Pek çok başlık altında pratik örneklerle ele alınmış konuların sıklet merkezini development (geliştirme) tarafı teşkil ediyor. Ancak yine de belirli ölçüde yönetimsel ve alt yapıya dair başlıklar da söz konusu.Kitabı tüm kitapçılar ve derneğimizden de (C ve Sistem Programcıları Derneği) temin edebilirsiniz. info@aykuttasdelen.net adresinden mail ile ulaşırsanız kitabı imzalayıp kargo ile gönderebilirim.

Kitapla ilgili genel değerlendirmeler ve başlık özeti şöyle :

• Raporlamanın Temel Kavramları
• List, Table, Matrix, SubReport, Chart Kontrolleri
• Expression’lar ve Fonksiyonlar
• Özgün (Custom) Kodların Yazılması
• Assembly Kullanımı
• BLOB Verilerin Gösterimi
• Reporting Service Yönetimi
• Mail ile Rapor Gönderimi
• Uygulama Entegrasyonu
• Report Viewer Kontrolü
• URL ve Web Servisiyle Erişimler
• Rapor Modelleri ve Report Builder ile Ad-Hoc Raporlama
• Analysis Service’tan (OLAP) Raporlama
• Subscription’lar Oluşturma
• Ve diğerleri …

Genel Değerlendirmeler

1.  bölümde raporlama konusuna ilişkin temel kavramlar ve terminoloji ele alınmaktadır. Ayrıca sihirbaz kullanılarak basit bir örnek yapılmakta ve böylece okuyucunun konuya dair ana noktalar hakkında hızlıca fikir sahibi olması sağlanmaktadır.

2. bölüm ise rapor tasarımı, kontrollerin ve fonksiyonların kullanımı OLAP ve OLTP kaynaklarına nasıl bağlanılacağı, rapor şablonlarının oluşturulması ayrıca özgün kodların yazılması gibi temel geliştirme konularını detaylı ve örnekler üzerinden giderek irdelemektedir. Özellikle Business Intelligence Development Studio aracının nasıl kullanılacağı, Dataset’lerin nasıl oluşturulup manipüle edileceği, filtreler, parametreler, gruplamalar gibi önemli konular yine bu bölümde karşınıza çıkacak.

3. bölüm, geliştirilmesi tamamlanmış bir projenin rapor sunucusuna hangi yöntemlerle deploy edileceğini ve bu aşamada ortaya çıkması muhtemel sorunların çözümlerini ele almaktadır.

4. bölüm her ne kadar bu kitap bir dbadmin için yazılmış yönetim ağırlıklı konuları ele alan bir kitap olmasa da, Reporting Service üzerinde programlama yapan bir geliştiricinin de bir ölçüde bu konulara aşina olması gerektiği için, bu konular hakkında çok temel olan bilgileri okuyucuya kazandırmaktır. Söz gelimi raporların nasıl çalıştığı, snapshot ve cached instance’ların oluşturulması, subscription’ların yaratılması, mail ve dosya paylaşımıyla raporların deliver edilmesi ve güvenlik gibi yönetimsel konular ele alınmaktadır.

5. bölüm Reporting Service’in uygulamalara nasıl entegre edilebileceğine dair yöntemleri incelemekte ve örneklemektedir. URL ve Web Servisiyle erişimin yanı sıra WinForms ve ASP.NET uygulamalarında ReportViewer kontrolüyle raporların gösterimi bu bölümde ele alınmaktadır.

6. bölümde ise ad-hoc raporlama yani son kullanıcıların kendi raporlarını oluşturubilmesini sağlayan Report Builder isimli araç ve rapor model projelerinin geliştirilmesi anlatılmaktadır.

7. bölüm ise T-SQL sorgulama dili konusunda okuyucunun olası eksiklerini gidermeye yönelik bir referans bölümüdür.

Analysis Service Nedir ? What is Analysis Service ?

Not : Bu yazı Aykut TAŞDELEN’in Reporting Service kitabından alıntıdır, izinsiz kullanılamaz ve devamı söz konusu kitapta yer almaktadır !

Bilindiği gibi SQL Server’da veri tabanları OLTP ve OLAP diye ikiye ayrılmaktadır. OLTP (On Line Transactional Processing) veri tabanları; verilerin iki boyutlu -satır ve sütunlardan oluşan- tablolar biçiminde tutulduğu ve bu tablolar arasında ilişkilerin kurulabilmesiyle karakterize tipik ilişkisel veri tabanlarıdır. OLTP, görece az miktardaki verinin olduğu ancak fazla atomik işlem gören veri tabanları için uygundur. Atomik ifadesinden kastedilen anlam transactional çalışma mantığıdır. Bu çalışma mantığı kısaca ACID doktirini diye bilinen prensiplerle özetlenir.

OLAP (On Line Analytical Proccessing) ise; görece fazla miktarda verinin iki boyutlu tablolar yerine çok boyutlu küpler biçiminde tutulduğu ve bu veriler üzerinde istatistiksel analizlerin yapılabildiği veri tabanlarını ifade eder. Özellikle karar destek sistemlerinde kullanılan bu tür veri tabanlarının arkasında çoğu zaman yine OLTP türü veri tabanları bulunmaktadır. Ayrıca OLAP veri tabanları eş zamanlı (concurrent) birden çok kullanıcıya OLTP’ye göre çok daha performanslı sorgu sonuçları üretebilir.

OLTP türü veri tabanlarının sorgulanmasında SQL dili kullanılırken, OLAP için temelde SQL diline benzeyen ancak küp, slice, fact veya dimension gibi OLAP’a özgü olguları destekleyen MDX (Multi Dimensional eXpression language) sorgulama dili kullanılır.

İşte Analysis Services; Microsoft SQL Server’ın OLAP türü veri tabanlarını destekleyen teknolojisidir.

Son yıllarda kullanımı popülerleşen Veri Ambarı (DataWarehouse) kavramı da yine bu konuyla ilgilidir. Kabaca bir kurumun farklı departman ya da veri sahalarından gelen verileri denormalizasyon yaparak merkezi biçimde depolayan yapı anlamına gelir. Kuşkusuz yapılan tek şey denormalizasyon değildir. Yine sıkça kullanılan bir terim olan ETL, veri ambarı oluşturma sürecini ifade eder.

E = Extract : Yani veriyi çeşitli sahalardan (farklı şubeler, farklı departmanlar gibi) ve çeşitli veri tabanlarından elde etmek,

T = Transform : İstenilen şekle dönüştürmek ve

L = Load : Veri ambarına yüklemek şeklinde özetlenebilir.

 

Data Mart; veri ambarına ilişkin alt kümeleri anlatan bir terimdir. Söz gelimi bir bankayı ele alırsak tüm bankaya ait bilgiler veri ambarını ifade ederken, departmanlar düzeyindeki bilgiler data mart’ları ifade eder. Örneğin ADK, Kredi, Bireysel Bankacılık veya Nakit Yönetimi gibi departmanların verileri somutlaşmış data mart örnekleridir.   

Veri Madenciliği (Data Mining) ise; veri ambarındaki aralarında başta bir korelasyon yokmuş gibi gözüken verilerin, istatistiksel bazı metotlar kullanılarak analiz edilmesi, bu yolla verilerin içindeki mantık örgülerinin (patern’lerin) keşfedilerek, verilerin anlamlandırılması ve geleceğe dair öngörülerde bulunulması demektir. Somutlamak gerekirse örneğin geçmiş 50 yıllık seçimlerde belirli bir şehirde yaşayan insanların seçimin yapıldığı mevsime bakılarak hangi mevsimde, en çok hangi partiye oy verdiğini inceleyip sonuca göre de önümüzdeki seçimlerde hangi mevsimde seçim yapılırsa o partinin daha çok oy alacağı kestirilebilir.

Küp (Cube); verinin kendisi ve boyutlarını ifade eden bir terimdir. Boyut (Dimension); basit anlamda verinin analiz edildiği bakış açısıdır. Örneğin bir ürüne ait satış verisi yer, zaman veya kategori boyutlarında analiz edilebilir.  Fact’ler ise boyutlardaki özetlenmiş, hesaplanmış değerlerdir. Örneğin satış verisindeki toplam ya da ortalama satış adedi gibi. Bu şekilde oluşturulan küpler sayesinde veri ambarı kullanılabilir hale gelmektedir. Küpler üzerinde çeşitli işlemlerin yapılabildiği yapılardır örneğin;

Dilimleme (Slicing); kabaca ilişkisel veri tabanlarında where ile bir koşul belirleyerek yapılan işlemin karşılığıdır. Burada koşul oluşturmak için boyutlardan faydalanılır. Örneğin yılın üçüncü çeyreğindeki satışlar gibi. Dicing ise; dilimleme işleminin birden çok boyutta yapılması demektir.

Not : Bu yazının devamındaki küplerin raporlama için kullanımı gibi bilgiler Taşdelen’in Reporting Services kitabında yer almaktadır.

Reporting Service Programatic Report Rendering Render Method

Not : Bu yazı Aykut TAŞDELEN’in Reporting Service kitabından alıntıdır, izinsiz kullanılamaz ve devamı söz konusu kitapta yer almaktadır !

Bir raporu programatik olarak görüntülemenin yolu ReportExecutionService::Render() isimli fonksiyonu kullanmaktır. İlk parametresine raporun path bilgisini alan bu fonksiyon, diğerlerinde de render işlemine ait farklı detayları alan veya dışarıya bilgi olarak veren parametrelere sahiptir. Byte dizisi biçiminde raporu döndürdüğü için istenilen bir formatta raporu masaüstü ya da web ortamında görüntülemek kolaydır.

publicbyte[] Render(

    string Format,

    string DeviceInfo,

    PageCountMode PaginationMode,

    out string Extension,

    out string MimeType,

    out string Encoding,

    out Warning[] Warnings,

    out string[] StreamIds

)

Dikkat : Bu fonksiyon ReportExecutionService isimli sınıfa ait olduğu için bu sınıfa ilişkin asmx dosyası da referanse edilmiş olmalıdır.

http://host/ReportServer/ReportExecutionXXXX.asmx

Bu fonksiyon output parametrelerine geçilen değişkenlere çalışması bittiğinde belirli değerler set etmekte olduğu için pratik kullanımda çoğu zaman null geçilerek çağrım yapılmaktadır. Ayrıca Reporting Service’in 2005 versiyonunda fonksiyonun ilk parametresi raporun path’ini alırken, 2008’de bu durum değiştirilmiş, dolayısıyla aynı işlem  artık ExecutionInfo sınıfının LoadReport() fonksiyonuyla yapılır hale getirilmiştir.

Aşağıdaki kodda bir ASP.NET uygulamasının bu servisi ve Render() metodunu kullanarak sunucudaki raporu nasıl render edip bir pdf dosyası haline getirdiği örneklenmektedir.

using rsServiceExec;

using System.Net;

using System.Web.Services.Protocols;

using System.IO;

public partial class _Default : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        ReportExecutionService rs = new ReportExecutionService();

        rs.Credentials = CredentialCache.DefaultCredentials;

        rs.Url =
          “http://127.0.0.1/ReportServer/ReportExecution2005.asmx”;

        // Render argümanları

        byte[] result = null;

        string path = “/Ornek_2.1/DrDnPersonelPuanMatris”;

        string format = “PDF”;

        string devInfo =
            @”<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>”;

        string encoding;

        string mimeType;

        string extension;

        Warning[] warnings = null;

        string[] streamIDs = null;

        ExecutionInfo execInfo = new ExecutionInfo();

        ExecutionHeader execHeader = new ExecutionHeader();

        rs.ExecutionHeaderValue = execHeader;

        execInfo = rs.LoadReport(path, null);

        // Raporun render edilişi

        try

        {

            result = rs.Render(format, devInfo,
                out extension, out encoding,
                out mimeType, out warnings, out streamIDs);

            execInfo = rs.GetExecutionInfo();

        }

        catch (SoapException exc)

        {

             Response.Write(exc.Detail.OuterXml);

        }

        // Raporun dosyaya kaydedilişi

        try

        {

            FileStream fs = File.Create
               (Server.MapPath(“report.pdf”),result.Length);

            fs.Write(result, 0, result.Length);

            Response.Write(“Rapor oluştu”);

            fs.Close();

        }

        catch (Exception exc)

        {

            Response.Write(exc.Message);

        }

    }

}

Aykut TAŞDELEN

aykuttasdelen@csystem.org

C Ve Sistem Programcıları Derneği Eğitmeni