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

Perşembe, Mayıs 20, 2010

Silverlight Business Application – WCF RIA Services

Web uygulamaları günler geçtikte daha bir görsel ve daha bir işlevsel olmaktadır. Bu gelişmenin Microsoft gerçekleşmesini sağlayan teknoloji ise Silverlight 'tır. Başlarda basit animasyon işlemleri yaparken şu anda WCF servisleri ile validation kontrolleri ile ve diğer bir çok özelliği ile Asp.Net uygulamalarına alternatif olarak düşünebilir seviyeye gelme yolunda son sürat ilerlediğini gözlemliyoruz. Bu süreçlerin ilerlemesi ile iş uygulamalarında da Silverlight düşünülmeye başlanmıştır. Bildiğiniz üzere Asp.Net MVC Framework yardımı ile veri, nesne ve görsel katmanları ayrı ayrı kullanabilmemize olanak tanıyan bir şablon ile karşımıza gelmektedir. Bu uygulama şablonunda özellikle Entity katmanı yardımı ile veri işlemleri üzerinde yapacak olduğumuz işlemleri rahatça yapılabilmesi mümkündür. Silverlight Business Application yardımı ile de hazır bir şablon gelmekte ve işleri kolaylaştırabilmektedir. Silverlight Business Application hakkında temel bilgi ve proje şablonu hakkında bilgi edinmek için burada yer alan yazıdan yararlanabilirsiniz.

Silverlight Business Application, WCF RIA servisleri yardımı ile veri işlemlerini domain servisler ile uyumlu bir şekilde gerçekleştirebilmesi mümkündür ki alt yapısı da bu entegrasyon üzerine kurulmuştur. Biz de bu yazımızda WCF RIA servislerini kullanarak veri üzerinde ekleme, silme ve gösterme işlemlerini inceliyor olacağız.

Not: WCF RIA servisleri konusunda ayrıntılı bilgi edinmek için buradan yararlanabilirsiniz.

Silverlight Business Application Silverlight 3 ve 4 araçları içerisinde yer alan iş süreçlerine uyumluluğu olan bir proje şablonudur. Yeni bir proje oluşturulurken kullanıcı üyelik, sisteme giriş, windows authentication yardımı ile sisteme giriş yapabilme, ana sayfa gibi temel yapıları bünyesinde katmansal bir yapı ile bulundurduğu için tercih edilebilecek oldukça güzel bir proje şablonudur. Şimdi adım adım basit bir örnek üzerinde neler yapabileceğimize incelemeye başlayalım.

Not: Geliştirilecek olan uygulama, Visual Studio 2010 üzerinde Silverlight 4 kurulu bulunan bir bilgisayar üzerinde yapılacaktır. Ayrıca veri tabanı sunucusu olarak SQL Server 2008 Express Edition kullanılıyor olacak. Uygulama esnasında kullanılacak olan veri tabanını buradan indirip kendi veri tabanı sunucusunuza ekleyip kullanabilir ve yazı içerisinde yapılan örnekleri benzer veriler ile uygulayabilirsiniz. Dosyanın boyutu 3 mb 'dir.

Uygulama geliştirirken Entity Framework ve WCF RIA Domain servisi kullanıyor olacağız. Visual Studio üzerinde yeni proje oluştur diyip Silverlight proje sablonları arasından Silverlight Business Application 'ı bulup projemizi oluşturuyoruz.

mak92_1

Karşımıza Silverlight ve web projesi olmak üzere içerisinde iki proje olan şablon ile açılmaktadır.

mak92_2

Projeyi oluşturduktan sonraki bir diğer adım WCF RIA Servisini uygulama hangi projeden link alarak kullanacağıdır. Bu amaçla Silverlight projesinin özellikler ekranında bu özelliğin aktif olup olmadığını kontrol ediyoruz.

mak92_3

Web projesine WCF RIA Servisi linkini vererek kullanıcı tarafında domain servislerinin kullanılabilmesini de aktif duruma getirmiş oluyoruz. Bu sayede entity framework ile gösterecek olduğumuz verileri web uygulamasını referans göstererek her yerde kullanabilmemiz mümkün olacaktır. Peki, geliştirilecek olan uygulamalarda WCF RIA servisi kullanmanın ne gibi avantajları olacaktır.

