Microsoft Report etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Microsoft Report etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Çarşamba, Mayıs 06, 2015

Overlapping SSRS Report Items

After converting your SQL Server Reporting Services reports from 2005 to 2008, you may notice a difference in the way the report looks. One possible reason for this difference is the change in the way overlapping report items are rendered.

In both SSRS versions, the message in the Output window is similar to: "[rsOverlappingReportItems] The text box ‘Textbox2’ and the text box ‘Textbox1’ overlap. Overlapping report items are not supported in all renderers." In Reporting Services 2005, these textboxes would display in an overlapped fashion, often causing the text within both textboxes to be unreadable. In Reporting Services 2008, however, the second textbox shifts, so that it appears the textboxes are vertically next to each other. This allows you to always read the text in both textboxes.

The new overlap rendering functionality is included in the "Soft Page-Break Renderers", including the Report Preview window, HTML, MHTML, Word, and Excel. Taking a look at the report in the Report Preview pane will give you a pretty good idea of how the report will look in HTML. I did not find this to be the case for the "Hard Page-Break Renderers", including Acrobat (PDF) format.

If you do have overlapping report items, the item to the "front" of the report will be rendered above the item to the "back" of the report. You can take advantage of this by right-clicking on the item and selecting either the option "Bring to Front" or "Send to Back" for the desired result.

For more information on how rendering works in SSRS 2008, I would recommend visiting this page: http://technet.microsoft.com/en-us/library/bb677573(SQL.100).aspx

Salı, Haziran 01, 2010

Visual Studio 2010 – Microsoft Report Raporlarına Resim Ekleme

Hem kurumsal hem de kobilere uygulama geliştiren yazılım geliştiricileri göz önüne aldığımızda en çok uğraştıkları alan sqlden veri çekip bu veriler üzerinde işlem yapmaktır. Bu işlemlerin büyük bir çoğunluğu da satış verilerinin raporlanması ve sunulması üzerinedir. Bir önceki yazımızda Microsoft Report yardımı ile hızlıca bir raporu nasıl hazırlayabileceğimizi incelemeye çalışmıştıktık. Bu yazımızda ise tablo içerisinde sunmuş olduğumuz verilerden gelen değerlere göre resim eklemek için neler yapabileceğimizi incelemeye çalışıyor olacağız.

Şöyle bir senaryo üzerinden anlatmak gerekirse, bir firma elinde var olan satışları dönemsel olarak karşılaştırmak istiyor. Eğer ki iki dönem arasında elde edilen sonuç negatif ise eksi yönde bir resim, pozitif yönde ise artı yönde bir resmin gösterilmesi gerekecektir. Ya da başka bir örnek üzerinden düşünürksek bir ürünün stok durumu takip ediliyor ve veriler var ya da yok şeklinde gösteriliyor. Ancak raporu kontrol eden insanlar o metin kalabalığının arasında bir de var/yok şeklinde metin aramak yerine varsa bunu gösteren bir simge, yoksa da yine aynı şekilde bunu gösteren bir simgenin olmasıni istemektedir ki bu isteğinde oldukça haklıdır. Yine bu durumda gelen değere göre resim eklenebilmesi mümkündür. O zaman şimdi hızlıca bir önceki raporun görüntüsünü hatırlayalım ve resmi nasıl ekleyebileceğimizi hızlıca öğreniyor olalım.

mak94_1

Resim ekleme işlemine başlayabiliriz. Öncelikli olarak RDLC rapor dosyasını veri nesnelerinin yer aldığı ReportData Toolbar 'ına gidiyor ve Image klasörünün üzerinde sağ tıklama ile resim ekle diyoruz.

mak94_2

Kullanacak olduğumuz ikonları seçeceğimiz ekran karşımıza çıkacaktır. Buradan istediğimiz ikonları seçenebiliriz.

mak94_3

ReportData kısmında resimleri gördükten sonra gerekli işlemleri yapmaya başlayabiliriz.

