cub-e.net

just coding...

Dynamics CRM Seminer Dizisi

Dynamics CRM 2013 versiyonu artık yayında bildiğiniz üzere, hatta 2013 üzerinde birçok proje live olmaya bile başladı bile. Peki siz Dynamics CRM nedir biliyor musunuz? Microsoft'un en çok para yatırdığı platformlardan biri olan Dynamics ailesini ne kadar tanıyorsunuz? Dynamics CRM nasıl bir yazılım platformu olarak kullanılır biliyor musunuz? işte bütün bu sorulara cevap verecek üstüne 2011 ve 2013 veriyonlarını öğreneceğiniz güzel bir web seminerleri dizisi başlatmaktayım. Aşağıda detayları bulabilirsiniz.

19 Aralık Perşembe Saat 10:00 : Dynamics CRM Nedir? Ne işe Yarar?

   Seminere giriş linkimiz : https://www.livemeeting.com/cc/mvp/join?id=MVP4025099&role=attend&pw=hq.%27SG%28c3

23 Aralık Pazartesi Saat 10:00 : Dynamics CRM 2011 ve 2013 Versiyonlarındaki Farklılıklar.

   Seminere giriş linkimiz : https://www.livemeeting.com/cc/mvp/join?id=MVP4025099&role=attend&pw=p%60dG4%40ChR 

27 Aralık Cuma Saat 10:00 : Dynamics CRM 2013 ile Yazılım Geliştirme.

Facebook event adresine bu linkten ulaşabilirsiniz : https://www.facebook.com/events/432791460180088/

 

 

Microsoft Dynamics CRM 2011 Scripting Cookbook

Bugün sizlere bir kitap tanıtacağım. Umarım sizler için faydalı olur.

"Microsoft Dynamics CRM 2011 Scripting Cookbook" okuyucuya özelleştirme mimarisi, en basit konulardan başlayarak özel alanların ve türlerin oluşturulması, formlar ile çalışma, ileri düzeyde script yazma konuları ve kodu debug etme, yeni formlar ve ribbonlar dizayn etme, script kütüphanlerinin kullanımı ve dış veri kaynakları ile entegrasyon dahil olmak üzere özelleştirme çerçevisinde her konuyu örnekleriyle açıklayacak anlatmaktadır.



Kitabı bitirdiğinizde kendi özelleştirmenizi nasıl yapacağınızı kavramış ve bunları artık nasıl bir çözüm(solution) haline getirebileceğiniz anlatılmaktadır.

Bu kitap iş analizcileri ve kod geliştiricileri için gerçekten yeterli bir kaynak. Konular gerçekten güzel bir mantık sırasında anlatılmış ve açıklanmış. Örnekler de gayet açıklayıcı ve doyurucu bir şekilde konuları pekiştirmiş.

Dynamics CRM konusunda piyasada gerçekten önemli bir yere geçecek faydalı bir eser olmuş. Nicolae Tarla'yı tebrik etmek gerekli.

Kitabın kağıt haricinde her türlü cihaz için dijital baskıları da mevcut.

Kitaba amazon.com üzerinden bu adresten ulaşabilirsiniz : http://www.amazon.com/Microsoft-Dynamics-2011-Scripting-Cookbook/dp/1849688826/ref=tmm_pap_title_0

Ayrıca yayınevi üzerinden de ulaşabilirsiniz : http://www.packtpub.com/microsoft-dynamics-crm-2011-scripting-cookbook/book

 

Dynamics CRM Web Servisinin Çağrılmasında Singleton Tasarım Desenin Kullanılması