Katmansal uygulamalarda geliştirme kolaylığı, .Net ile geliştirilen uygulamaların sunucu-kullanıcı arasındaki etkileşimi sağlamayı kolaylaştırır.
Varlıkların karşılıklı paylaşılması, Model sınıfları, doğrulama (Validation) kuralları ve diğer veri ilişkileri
Kullanıcı tabanlı destekleyiciler, Otomatik veri eşlemeleri, sayfalama, güncelleme, değişiklik takibi

şeklinde temel faydalarını kısa başlıklar altında sıralayabiliriz.

 mak92_4

Web sunucusunu Domain Service ve Model 'den oluşmaktadır. Model Entity Modelinden oluşur ve içerisinde CRUD işlemleri olarak adlandırılan create,read,update ve delete işlemlerini barındırır. Domain Services ise Entity Data model 'de bulunan işlemlerin aktarılmasında yer alır. İşleyiş mantığı ise Silverlight kullanıcısından alınan verilerin model katmanı ile hangi yöne yönleneceğinin belirlenmesi ile gerekli veri mesajları Domain Context 'e iletilir. Buradan işi asıl yapacak olan web sunucusuna verilerin aktarılması işi ise WCF ile yapılmaktadır.

RIA Domain servielerininin temel olarak sağladıkları aşağıdaki gibidir.
WCF Servisleri, Bütün WCF özellikleri kullanılabilir. Servis referansları eklenebilir.
Özelleştirilmiş taban sınıfları, LinqToEntities (Ado.Net Entity Data Model), LinqToSQL (Linq To SQL Data Model) ve Authentication bazlı sınıfların oluşturulabilmesi.

WCF RIA servisleri yalnızca verilerin taşınması değil aynı zaman gösterilmesini sağlamaktadır. Proje içerisine eklenmiş olan DomainServise gösterilen veri modelini veri kaynağı olarak gösterdikten sonra oluşan objeleri silverlight formlar üzerine sürükle bırak yöntemi ile GridView görünümünde verilerin gösterilebilmesi ve düzenlenebilmesi olanağı vardır. Ayrıca bu grid içerisinde ListBox, Combox gibi kontrollerin kullanılabilmesi mümkündür. Ayrıca grid üzerinde gösterilmekte olan verileri düzenlenmesi anında Silverlight 'ın sağladığı bütün kontrollerin kullanılabilmesi olanağı da vardır. Peki ne tür veri kaynakları kullanabiliriz. Silverlight Business Application 'da WCF RIA servislerinin dışında .Net uygulamaları geliştirirken kullanılan bütün veri kaynaklarının kullanılabilmesi mümkündür. Tavsiye ise daha önceden açıkladığımız sebeplerden ötürü WCF RIA servisleridir.

Yapmış olduğumuz kısa tanımlamalar, açıklamalar ve uygulama içerisinde WCF RIA servislerinin link edildiğini görmemizin sonrasında uygulamamızı geliştirmeye başlayabiliriz.

RIA servislerinden bu kadar bahsettikten sonra öncelikli olarak web projesinin içerisinde services klasörünün içerisinde yer alan Domain Services sınıflarına göz atalım. İlk etapta iki tane sınıf bulunmaktadır. Bunlar, Authentication ve UserRegistration servisleridir. Bu sınıflarda gerekli servislerin içlerinde User nesnesini kullanarak kullanıcıların sismete giriş yapma veya kayıt olma işlemlerini yapabilmeleri mümkündür. Şimdi uygulamayı çalıştırarak oluşturulan login ve yeni kullanıcı formlarına hemen göz atalım.

mak92_5

Kullanıcı giriş ekranı ise,

mak92_6