mak94_4

Şimdi yapmamız gereken Discontinued kolonunda expression değer kısmına resimlerden birini sürüklüyoruz.

mak94_5

Bu işlem sonrasında karşımıza bilgilendirme ekranı çıkacak. Buradan da fx düğmesine bastığımızda da karşımıza expression girebileceğimiz bir ekran çıkacaktır. Bu ekranda hangi durumda hangi resmin görüntüleneceğini belirtiyoruz.

mak94_6

=IIf(Fields!Discontinued.Value = True, “discontinued_icon”, “available_icon”)
mak94_7

İşlemler sonrasında raporu kaydettiğimizde Discontinued yazan kısımda artık burada resmin gösterileceğini belirten ufak bir ikonunu yer aldığını görüyor olacağız.

mak94_8

Şimdi ise görünecek olan resmin boyutunu sabitleyerek tasarımsal bir sorun ile karşılaşmamak için yapmamız gereken bir kaç işlem var. Bunun için resimin üzerine sağ tıklama yapıyor özellikler ekranından değerlerini aşağıdaki gibi düzenliyoruz.

mak94_9

İstersen Border kısmında resimlere kenarlık belirtebilmemiz mümkündür.

mak94_10

Yapmış olduğumuz işlemler sonrasında raporun düzenlenmesi tamamlanmıştır. Bakalım görsel olarak görüntüsü istediğimiz gibi olabilmiş mi?

mak94_11

Evet. İstenen sonuç oldukça tatmin edici.

Sonuç olarak bu yazımızda Microsoft Report raporlarında gelen verinin durumuna göre bunları resim ile nasıl gösterebileceğimizi incelemeye çalıştık.

Umarım sizler için yararlı olabilmiştir.

Turhal Temizer

info@turhaltemizer.com

Pazartesi, Mayıs 31, 2010

Visual Studio 2010 – Asp.Net ile Microsoft Report Kullanımı

Hem kurumsal hem de kobilere uygulama geliştiren yazılım geliştiricileri göz önüne aldığımızda en çok uğraştıkları alan sqlden veri çekip bu veriler üzerinde işlem yapmaktır. Bu amaçla da en sık yapılan işlem elde bulunan mevcut verilerin raporlanması ve bunların Excel, Word, PDF v.b. formatlarda sunumlarının yapılmadır. Zaman içerisinde ilerleyen istekler doğrultusunda raporların istendiği an görüntülenip çıktılarının alınması gibi isteklerde olacaktır. Bu isteklere yanıt verebilmek için ise, SQL Server Reporting Services aracını kullanır ve özel istekleri spesifik olarak karşılayan raporlar hazırlanır. SSRS üzerinde uygulama geliştirilmek istediğinde bu aracın özelliklerine hakim olmak ve istekleri sql procedure 'leri yardımı ile oluşturup bunları kullanabilmek gibi işlemlerin yapılması gerekiyor. Ek olarak bu konu ayrı bir uzmanlık alanıdır. Ancak bilişim sektöründe yazılımcılardan bu konular üzerinde de bilgi sahibi olmaları ve geliştirme yapabilmeleri beklentisi bulunmaktadır. İşte biz bu noktada SSRS 'in biraz daha basitleşmiş ancak SSRS 2005 sürümünden daha yetkin olan Visual Studio 2010 üzerindeki Report şablonunu kullanarak asp.net üzerinde görüntüleyebilmek mümkündür. Bizde *.RDLC rapor tiplerini asp.net üzerinde kullanmak için ne gibi işlemler yapılması gerektiğini ve nasıl entegre edebileceğimizi incelemeye çalışacağız.

İşlemlere başlamadan önce Visual Studio 2010 IDE 'sini .Net Framework 4.0 sürümünü kullandığımızı belirtmekte yarar var.

mak93_1

Projeyi oluşturduktan sonra veri ile ilgili sınıf ve entity 'leri içerisinde barındıracak olan DAL isimli klasör oluşturuyoruz.

