Sql Server Reporting Services – 7 / Report Builder

Bundan önceki makalelerde Report Designer, Sql Server Management Studio, Report Manager gibi araçlar kullanarak SQL Server Reporting Services ile ilgili senaryoları örneklendirdik. Bu senaryolar çoğu kullanıcıların rapor tasarlamaları gerekmeksizin sistem yöneticisi tarafından hazırlanmış olan standart raporlar aracılığıyla güncel verileri çekmesini sağlamaktadır. Microsoft son kullanıcıları da (masaüstü kullanıcılar, iş analistleri) unutmayıp SSRS’in Ad-Hoc Reporting (Anında raporlama) senaryosuna da desteklemesini sağlamıştır. İçerisine heterojen kullanıcıların bulunduğu kurumsal uygulamalar için hazırlanan Ad-Hoc Reporting, kullanıcıların anlık ihtiyaçlarına göre raporlama yapabilmeleridir. SSRS bu amaçla Report Builder isimli aracı sunar. Kullanıcılar bu araç sayesine farklı rapor türünde farklı kontroller kullanarak o anki ihtiyaca göre rapor tasarlayabilirler. Peki bu nasıl mümkün olacak.
Kullanıcıların anlık raporlama yapabilmeleri için rapor yöneticilerinin rapor modelleri (data model) tanımlamaları gerekir. Report Builder son kullanıcıların doğrudan VTYS’ye erişmesini engelleyip veritabanı yöneticisi tarafından hazırlanmış olan data model isimli yapılar üzerinden rapor tasarımının yapılmasını sağlar. Data Model, DBA’lerin hoc reporting için uygun gördüğü tablo ve onlar arasındaki ilişkilerden oluşan kümedir. Data modelleri SQL Server Business Intelligence Development Studio aracılığıyla oluşturulur. Bununla ilgili bir örnek yapalım. VS.NET içerisinde “New Project » Business Intelligence Projects” bölümünden Report Model Project türünde bir proje oluşturalım. Projeye Satislar ismini verdim. Yeni bir proje oluşturulduğu zaman Solution Explorer içerisinde Data Sources, Data Source Views ve Report Models klasörleri hazır olarak gelir.
Data Sources klasörü, veri kaynağı, bağlantı cümlesi gibi Report Builder aracının veritabanına bağlanması için gerekli bilgileri içerir. Veri kaynakları .ds uzantılı dosyalarda tutulur.
Data Source Views klasörü veri kaynağının gösterdiği veritabanı içerisindeki tabloları, viewleri ve aralarındaki ilişkileri içerir. Data source view belgeleri .dsv uzantılı olarak tutulur.
Report Models veri kaynağı üzerinden erişilen veritabanına ait metadatayı(üst-veriyi) içerir. Bir report model dosyası üretildiği zaman varlıkları, roller, kolon ve klasörler otomatik olarak oluşturulur. Model dosyaları .smdl olarak saklanır.
Solution Explorer içerisindeki Satislar projesindeki Data Sources klasörünü sağ tıklayıp “Add New Data Source” menüsünden yeni bir veri kaynağı oluşturalım. Lokaldeki SQL Server 2005’e bağlanıp ETicaret isimli veritabanını veri kaynağı olarak projeye ekledim. Aynı şekilde Data Source Views klasörünü sağ tıklayıp “Ad New Data Source View” menüsünden yeni bir görünüm nesnesi oluşturalım. Gelen ilk ekranda biraz önce oluşturduğunuz veri kaynağı seçelim. Bir sonraki ekranda table veya view nesnelerini seçelim. Aşağıdaki tabloları örnek olarak projeye dahil ettim.

“Report Models” klasörünü de sağ tıklayıp “Add New Report Model” menüsünü tıklayalım. İlk pencerede önceki adımda oluşturduğumuz data source view dosyasını seçelim. Bir sonraki ekranda varsayılan seçenekleri kullanarak rapor modelini oluşturalım.

Bu seçimleri yaptıktan sonra son ekrandaki Run düğmesini tıklayarak tüm varlık bilgisi ve ilişkiler üretilmiş olur. Aşağıdaki şekilde model için gerekli nesneler ve Alisveris varlığının öznitelikleri gösterilmiştir.

Bu aşamada rapor modeli oluşturuldu ancak son kullanıcının kullanımına açmak için deploy etmek gerekir. Data modeli sağ tıklayıp Deploy düğmesini tıklayarak modeli Reporting Services sunusuna dağıtalım. http://localhost/Reports/ adresindan rapor sunucuna geçtiğimizde Models klasörünün altında ETicaret modelinin oluştuğunu görmüş oluruz.