şeklindedir. Daha önceden vermiş olduğumuz linkte yer alan veri dosyasını web uygulamasında yer alan App_Data klasörüne ekleyerek sonrasında da Server Explorer içerisinde tablolara bakarak veri dosyasının doğru olarak eklendiğini kontrol ediyoruz. Sonrasında ise veri modelini oluşturmamız gerekmektedir. Bu amaçla Ado.Net Entity Framework ten yararlanacağız. Web projesine yeni bir öğe ekle seçeğini kullanarak ADO.NET Entity Data Model 'i seçerek adımları tamamlıyoruz. Tablo kısmında aşağıda yer alan resimdekileri eklememiz yeterli olacaktır.

mak92_7

Bu adımdan sonra Entity Model tanımlanmış oluyor. Sonrasında sorunsuzca çalışması ve eklenen DLL 'lerin temp dosyalarının oluşması için bir kere uygulamayı derliyor ve sonrasında adımlarımıza devam ediyoruz. Şimdi uygulamaya Domain Service sınıfını ekleyeceğiz. Bunun için web uygulamasında services klasörünün üzerinde sağ tıklama yapıyoruz ve yeni bir öğe ekle diyoruz. Sonrasında web tabının içerisinde yer alan Domain Service Class ekliyoruz. Sonrasında bizden veri kaynağımıza ilişkin kullanacağımız tabloları seçmemizi isteyecektir. Bu ekranı aşağıdaki şekilde hazırlıyoruz.

mak92_8

İşlemi tamamladıktan sonra EventManagerDomainService.cs ve EventManagerDomainService.metadata.cs isimli iki dosya oluşturmaktadır. Metadata dosyasının içerisinde tablolarda yer alan öğelerin nesnesel olarak metotlarda özellikleri yer alır. EventManagerDomainService içerisinde ise metadata içerisinde yer alan nesnelerden yararlanarak hazırlanmış olan CRUD işlemlerinin yapılacağı metotlar yer almaktadır.

Sıra işin biraz daha görsek kısımlarına geldi. Verileri göstermek için gerekli altyapıyı hazırladık. Şimdi bu verileri kullanarak son kullanıcıya değerler göstermemiz gerekmektedir. Bunun için Silverlight uygulamasının içerisinde Views klasörünün içerisinde yer alan Home.xaml ekranından yararlanıyor olacağız. Bu sayfayı açtıktan sonra data menüsünün altında yer alan Show Data Source 'a tıklayarak WCF RIA servisleri ile gelen veri kaynaklarını görüntüleyebiliriz.
mak92_9

Eklemiş olduğumuz tablolar veri kaynağı kısmında bizim kullanımızı hazır olarak beklemektedir.

mak92_10

EventManagerDomainContext içerisinde yer alan objelerin üzerine inceleme yaptıysanız GridView şeklinde hazırlanmış olduğunu ve direk kullanılabilir durumda olduğu dikkat çekmektedir. Bize bu durumda yalnızca form üstüne bunlardan herhangi birini sürükleyip verileri görüntelemek kalıyor. Bu yazımızda örnek olarak Event nesnesini kullanıyor olacağız.

mak92_11

Veri gösterme işini başarılı bir şekilde başardık. Sıradaki işlemimiz ise bu veriler üzerinde düzenleme yapmak için neler yapamamız gerektiği olacaktır.

Düzenleme işleminin yapılabilmesi için öncelikli olarak Views klasörüne yeni bir sayfa ekliyor olacağız. Silverlight Business Application ile örneği yaparken sayfaların navigation page olduğu dikkatinizi çekmiştir. Bunun amacı asp.net ve mvc 'den alışık olduğumuz  URL Routing 'e benzer bir yapı içermesinden ve sayfalar arası geçişin URI yardımı ile rahatlıkla yapılabilmesinden kaynaklanmaktadır. Şimdi düzenleme yapacağımız sayfayı ekleyebiliriz. Eklemiş olduğunuz sayfanın <navigation:Page ile başladığını görüyor olacaksınız.