Aslında bu makalenin büyük bir kısmını 2009 yılında yazdım ama hatırlayamadığım bir nedenden dolayı o dönemde yarım kaldı ve unutuldu gitti. Şimdi fırsat buldum ve makaleyi tamamladım. (O zamanlar CRM 4.0 vardı şimdi kodları 2011 ve 2011'den sonraki versiyonlar göre uyarladım)

Bu makalemizde, programımızın yaşam döngüsü boyunca sadece bir Dynamics CRM Web Servisi bağlantısının hafızada yer almasını garanti altına almamızı sağlayacak olan Singleton tasarım desenini tanıyacağız ve bu iş için gerekli olan kodu geliştireceğiz.

Bildiğiniz üzere Dynamics CRM 2011 diğer CRM sürümleri gibi bir web uygulaması ve CRM üzerinde kendi yazılımlarımızı geliştirmek istiyorsak onun web servislerini kullanmamız gerekmektedir. Bu durumda IIS'in performansını da düşünmek zorundayız ve uygulamalarımızı buna göre geliştirmeliyiz. Uygulamamızda her işlem sırasında CRM web servisini çağırmak hem uygulamamızın hem de IIS'in gereksiz yere şişmesine neden olmaktadır. Ayrıca CRM servisi IOrganizationService türünden bir nesne ve bizim temel amacımız bu nesnenin hafızanda birden fazla kere oluşturulmasını ve oluşturma zahmetine girilmesini engellemek. Çünkü ben bu örnekte kodların içerisine gömmüş olsam dahi gerçek dünyada projelerde bizler servise bağlanılacak kullanıcı adı ve şifre gibi bilgileri .xml dosyaları gibi dosyalarda tutup buradan okumaktayız. Bir application life cycle içerisinde bu bilgileri okumak için çok sık I/O yaptırmak çok doğru bir işlem değil.

İşte bu durumda uygulamamız çalıştığı sürece açık kalacak ve bizim komutlarımızı icra edecek bir web servisi nesnesine ihtiyacımız olacaktır. Bunu Singleton Tasarım Deseniyle (Singleton Design Pattern) bunu sağlayabiliriz.

Singleton Tasarım Desenine geçmeden önce Tasarım Desenleri'nin ne olduğunu bilmeyenler için açıklayayım. Yazılım Mühendisliğinde içerinde ele alınan Tasarım Deseni (Design Pattern) kavramı, yazılım geliştirilirken sık meydana gelen sorunlara genel ve tekrar kullanılabilir çözümler bütünü olarak tanımlanabilir. Tasarım desenleri size direkt olarak kod üretmez sadece belirli bir problemin çözümüne mimari düzeyde sınıf ve method tasarımlarınızı oluşturmanızı sağlar. Herhangi bir kod parçacığı içermediği için programlama dilinden bağımsızdırlar. Kısaca Design Pattern koda çevrilebilecek tamamlanmış bir tasarım değildir, sorunun nasıl çözüleceğine dair bir modeldir. Tasarım desenleri test edilmiş, onaylanmış modeller sağlayarak yazılım geliştirme sürecini hızlandırabilirler. Tasarım Desenleri 3 kola ayrılırlar.

  • Creational Patterns (Yaratımsal Desenler) : nesnelerin ve sınıfların oluşturulması ile ilgili tasarım desenlerini içerir
  • Behavioral Patterns (Davranışlar Desenler) : sınıfların yapısal özelliklerinin belirlenmesi ile ilgili tasarım desenlerini içerir
  • Structural Patterns (Yapısal Desenler) : nesnelerin davranışsal özelliklerini ve bu davranışlara göre durumlarını yöneten tasarım desenlerini içerir

 

Yazılım geliştiriciler bazen programlarında özel olarak tasarım desenlerini kullanmasalarda aslında onlarda benzer yapılar kurarlar. Zaten tasarım desenlerine baktıkları zaman, "ya zaten ben bunu kullanıyordum.." gibi cümleleri de duymak mümkündür. Eminim benim burada anlatmaya çalışacağım Singleton Tasarım Desenini ve bu desendeki gibi CRM Web Servisine bağlanmayı yapmış arkadaşlar mutlaka vardır.

Şimdi "Creatinal Patterns" grubunda bulunan "Singleton" desenini açıklamaya başlayabiliriz. Singleton deseni bir programın yaşam süresince belirli bir nesneden sadece bir örneğinin olmasını sağlar. Bir uygulamada, tek bir yerden bu nesneye ulaşımın olması isteniyorsa bu desen kullanılabilir. Hatırlayacağınız üzere bir sınıftan yeni bir nesne oluşturmak için varsayılan yapıcı metodu(default constructor) çağırmak gerekir. C# dilinde bu işlemi new sözcüğünü kullarak yapmaktayız.

SınıfAdı olustrulacakNesne = new SınıfAdı();  //Normalde olması gerekn çağırma şekli

Bu şekilde yeni bir nesne oluşturmak için new anahtar sözcüğünün temsil ettiği yapıcı metoduna dışarıdan erişimin olması gerekir. Yani yapıcı metodun public olarak bildirilmiş olması gerekir. Ancak "Singleton" desenine göre belirli bir anda sadece bir nesne olabileceği için new anahtar sözcüğünün ilgili sınıf için yasaklanması gerekir yani yapıcı metodun protected ya da private olarak bildirilmesi gerekir. Eğer bir metodun varsayılan yapıcı metodu(default constructor- parametresiz yapıcı metot) public olarak bildirilmemişse ilgili sınıf türünden herhangi bir nesnenin sınıfın dışında tanımlanması mümkün değildir. Ancak bizim isteğimiz yalnızca bir nesnenin yaratılması olduğuna göre ilgili sınıfın içinde bir yerde nesnenin oluşturulması gerekir. Bunu elbette statik bir özellik(property) ya da statik bir metotla yapacağız. Bu statik metot sınıfın kendi içinde yaratılan nesneyi geri dönüş değeri olarak bize gönderecektir. Peki, bu nesne nerede ve ne zaman yaratılacaktır? Bu nesne statik metodun ya da özelliğin içinde yaratılıp yine sınıfın private olan elemanına atanır. Tekil olarak yaratılan bu nesne her istendiğinde eğer nesne zaten yaratılmışsa bu private olan elemanın referasına geri dönmek ya da nesneyi yaratıp bu private değişkene atamak gerekmektedir.

Ama bizim yapacağımız şu şekilde olacaktır:
SınıfAdı olusturulacakNesne = SınıfAdı.MetodAdı(); //Standart bir static class çağırma şekli

Temel Uml görüntümüz ise şöyle olacaktır:

Ama ben bu yapıya ek birkaç şey daha ekleyerek aşağıdaki şekilde bir sınıf hazırladım.

Temelde ihtiyacım olan property’leri kod bloğunun üst kısmında aşağıda görüldüğü gibi oluşturuyorum.

private static Service _serviceInstance;
private IOrganizationService _organizationService;
private Guid _controlID;
private static object _lockObject = new object();

public IOrganizationService OrganizationService
{
    get { return _organizationService; }
}

public Guid ControlID
{
    get { return _controlID; }
}

Burada Service türünden oluşan _serviceInstance isimli property aslında bütün işi yapan arkadaş. Biz onun dolu ya da boş olduğuna yani null olup olmamasına bakarak hareket edeceğiz. IOrganizationService daha önce de ifade ettiğim gibi Dynamics CRM’in servis nesnesi. Amacımız onun oluşturulma aşamasının tekrar tekrar çağrılmasını engellemek. ControlID sistemde oluşan instance’ların aynı id’ye sahip olup olmadıklarına bakarak onların kaç kere oluşturulduklarını gözlemlediğimiz değişken. lockObject ise tamamen ilerisi için düşünülmüş ve multithread mantıkta sıkıntı yaşamamızı engellemek için konmuş bir değişken.

 

Temel ihtiyaçlar bölümünden sonra asıl işimi yapacak olan kod öbeğini doğru yere yerleştirme işlemi bulunmakta. Aşağıdaki blok benim her zaman için bir kere çalıştırmak isteyeceğim blok işte bu bloğu Singleton tasarım deseni içerisinde private olarak ayarlanmış Constructor metodumun içine yerleştiriyorum.

ClientCredentials clntCredentials = new ClientCredentials();
clntCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("kullanıcı adı", "şifre", "domain");
Uri orgUri = new Uri("http://crm url/Organizasyon Adı/XRMServices/2011/Organization.svc");
OrganizationServiceProxy orgService = new OrganizationServiceProxy(orgUri, null, clntCredentials, null);
_organizationService = (IOrganizationService)orgService;

Daha sonra static olarak çağrılacak ve mevcut servisimin hafıza daha önceden oluşturulup oluşturulmadığını kontrol edecek yapıya geliyor sıra. Onun için de kodun üst kısmında tanımlamış olduğum property’ler vasıtasıyla kontrollerimi yapıyorum.

        public static Service GetService()
        {
            try
            {
                if (_serviceInstance == null)
                {
                    lock (_lockObject)
                    {
                        if (_serviceInstance == null)
                            _serviceInstance = new Service(Guid.NewGuid()); 
                    }
                }

                return _serviceInstance;
            }

 

Burada şunu belirtmeliyim ki lock bölümüne aslında normal şartlar altında ihtiyacım bulunmamakta o bölüm ileride bu sistemi multithread olarak kullanırsam servisinin ayrı instance’lar tarafından tekrar oluşturulmasını engellemek için konan bir kod bloğu.

Ve hepsini bir araya topladığımızda aşağıdaki kod bloğu karşımıza çıkmakta.

    class Service
    {
        private static Service _serviceInstance;
        private IOrganizationService _organizationService;
        private Guid _controlID;
        private static object _lockObject = new object();

        public IOrganizationService OrganizationService
        {
            get { return _organizationService; }
        }

        public Guid ControlID
        {
            get { return _controlID; }
        }
        
        private Service(Guid controlID)
        {
            ClientCredentials clntCredentials = new ClientCredentials();
            clntCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("kullanıcı adı", "şifre", "domain");
            Uri orgUri = new Uri("http://crm url/Organizasyon Adı/XRMServices/2011/Organization.svc");
            OrganizationServiceProxy orgService = new OrganizationServiceProxy(orgUri, null, clntCredentials, null);
            _organizationService = (IOrganizationService)orgService;
            _controlID = controlID;
        }

        public static Service GetService()
        {
            try
            {
                if (_serviceInstance == null)
                {
                    lock (_lockObject)
                    {
                        if (_serviceInstance == null)
                            _serviceInstance = new Service(Guid.NewGuid()); 
                    }
                }

                return _serviceInstance;
            }
            catch (Exception ex)
            {
                string ErrorDetail = ExceptionHandler.HandleException(ex);
                DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
                    + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString()
                    + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error);

                return null;
            }
        }
    } 

İşte bu kadar herşey hazırlandı. Şimdi bu kodu çağıracak olan kodu hazırlamaya geldi sıra. Bunun için de bir konsol uygulaması oluşturuyorum ve aşağıdaki kodları ekliyorum.

            Service service1 = Service.GetService();
            Console.WriteLine(service1.ControlID);

            Service service2 = Service.GetService();
            Console.WriteLine(service2.ControlID);

            Entity lead = new Entity("lead");
            lead.Attributes["subject"] = "Fuardan Gelenler";
            lead.Attributes["firstname"] = "Barış";
            lead.Attributes["lastname"] = "KANLICA";
            lead.Attributes["companyname"] = "Omerd Business Solutions";

            service1.OrganizationService.Create(lead);

            Console.WriteLine("Lead created!!");
            Console.ReadLine();

Burada yaptığımız temel işlem Service türünden oluşturduğumuz nesnenin içindeki CRM’in OrganizationService nesnesine ulaşmak. Aşağıdaki ekran çıktısında da göreceğiniz üzere servis sadece bir kere oluşmakta. (Nereden mi biliyorum bakın iki service nesnesi de aynı ControlID değerini Guid olarak döndürmekte)

Eğer isterseniz başka classlar içerisinde de service nesnelerinin çağırabilirsiniz her seferinde tek bir oluşturma işlemi olacak ve sistem kaynaklarını daha verimli kullanmış olacağız.

Seminer Duyurusu : Microsoft Dynamics CRM Nedir?

Bir seminer vakti daha geldi. Yarın sizlere Dynamics CRM'in aşağıda sıraladığım 4(3 modül+1 genişleme) temel özelliğinin nasıl işlediğini anlatacağım. Seminer 23.11.2013 saat 10:00'da olacaktır.

Dynamics CRM 2011 kendinden önce gelen sürümlerde de olduğu gibi 3 temel modül üzerine oturmuş bulanmaktadır.

Sales Automation : Bütün satış süreçlerinizi en temel ihtiyaçlarınızdan başlayarak karmaşık yatay ve dikey satış stratejilerine varana kadar kolay ve hızlı bir biçimde yönetmenizi sağlar. Bu bölümde müşteri kavramı üzerine oturtulmuş 360 derecelik görünüm müşterinizin sizinle olan bütün temas noktalarını göz önüne serecek ve doğru zamanda doğru hamleyi yapmanız için size yol gösterecektir. 
Daha detaylı bilgiye şu linkten ulaşabilirsiniz : http://crm.dynamics.com/en-us/sales 
Video için ise bu linke bakabilirsiniz : http://uscrmdynamics.cloudapp.net/demos/Dynamics-CRM-2011-Driving-Sales-Productivity/CRM-2011-Driving-Sales-Productivity.html

Marketing : Potansiyel ve mevcut müşterilerinizi elde tutmak için hazırlanmış bu modülde pazarlama kampanyalarınızı, fuarları, pazarlama aktivitelerinizi yönetebilir bunları karşılaştırabilirsiniz. Böylece size en faydalı sonucu üreten pazarlama sürecinizi bulup bunun üzerine yoğunlaşabilirsiniz. Pazarda ürünüzün konumunu ve rakiplerle olan durumlarınızı da gözlemleyip buna göre bir sonraki hamlenizi planlayabilirsniz.

Daha detaylı bilgiye şu linkten ulaşabilirsiniz : http://crm.dynamics.com/en-us/marketing
Video için ise bu linke bakabilirsiniz : http://uscrmdynamics.cloudapp.net/demos/Dynamics-CRM-2011-Maximizing-Marketing-Impact/CRM-2011-Maximizing-Marketing-Impact.html

Customer Service : Müşterilerinize verdiğiniz servis ve hizmetleri kolayca yönetip ölçeklendirebileceğiniz bu bölüm Dynamics CRM içerisindeki birlikte çalışma özelliğini de ön plana çıkarmaktadır. Sahada gezen yada yerleşik servis hizmeti veren bütün firmaların ihtiyaçlarını karşılayacak şekilde dizayn edilmiştir. Böylece hızlı ve seri bir şekilde müşterinize hizmet sunmayı kolaylaştırabilirsiniz. 
Daha detaylı bilgiye şu linkten ulaşabilirsiniz : http://crm.dynamics.com/en-us/customer-service
Video için ise bu linke bakabilirsiniz : http://uscrmdynamics.cloudapp.net/demos/Dynamics-CRM-2011-Optimize-Customer-Experience/CRM-2011-Optimize-Customer-Experience.html

Bu bölümler haricinde bir de CRM Extended özelliğinden söz etmek gerekir. Dynamics CRM'i diğer yazılımlardan ayıran en büyük özelliği genişleyebilir bir mimariye sahip olmasıdır. Kısacası bizler CRM üzerinde iş gereksinimlerinize uygun nesneleri ya da alanları açıp bunu CRM içinde gelen bir parçaymış gibi kullanmanızı sağlayabiliyoruz. Bu özellik sayesinde CRM sadece yukarıda bahsettiğimiz işlevleri yerine getirmenin yanısıra sizin tam işinize uygun bir şekilde şekil değiştirebilmektedir. Bu özellik sayesinde Dynamics CRM'in kullanıldığı bütün firmalarda benzersiz bir hale bürünmekte ve o firmanın ihtiyaçlarına cevap verecek bir hale gelmektedir.
Extending özelliği hakkında daha fazla bilgiye bu linkten ulaşabilirsiniz : http://crm.dynamics.com/en-us/extended-crm

İşte bu özellikleri sayesinde Dynamics CRM firmanızın ihtiyaçlarına göre şekillenir ve işinizi yönetmede size yardımcı olur. Dynamics CRM 2011 en iyi iş platformudur !!!

Microsoft Dynamics CRM 2011 Eğitimi

Application ve Customization Eğitimlerini bitirdik. Extending eğitimden sonra yeni bir eğitim daha ekledik : Installation & Administering. Bu eğitim ile kurulum ve sistem yönetimin detaylarını inceleyeceğiz. Detaylar http://egitim.omerd.com adresinde...

Omerd ve Microsoft işbirliğiyle Microsoft Dynamics CRM’i daha yakından tanıma fırsatı!
Microsoft tarafından Türkiye’de 5 yıl boyunca CRM MVP seçilen Barış Kanlıca'nın eğitmenliğinde; Microsoft Dynamics CRM Entegre Yazılım Geliştirme, Kurulum ve Sistem Yönetimi konularınınlaboratuvar ortamında interaktif bir şekilde ele alınacağı eğitim paketini sunarız. Eğitim, katılımcı ihtiyacına göre Entegre Yazılım Geliştirme, Kurulum ve Sistem Yönetimi paketlerinden bir ya da birkaçının seçilebilmesine olanak vermektedir. Kurulum ve Sistem Yönetimi Eğitimi 2 gün, Entegre Yazılım Geliştirme Eğitimi 3 gün olarak planlanmıştır.

CRM
CRM
CRM
CRM

Microsoft Dynamics CRM 2011 Eğitimi

Bu sefer sizlere bir eğitim haberim var. Eğitim ile ilgili detaylı bilgiyi http://egitim.omerd.com adresinden detaylı bilgi alabilirsiniz.

Omerd ve Microsoft işbirliğiyle Microsoft Dynamics CRM’i daha yakından tanıma fırsatı!
Microsoft tarafından Türkiye’de 5 yıl boyunca CRM MVP seçilen Barış Kanlıca'nın eğitmenliğinde; Microsoft Dynamics CRM Uygulama, Özelleştirme, Entegre Yazılım Geliştirme konularının, laboratuvar ortamında interaktif bir şekilde ele alınacağı 7 günlük bir eğitim paketini sunuyoruz.
Eğitim, katılımcı ihtiyacına göre Uygulama, Özelleştirme, Entegre Yazılım Geliştirme paketlerinden bir ya da birkaçının seçilebilmesine olanak vermektedir.  Uygulama Eğitimi 2 gün, Özelleştirme Eğitimi 2 gün, Entegre Yazılım Geliştirme Eğitimi 3 gün olarak planlanmıştır.