mak93_2

Örnek üzerinde kullanacak olduğumuz veri Northwind satış verileri olacaktır. Erişmek için ise Ado.Net Entity Framework Data Model 'i kullanıyor olacağız.

mak93_3

Generate from Database seçeneğine seçerek işlemlere devam ediyoruz.

mak93_4
Karşımıza çıkacak olan ekrandan Northwind veri tabanına erişmeyi sağlayacak olan veri bağlantısını hazırlayıp bir sonraki adıma geçiyoruz.

mak93_5

Sıra kullanacak olduğumuz tabloları seçmeye geldi. Kullanacak olduğumuz tablolar, kategoriler, ürünler ve satıcılar olacaktır. Bu üçünü seçip işlemlere devam ediyoruz.

mak93_6

Sihirbazın adımlarını sonlandırarak Ado.Net Entity Framework Data Model içerisine eklenmiş olan tabloları ve elemanlarını kontrol ettikten sonra uygulamayı bir kez derliyor ve işlemlerimize devam ediyoruz.

mak93_7
Artık veri tabanına erişmek için gerekli tabloları kullanabilir duruma geldik. Şimdi ise yapmamız için veri transferi için sınıfları oluşturmak olacaktır. Bu işlemler esnasında tablolar içerisinde kullanacak olduğumuz elemanları Business Entity olarak tanımlıyor olacağız.

Adım adım sınıfları oluşturmaya başlayalım. Veri ile ilgili sınıfların DAL klasörünün içerisinde bulunacağından bahsetmiştik. ProductViewModel isimli sınıfı ekliyor ve içeriğine aşağıda yer alan kod parçasını ekliyoruz.

public class ProductViewModel
{
    public int? ProductID { get; set; }
    public string ProductName { get; set; }
    public System.Nullable<decimal> UnitPrice { get; set; }
    public string CategoryName { get; set; }
    public int? CategoryID { get; set; }
    public int? SupplierID { get; set; }
    public bool Discontinued { get; set; }
}

Müşteri bilgisini daha sonra dropdownlist içerisinde kullanmak amacıyla SuppliersViewModel isimli sınıf oluşturuyoruz.

public class SupplierViewModel
{
    public string CompanyName { get; set; }
    public int SupplierID { get; set; }
}

CategoryViewModel sınıfını ekliyoruz.

Public class CategoryViewModel
{
    public string CategoryName { get; set; }
    public int CategoryID { get; set; }
}

IProductRepository isimli arayüz oluşturuyoruz. Bu arayüz ile entity model içerisinde yer alan objelere erişerek sorgular hazırlayarak bütün veriye ulaşmayı sağlayacağız.

interface IProductRepository
{
    IQueryable<Product> GetProducts();
    IQueryable<ProductViewModel> GetProductsProjected(int? supplierID, int? categoryID);
    IQueryable<SupplierViewModel> GetSuppliers();
    IQueryable<CategoryViewModel> GetCategories();
}

IProductRepository arayüzünü implement edecek ProductRepository isimli bir sınıf oluşturuyoruz ve arayüzün elemanlarına aşağıdaki görevleri yapacak olan kod parçalarını ekliyoruz.

GetProducts() - Bütün ürün bilgisini döndürecek
GetProductProjected() - SupplierID ve CategoryID 'ye göre filtrelenmiş veri döndürecektir.
GetSuppliers() - Satıcı verisini döndürecektir.
GetCategories() - Kategori bilgisini döndürecektir.

using System.Linq;

namespace NorthwindReports.DAL
{
    public class ProductRepository:IProductRepository
    {
        #region IProductRepository Members

        public IQueryable<Product> GetProducts()
        {
            var dataContext = new NorthwindEntities();
            var products = from p in dataContext.Products
                                 select p;
            return products;
        }