Şimdi ana amacımız grid üzerinden seçilen kaydın değerlerini güncellemektir. Bu işlemi yapabilmek için de seçili olan satırın ID 'sine ulaşıp bu değeri taşımamız gerekmektedir. Bu amaçla formun üzerine bir adet buton ekliyoruz. Butonun içerisinde ID 'den yararlanarak başka bir sayfaya yönlendirecek ve değerleri güncelleyeceğiz. Butonu form üzerine ekledikten sonra üzerine tıklanması anında yapılacak olayları aşağıdaki gibi belirtiyoruz.
private void editEventButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
    Event selectedEvent = eventDataGrid.SelectedItem as Event;
    if (selectedEvent != null)
    {
        int eventId = selectedEvent.EventID;
        NavigateToEditEvent(eventId);
    }
}

private void NavigateToEditEvent(int eventId)
{
    Uri target = new Uri("/EditEvent?EventID=" + eventId, UriKind.Relative);
    NavigationService.Navigate(target);
}
YYapmış olduğumuz işlemler yardımı ile Event tablosunun içerisinde yer alan değerlerden seçili olanın ID 'sini yakalayıp EditEvent sayfasına o ID 'den yararlanaraj gerekli yönlendirmeyi yapıyoruz. Şimdi hızlıca yönlendirme işleminin sorunsuzca olup olmadığını test etmek için uygulamayı seçip kontrol edelim.

mak92_12

Sayfayı sorunsuzca yönlendirdik. Şimdi ise bu gelen ID yardımı ile verileri gösterip düzenleme işlemini nasıl yapabileceğimize göz atacağız. EditEvent sayfasına geliyoruz ve Data Source kısmına göz atıyoruz. Verileri gösterirken Event tablosunun içeriğini kullandık ve bu bize otomatik olarak GridView yardımı ile gerçekleştirmiştik. Şimdi aynı işlemi Event tablosunun içerisinde yer alan kolonların detaylarını göstererek yapmak gerekecektir. Bu amaçla Event tablosunun yanında açılan DropDownList 'in içerisinde Detail seçeneğini seçiyor ve EditEvent sayfasına tabloyu sürüklüyoruz.

mak92_13

Detay kısmına getirdikten sonra form üzerinde sürüklediğimizde bize form kontrollerinden oluşan bir şablon çıkacak ve bunlar iki yönlü olarak veriye bağlanmış olacaktır. Sürükleyip bıraktığınızda karşınıza çıkacak olan şablon aşağıdaki gibi olacaktır.

mak92_14

Sırada yapmamız gereken bu formun içeriğini doldurabilmek amacıyla QueryString'ten yararlanarak EventId 'yi yakalamak ve sonrasında ekrana eklemiş olduğumuz buton ile güncelleme işlemini gerçekleştirmektir.

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    string eventIdString = NavigationContext.QueryString["EventID"];
    int eventId;
    if (int.TryParse(eventIdString, out eventId))
    {
        eventDomainDataSource.FilterDescriptors.Add(
            new FilterDescriptor
            {
                Operator = FilterOperator.IsEqualTo,
                PropertyPath = "EventID",
                Value = eventId
            });
    }
}

private void saveChangesButton_Click(object sender, RoutedEventArgs e)
{
    eventDomainDataSource.SubmitChanges();
}

QueryString ile yakaladığımız EventID 'yi filtre olarak kullanıp sonrasında içerik filtreleme yardımı ile EventID değerine eşit olan değerleri gösteriyoruz. Sonrasında ise Entity Framework 'un güzelliklerinden yararlanarak değişiklikleri kaydet diyerek işlemi tamamlıyoruz. Sonrasında uygulamayı çalıştırıp düzenleme işlemlerini yapıp değiştir dediğimizde yapmış olduğumuz değişikliklerin uygulandığını görmüş oluruz.

mak92_15
Düzenleme işlemlerini nasıl yapabileceğimizi incelemiş olduk. Şimdi ise yeni bir kaydı nasıl ekleyebileceğimizi incelemeye çalışacağız. Yeni bir kayıt eklerken yine Entity katmanından yararlanıyor olacağız. Ayrıca form üzerine var olacak kontrollere önceden bir kaç ön bilgi girerek daha anlaşılır olmasını sağlayacağız. Örneğin tarih kısmında <01.01.2010> gibi örnek bir değer olacaktır.