Oluşturulmuş bu model üzerinde anlık raporlama yapmak için üst menüdeki Report Builder linkini tıklayalım. Bu link http://localhost/ReportServer/ReportBuilder/ReportBuilder.application dosyasını yani Report Builder uygulamasını açacaktır. Bu şekilde dışarından raporlama sunucusuna erişilmesi için IIS üzerinde ReportServer»ReportBuilder klasörüne anonymous erişim iznini verilmesi gerekir.Report Builder, tipik WinForm uygulaması olduğu için kullanıcı uygulamayı doğrudan browser içerisinden çalıştırmak yerine makinesine kurarak kullanır. Fakat bu aracın ClickOnce destekli olması kullanıcı tarafındaki kurulum işletimini otomatikleştirmektedir. ClickOnce teknolojisi Windows uygulamalarının web üzerinden kolay ve güvenli bir şekilde deploy edilmesini sağlar. Nitekim Report Builder linkini tıkladığımızda ClickOnce kurulum ekranı çıkar.

İstemci tarafında .Net Framework 2.0’ın kurulu olması gerektiğini unutmamalıyız. Microsoft Report Builder aracının ilk ekranında sunucu üzerinde tanımlı model kaynakları görülür. Ayrıca dışarıdan veya doğrudan sunucu üzerindeki RDL dosyalarını da bu ekranda çalıştırabiliriz.

ETicaret modelini seçip “New Report” menüsünden yeni bir rapor tasarım alanı açalım. Bu tasarımın tipini Report Layout bölümüden Table, Matrix ve Chart olarak seçebiliriz. Örnek olarak Table seçeneğini seçtim.
Ekranın sol tarafındaki Entities penceresinde modele dahil edilmiş olan tabloların listesi görülür. Bu tablolardan birini seçtiğimizde alt taraftaki Fileds penceresinde o tablonun seçilmiş olan kolonları listelenir. Modeli oluştururken kullandığımız “Data Source View” içerisinde bulunan tablolar aşağıdaki gibi ilişkilendirilmiştir.

Bu ilişki referans alınarak aşağıdaki varlıklar oluşturulur ve aralarındaki ilişki düzenlenir.

Sol taraftaki kolonları kullanarak müşterilerin alışverişlerinin listelendiği table türündeki bir rapor oluşturalım. Raporu müşteri tablosundaki AdSoyad, Alisveris tablosundaki Tarih ve Urun tablosundaki UrunAd kolonlarına göre gruplandıralım. Değer olarak hangi üründen kaç tane alındığını yazdıralım. Bunun için yapmamız gereken şey soldaki kolonları tasarım alanına sürükle-bırak ile taşımamızdır.

Rapor üzerinde farklı bir özetleme seviyesi oluşturmak veya filte tanımlamak için üst menüdeki Sort and Group ve Filter düğmeleri kullanılır.
Report Builder’in diğer önemli özelliği son kullanıcıya tasarlamış olduğu bu raporu sunucuya deploy etmesini yani sunucunda saklamasına imkan tanımasıdır. “File » Save” menüsünden dosyayı sunucuya kayıt edelim. Böylece web üzerinden oluşturduğumuz rapora rahatlıkla erişilebilir.
Bu şekilde oluşturulan RDL dosyalarını VS.NET içerisindeki rapor projelerinde kullanabiliriz. Bu RDL dosyası data source olarak sunucu üzerindeki modeli kullandığından dolayı data source tanımlarken Connection String bölümünde server=http://localhost/reportserver; datasource=/Models/E Ticaret şeklinde tanımlama yapılır.

Son olarak ReportBuilder aracını command line’dan çalıştırmak için aşağıdaki gibi ReportBuilder.exe programı çalıştırılabilir.
ReportBuilder.exe /s=http://localhost/ReportServer “/model=/Models/E Ticaret”