        public IQueryable<ProductViewModel> GetProductsProjected(int? supplierID, int? categoryID)
        {
            var projectedProducts = from p in GetProducts()
            select new ProductViewModel
                           {
                               ProductID = p.ProductID,
                               ProductName = p.ProductName,
                               UnitPrice = p.UnitPrice,
                               CategoryName = p.Category.CategoryName,
                               CategoryID = p.CategoryID,
                               SupplierID = p.SupplierID,
                               Discontinued = p.Discontinued
                           };
            if (supplierID.HasValue)
                projectedProducts = projectedProducts.Where(a => a.SupplierID == supplierID);

            if (categoryID.HasValue)
                projectedProducts = projectedProducts.Where(a => a.CategoryID == categoryID);

            return projectedProducts;
        }

        public IQueryable<SupplierViewModel> GetSuppliers()
        {
            var dataContext = new NorthwindEntities();
            var suppliers = from s in dataContext.Suppliers
                                  select new SupplierViewModel
                                  {
                                      SupplierID = s.SupplierID,
                                      CompanyName = s.CompanyName
                                  };
            return suppliers;
        }

        public IQueryable<CategoryViewModel> GetCategories()
        {
            var dataContext = new NorthwindEntities();
            var categories = from c in dataContext.Categories
                                   select new CategoryViewModel
                                   {
                                       CategoryID = c.CategoryID,
                                       CategoryName = c.CategoryName
                                   };
            return categories;
        }

        #endregion
    }
}

Bu sınıfıda hazırladıktan sonra DAL içerisinde yapacak olduğumuz işlemleri tamamlamış oluyoruz. Şimdi klasörün içerisine bir göz atalım hangi sınıflarımız oldu.

mak93_8
Raporları ekleyecek olduğumuz ve daha sonrasında da çağıracağımız RDLC isimli bir dosya kullanıyoruz. Bu dosyanın üzerinde sağ tıklama yaptıktan sonra rapor şablonları arasında yer alan Report Wizard şablonu yardımı ile raporu hazırlamaya başlıyoruz.

mak93_9

Karşımıza çıkan ekranda DataSet Name kısmına "ProductDataSet", DataSource kısmına "NorthwindReports.DAL" kullanacağı metodu ise ProductRepository(GetProductProjected) seçimlerini yaparak işlemlere devam ediyoruz.

mak93_10

Gösterilecek olan verileri Values bölümüne sürükleyip bırakıyoruz.

mak93_11

Sıradaki ekranda herhangi bir işlem yapmamıza gerek yoktur. Bu ekran raporun görünümünün nasıl olacağına ilişkin ufak bir görünüm sunmaktadır.

mak93_12

Raporu, eğer ki hazır stillerden birini seçerek kullanmak isterseniz işlemleri bu ekran üzerinden yapılır.

mak93_13

Artık raporun ön tasarımını hazırlamış bulunuyoruz. Şimdi üst ve alt bilgi ekleme işlemleri için boş bir kısımda sağ tıklama sonrasında aşağıdaki ekranı çıkarıyor ve alt, üst bilgi ekle seçeneklerini seçerek işlemlere devam ediyoruz.

mak93_14

Alt ve üst bilgilere textbox v.b. kontroller ekleyebiliriz.

mak93_15

Eklemiş olduğumuz bu kontrollerin ve verilerin gözükecek olduğu tablo üzerinde tasarımsal değişiklikler yapabiliriz. Bunun için üst kısımda yer alan formating toolbar işimizi görecektir.

mak93_16

TextBox 'ların içerisine yalnızca sabit veriler değil, değişken verilerinde eklenebilmesi mümkündür. Bunun için üzerinde sağ tıklama yaptıktan sonra Expression... seçeneği yardımı ile karşımıza çıkan ekranda başında "=" olacak şekilde kod parçacıklarını ekleyebiliriz.

mak93_17