İşlemlerimize öncelikle bir kayıt ekle butonunu home.xaml sayfasına ekleyerek başlıyoruz. Sonrasında eklemiş olduğumuz tıklanması anındaki olayına aşağıdaki kod parçasını ekliyoruz.

private void newEventButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
    DateTime nowDate = DateTime.Now;
    Event newEvent = new Event
    {
        EventTitle = "<Yeni Aktivite>",
        EventVenueName = "<Yer>",
        EventDescription = "<Açıklama>",
        EventStartDate = nowDate,
        EventEndDate = nowDate
    };

    var ctx = new EventManagerDomainContext();
    ctx.Events.Add(newEvent);
    ctx.SubmitChanges(createOP =>
    {
        NavigateToEditEvent(newEvent.EventID);
    }, null);
}

Entity içerisinde bulunan Events koleksiyonuna varsayılan olarak gösterilecek değerleri ekledikten sonra WCF RIA servisi olarak eklemiş olduğumuz EventManagerDomainContext 'ten yararlanarak yeni kayıt eklenmesi için gerekli işlemleri ekledik. Ayrıca kayıt eklenmesi için gerekli formu aktivite düzenlemek için kullandığımız forma yönlendirmek için NavigateToEditEvent metodunu kullanarak gerekli yönlendirme işlemini gerçekleştirmiş oluyoruz.

Not: EventManagerDomainContext farklı isimler ile projenizin içerisinde bulunabilir. Bu tanımlamayı doğru olarak öğrenebilmek için DataSources tabının içerisinde yer alan veri kaynaklarına bakarak öğrenebilirsiniz.

mak92_10

Yaptığımız işlemler sonraında yeni kayıt girme ekranının nasıl gözüktüğüne hızlıca göz atalım.

mak92_16

Sonuç olarak bu yazımızda Silverlight Business Application proje şablonunda WCF RIA servislerini nasıl kullanabileceğimizi temel CRUD işlemleri üzerinde incelemeye çalıştık.

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

Turhal Temizer

info@turhaltemizer.com

Pazartesi, Mayıs 17, 2010

Silverlight Business Application – Nedir?

Web uygulamaları günler geçtikte daha bir görsel ve daha bir işlevsel olmaktadır. Bu gelişmenin Microsoft gerçekleşmesini sağlayan teknoloji ise Silverlight 'tır. Başlarda basit animasyon işlemleri yaparken şu anda WCF servisleri ile validation kontrolleri ile ve diğer bir çok özelliği ile Asp.Net uygulamalarına alternatif olarak düşünebilir seviyeye gelme yolunda son sürat ilerlediğini gözlemliyoruz. Bu süreçlerin ilerlemesi ile iş uygulamalarında da Silverlight düşünülmeye başlanmıştır. Bildiğiniz üzere Asp.Net MVC Framework yardımı ile veri, nesne ve görsel katmanları ayrı ayrı kullanabilmemize olanak tanıyan bir şablon ile karşımıza gelmektedir. Bu uygulama şablonunda özellikle Entity katmanı yardımı ile veri işlemleri üzerinde yapacak olduğumuz işlemleri rahatça yapılabilmesi mümkündür. Silverlight Business Application yardımı ile de hazır bir şablon gelmekte ve işleri kolaylaştırabilmektedir. Birazdan bu detaylara değineceğiz. Ancak öncelikle Silverlight Business Application içerisinde yer alan katmansal yapıya bir göz atalım.

mak90_1 
mak90_2 
mak90_3
Silverlight Business Application temel olarak Validation Framework ve Forms Toolkit 'in katmansal olarak ilişkisi sonucunda oluşturulmuş bir proje şablonudur. Silverlight Validation Framework web uygulamalarından alışık olduğumuz  verilerin doğrulanması işlemleri Silverlight Business Application için de yapılabilmesi mümkündür. Yapmış olduğu kontrol listesi aşağıdaki gibidir.

•AlphaNumeric
•Alpha
•Between (Generic)
•Date
•Digits
•Email address
•Equals (Generic)
•Float
•GreaterThan (Generic)
•InArray (Generic)
•Integer
•LessThan (Generic)
•NotEmpty
•Regex
•StringLength
•Url