Sql Server Reporting Services – 7 / Report Builder” üzerine bir düşünce

  1. MasterYoda

    merhaba hocam, sql reporting services aktif olarak çalışmakta ve kullanıcılar web üzerinden user name pass ile bağlanıp rapor çekebilmekte. ancak rapor view edildiğinde ekrandaki print ikonuna basıldığında şu hatayı vermekte “unable to load client print control”.
    araştırdığımda bir sürü yabancı forumda bu sorunu yaşamış insanlar ama adam gibi bi cevap çıkmamış yabancılardan :) microsoft diyorki eğer ingilizce okuma hatası yapmadı isem http://www.microsoft.com/turkiye/technet/security/advisory/956391.mspx
    anladığım kadarı ile de bu sayfadaki işe götürüyor beni http://www.microsoft.com/downloads/details.aspx?familyid=82833F27-081D-4B72-83EF-2836360A904D&displaylang=en
    hocam şimdiden teşekkür ederim ilginize.

    Cevapla
  2. Ahmet Kaymaz Yazar

    Merhaba,Reporting Services üzerinde raporu yazdırmak için istemci tarafında Client Print Control bileşeninin kurulmuş olması lazım. Rapordaki Print ikonunu tıkladığınızda tarayıcı ActiveX uyarısı verir bunun nerden install edileceğini yazar. Uyarıyı kabul ettiğinizde otomatik olarak SQL Server sitesinden ilgili componenti indirip makinenizi yükler.

    Cevapla
  3. Mustafa

    merhaba hocam MasterYoda arkadaşın problemini şuanda bede yaşıyorum bir internet sayfasından kullanıcılar veri girip on report edip yazıcıdan çıktı alıyorlardı. fakat sistemin çokmesi sonucu makineye format attıktan sonra aynı sayfadan çıktı alamıyoruz \”unable to load client print control\” hatası veriyor ve gerekli olan active x i download etmiyor makineler bunu manuel olarak download edip bilgisayarlara kurma imkanımız varmı ? warsada nereden download edebiliriz.

    Cevapla
  4. Ergin GÜZEL

    Merhabalar Ahmet Hocam
    Netron’da sizden SQL Server dersleri alırken aldığım hazzı, şimdi RS üzerine yazdığınız bu 7 makaleyi okurken alıyorum. Yine detaylar, yine hayat kurtaran ince noktalar. Ellerinize sağlık hocam. Bana ne kadar yardımcı olduğunuzu anlatamam.. Allah size, ve bize SQL server anlatırken doğan, şimdilerde 3 yaşında olan kızınıza sağlıklı ve mutlu bir ömür versin..

    Cevapla
  5. Ahmet Kaymaz Yazar

    Bu kadirşinas mesajın için çok teşekkür ederim :) İş ve özel hayatın için aynı dilekleri diliyorum.

    Cevapla
  6. Fatih

    merhaba hocam. benim sorum grafik raporlarla ilgili. reports model olarak sipariş tablosunu aldım ve bu tabloda tahmin edeceğiniz üzere ürün kodundan miktarına açıklamasından müşterisine kadar oldukça fazla alan mevcut. daha sonra Report Builder ile yeni bir rapor sayfası açıyorum ve tipinide chart olarak seçiyorum. burda şöyle bir sorun var. diyelimki kullanıcı grafiğin üzerine ürün numarası ve miktar alanlarını sürükleyip bırakıyor. raporu çalıştırdığımız zaman bir grafik çıkıyoru buraya kadar herşey normal. ama daha sonra grafiğin üzine tıkladığımızda ilgili ürünle ilgili table bir rapor açıyor ancak bu raporun chart üzerinde alanlarla ilgisi yok. burada default alanlar geliyor. bunuda araştırdığımda daha visual studio ekranında iken table nesnesi üzerinde defaultdetailattribute özelliğinden geldiğini keşfettim. burada tanımladığım alanldar table rapor üzerinde geliyor. ama ben grafiğin üzerine ne sürüklemişse kullanıcı onların detay rapor üzerinde görünmesini sağlamak istiyorum. inşallah derdimi anlatabilmişimdir. eğer anlatamadıysam mail yolu ile resimli vir anlatım yapmayıda seve seve kabul ederim. ilginize şimdiden çok teşekkürler

    Cevapla
  7. Ahmet Kaymaz Yazar

    Fatih merhaba,eğer hala bir çözüm bulamadıysan blog -> ahmetkaymaz.com adresine detaylı mail atarsan belki bir fikir yürütebilirim.

    Cevapla
  8. Barış Gülbaş

    Ahmet Hocam Selamlar,reporting service’de en sonra dinamiş data source konusuna takılmıştım ve yardımlarınız sorucunda parametre sayesinde db’ler arasında geçiş yapabiliyorum.Şimdi farklı bir sorum olacak. SSRS’de, yine farklı Db’lerim olduğu için (Db şemaları aynı) bir Query’i her db için tekrar tekrar UNION SELECT’i kullanmak yerine sürekli Db’leri dolaşacak Dinamik bir query’i yazılabilir mi? Not: Ana Db’de diğer Db’lerin adlarını barındıran bir tablom var. Yardımcı Olabilirseniz Çok Sevinirim.Teşekkürler.

    Cevapla
  9. Ahmet Kaymaz Yazar

    Barış,bunun için tüm DB’leri UNION ile birleştiren bir view hazırlayabilirsin veya SQL Server içerisinde standart olarak sp_msforeachdb yordamı kullanılabilir. Fakat sp_msforeachdb yordamına çok güvenme derim. Bazı projelerde beni yarı yolda bırakmıştır :) . Veya kendin bir procedure hazırlarsın. Bu prosedür sysdatabases katalok view’inden DB isimlerini okuyup ona göre dinamik bir SQL sorgusu oluşturabilirsin.

    Cevapla
  10. Barış Gülbaş

    Hocam, sp_msforeachdb’yi biraz araştırdım benim işim görecek gibi ancak sp_msforeachdb içerisindeki QUERY’e parametre gönderemiyorum. Örnek Aşağıdadır. İnceleyip bilgi verebilirmisiniz.SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[SP_DETAYLI_CIRO]
    -@TARIH datetime AS
    BEGIN
    SET NOCOUNT ON;
    CREATE TABLE #TEMP1 (
    DBNAME sysName,
    CIRO float,
    NAKIT float,
    CARI float,
    KART_ADI nvarchar(30),
    TUTAR float) EXEC SP_MSFOREACHDB’IF “?” LIKE “ROP%”
    BEGIN
    USE ?
    insert into #temp1
    SELECT “?”,
    (SELECT SUM(ADISYON_TUTARI) FROM ARSIVAD WHERE TARIH=”2010-09-26″ ) TOPLAM_CIRO,
    (SELECT SUM(NAKIT_ODENEN) FROM ARSIVAD WHERE TARIH=”2010-09-26¨ ) NAKIT,
    (SELECT SUM(CARI_ODENEN) FROM ARSIVAD WHERE TARIH=”2010-09-26¨ ) CARI,
    KR.KART_ADI,
    SUM(K.TUTAR) TUTARFROM KARTODE K, KRD_KART KR WHERE TARIH=”2010-09-26¨
    AND K.KART_KODU=KR.KOD
    GROUP BY KR.KART_ADI END’ SELECT DBNAME,CIRO,NAKIT,CARI,KART_ADI,TUTAR FROM #TEMP1DROP TABLE #TEMP1END
    GOSET ANSI_NULLS OFF
    GO
    SET QUOTED_IDENTIFIER OFF
    GO

    Cevapla
  11. Ahmet Kaymaz Yazar

    Barış,sanırım @TARIH parametresini sorguya göndermek istiyorsun. SP_MSFOREACHDB nihayetinde nvarchar türünde parametre aldığı için sorgunun TARIH=”2010-09-26¨ bölümünü TARIH=”+ @TARIH +” şeklinde string birleştirmesi yapman yeterli olacaktır. Eğer o satırda hata verirse önce @Sorgu varchar(1000) şeklinde bir değişken tanımla bu değişkenin içerisine sorgunu yazdır. Ardından SP_MSFOREACHDB @Sorgu olarak çalıştır.

    Cevapla
  12. Barış Gülbaş

    Ahmet Hocam,Bahsettiğiniz gibi değişkenin içerisine sorguyu ekledim ancak yine parametre çalışmadı. Parametresiz sorun yok. Aşagıda sp’yi gönderiyorum. İnceleyebilirmisiniz.Teşekkürler.SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GOALTER PROCEDURE [dbo].[SP_TEST1]-@TARIH DATETIME
    @TIP VARCHAR(5)AS
    BEGIN SET NOCOUNT ON;declare @sql varchar(3900) set @sql = ‘SELECT DB_NAME(),SUM(ADISYON_TUTARI) FROM ARSIVAD WHERE ADISYON_TIPI = “@TIP” ‘declare @cmd1 varchar(100)
    declare @cmd2 varchar(4000)
    declare @cmd3 varchar(100)
    set @cmd1 = ‘if “?” like “commonprefix_%” raiserror (“Starting ?”, 0, 1) with nowait’
    set @cmd3 = ‘if “?” like “commonprefix_%” print “Finished ?”‘
    set @cmd2 = replace(‘if “?” like “ROP%” begin use [?] {0} end’, ‘{0}’, @sql)
    exec sp_msforeachdb @command1 = @cmd1, @command2 = @cmd2, @command3 = @cmd3END
    GOSET ANSI_NULLS OFF
    GO
    SET QUOTED_IDENTIFIER OFF
    GO

    Cevapla
  13. Ahmet Kaymaz Yazar

    Barış,bu şekilde kabul etmesi lazım. syntax hatası veriyorsa ‘ veya ” işaretlerini kontrol etmeni tavsiye ederim. Örneğin set @sql = ‘SELECT DB_NAME(),SUM(ADISYON_TUTARI) FROM ARSIVAD WHERE ADISYON_TIPI = “@TIP” ‘ifadesi aşağıdaki gibi yazılır.set @sql = ‘SELECT DB_NAME(),SUM(ADISYON_TUTARI) FROM ARSIVAD
    WHERE ADISYON_TIPI =”‘+ @TIP +””Bu şekilde sp_msforeachdb prosedürüne sorguyu göndermede yani çalıştırmadan önce ekranda yazdırırsan doğru yazıp yazmadığını daha net görmüş olursun.

    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.