Verilerin gösterileceği tabloda yer alan textbox lar üzerinde görünüm ile ilgili değişiklikler yapılabilmesi mümkündür. Örneğin UnitPrice değeri paradır ve bu değerin yanında o ülkenin para değerinin gözükmesi gerekmektedir. Bu işlemi yapabilmek için üzerinde sağ tıklama yaparak Text Box Properties seçeneğini seçiyoruz.

mak93_18

Sonrasında Number tabı içerisinde yer alan kategorilerden Currency 'i seçip işlemi tamamlıyoruz.

mak93_19

Raporları yalnızca tablo içerisinde veriler ile değil, grafiksel olarakta sunabilmemiz mümkündür. Bunun için Toolbox içerisinden Chart kontrolünü rapor ekranına sürüklememiz yeterli olacaktır.

mak93_20

Rapor kontrolünü sürüklediğimizde bizden ne tür arayüzde bir rapor istediğimize ilişkin bir seçim yapmamızı isteyecektir.

mak93_21

Sonrasında eklenen grafiğin hangi koordinatında hangi verinin olacağına ilişkin bilgiyi giriyor olacağız. Bunun için Report Data içerisinden UnitPrice ve CategoryName alanlarını sürüklüyoruz.

mak93_22
Koordinatların daha düzgün gözükebilmesi için grafiğin boyunu genişletiyoruz.

mak93_23

Görmüş olduğumuz seri doğrularının görsel görünümlerini değiştrebilmemiz mümkündür. Bunun için üzerinde sağ tıklama yaptıktan sonra Series Properties seçeneğini tıklıyoruz. Sonrasında Fill tabını seçiyor ve aşağıdaki görsel görünümü uyguluyoruz.

mak93_24

Sıradaki adım aspx dosyaya raporun görüntelenmesi için ReportViewer kontrolünü ekliyoruz.

<div>
    <asp:ScriptManager ID="smScriptManager" runat="server">
    </asp:ScriptManager>
    <div id="searchFilter">
        Filtre : Kategori :
        <asp:DropDownList ID="ddlCategories" runat="server" />
        ve Satıcı:
        <asp:DropDownList ID="ddlSuppliers" runat="server" />
    </div>
    <rsweb:ReportViewer ID="rvProducts" runat="server">
    </rsweb:ReportViewer>
</div>

Sayfa içerisinde değişiklik yaptıktan sonra görünümü aşağıdaki gibi olmuştur.

mak93_25

Sonrasında rapor ekranının boyutunu düzenliyoruz.

mak93_26

ReportViewer 'in veriyi göstereceği rapor dosyasını seçiyor sonrasında da choos Data Source ile düzenleme yapıyoruz.

mak93_27

Yeni bir DataSource seçeneğini seçiyoruz.

mak93_28

Object veri bağlantısı seçeneğini seçiyoruz.

mak93_29
ProductRepository iş nesnesini seçiyoruz.
mak93_30

Bir sonraki ekrandan GetProductProjected metodunu seçiyoruz.

mak93_31

Sonrasında supplierID ve categoryID 'yi Control olarak belirleyip ddlCategories kontorlüne bağlıyoruz.

mak93_32

Benzer işlemi supplier dropdownlist 'i için de hazırlıyoruz. Sonrasında bu iki bileşenin SelectedIndexChanged olaylarına aşağıdaki kod parçasını ekleyerek geliştirme sürecini tamamlıyoruz.

protected void ddlCategories_SelectedIndexChanged(object sender, EventArgs e)
{
    rvProducts.LocalReport.Refresh();
}

protected void ddlSuppliers_SelectedIndexChanged(object sender, EventArgs e)
{
    rvProducts.LocalReport.Refresh();
}

Bu işlemler sonrasında raporu hazırlamış bulunuyoruz.

Bu yazımız boyunca veri katmanını oluşturup, RDLC raporunu ekleyip, grafik ile görselleştirdikten sonra web sayfasına nasıl ekleyip kullanabileceğimizi incelemeye çalıştık.

Umarım sizler için yararlı olabilmiştir.

Turhal Temizer

info@turhaltemizer.com