Silverlight Forms Toolkit ise Silverlight içerisinde yer alan kontroller ve bunlara ek olarak gelen şablonlar olarak mimari yapıda yer almaktadır.

Business Application şablonunun standart Silverlight proje şablonundan farkı hazır klasör yapıları ile gelmesinden öte System.Windows.RIA ve System.Windows.RIA.Controls DLL 'lerinin referans edilmiş olmasıdır.

Silverlight Business Application ile gelen proje şablonunu kısaca incelemek gerekirse, Silverlight 3 ve 4 sürümleri ile kullanılabilmektedir. http://silverlightbusiness.codeplex.com adresi üzerinden sürümler arasında yapılan değişiklikleri ve son yeniliklerin takip edilebilmesi mümkündür. Silverlight 4 toolkit 'i sisteminize kurduktan sonra Silverlight proje şablonları arasında yer alır ve kullanıma hazır bir şekilde bizleri bekler.

mak90_4
Projeyi oluştur dedikten sonra karşımıza bir tane silverlight bir tane bu uygulamanın gösterileceği asp.net uygulaması oluşturulur. Silverlight uygulaması içerisinde iş süreçlerinde kullanmış olduğumuz katmansal yapıdan yararlanılarak klasörleme ve basit olarak sayfa şablonları yer almaktadır.

mak90_5

Verileri Silverlight içerisindeki verileri web uygulaması ile entegre kullanabilmek ve web uygulamasına eklenmiş olan entity katmandan yararlanabilmek için DomainServicesClass 'ı yani WCF RIA 'yı kullanmaktadır. Bunun sorunsuzca gerçekleştiğini doğrulabilmek için eklenmiş olan Silverlight projesi üzerinde sağ tıklama yaptıktan sonra özellikler ekranında WCF RIA Services link başlığı altında yer alan listede istediğimiz projeyi seçebiliriz. Varsayılan olarak Silverlight uygulamasının web uygulaması seçili olarak geliyor olacaktır.
mak90_6
WCF RIA Servisleri yardımı ile sunucu-kullanıcı arasında ki köprünün de kurulduğuna ilişkin veri doğruması yaptıktan sonra hazırlanmış olan Business Application sablonunu çalıştırarak nasıl bir görünüme sahip olduğuna göz atalım.

mak90_7

Sayfa üzerinde yer alan login linkine tıkladığınızda karşınıza giriş için gerekli olan kullanıcı adınızı ve şifrenizi girmenizi isteyen animasyonlu bir sayfa açılıyor olacaktır.

mak90_8

Eğer ki sisteme kayıtlı değil iseniz kendinizi kayıt ediyor olmanız gerekmektedir. Bunun için ise Register Now linkini tıklayarak açılan ekranda bilgilerinizi girerek kayıt işlemini tamamlayabilmeniz mümkündür.

mak90_9

Eğer ki kullanıcı adı ve şifre olmadan direk Windows kullanıcı ile girmek istersek Authentication modu Windows olarak değiştirmemiz yeterli olacaktır. Bunun web.config içerisinde yer alan Authentication kısmında form yerine Windows olarak belirtmek ve App.XAML dosyasında yer alan App() metodu içerisinde aşağıdaki değişiklikleri yapmak yeterli olacaktır.

public App()
{
    InitializeComponent();

    WebContext webContext = new WebContext();
    //webContext.Authentication = new FormsAuthentication();
    webContext.Authentication = new WindowsAuthentication();
    this.ApplicationLifetimeObjects.Add(webContext);
}

Bu işlemeler sonrasında uygulamaya Windows Authenticationdan yararlanarak login olduğumuz kullanıdığımız kullanıcı ile web uygulamasını da kullanabilmemiz mümkün olacaktır. Bu yazımızda basitçe Silverlight Business Application uygulamasına ilişkin kavramları incelemeye çalıştık. Bir sonraki yazımızda WCF RIA Servisleri yardımı ile veri gösterme, ekleme ve güncelleme işlemlerine göz atarak yazı serimize devam ediyor olacağız.

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

Turhal Temizer

info@turhaltemizer.com