cub-e.net

just coding...

Using Singleton Design Pattern to Call Dynamics CRM Web Service

Using Singleton Design Pattern to Call Dynamics CRM Web Service

About this article, we will develop a code part which is to keep under control that our own created web service connection will be just one time in the memory and always accessible in the application life cycle. We will apply the Singleton Design Pattern to web service call method that is required for this job.

As you know Dynamics CRM 2011 edition (as well as other Dynamics CRM editions) is a web application, if we want to develop our own software is to use its web services. In this case we have to consider the performance of IIS, and we need to develop our practices accordingly. During each transaction in our application to invoke a web service and our own applications as well as IIS unnecessarily causes swelling so that’s why we need to create unique web service connection in the memory and have to access it all the time. That the Singleton Design Pattern can provide it.

Before beginning to develop our own code, I would like to give more information about Design Patterns. In software engineering, a design pattern is a general reusable solution to a commonly occurring problem in software design. A design pattern is not a finished design that can be transformed directly into code. It is a description or template for how to solve a problem that can be used in many different situations. Object-oriented design patterns typically show relationships and interactions between classes or objects, without specifying the final application classes or objects that are involved.

Design patterns were originally grouped into the categories: creational patterns, structural patterns, and behavioural patterns, and described using the concepts of delegation, aggregation, and consultation. 

  • Creational Design Patterns: Creational patterns are ones that create objects for you, rather than having you instantiate objects directly. This gives your program more flexibility in deciding which objects need to be created for a given case.

  • Structural Design Patterns: These concern class and object composition. They use inheritance to compose interfaces and define ways to compose objects to obtain new functionality.

  • Behavioural Design Patterns: Most of these design patterns are specifically concerned with communication between objects.

Now, I can begin to explain “Singleton Design Pattern” which is in "Creational Patterns Group”. The singleton pattern is one of the best-known patterns in software engineering. Essentially, a singleton is a class which only allows a single instance of itself to be created, and usually gives simple access to that instance.

ClassName objectName = new ClassName();   // Standart implementation

in that way we can create a lot of instance of ClassName class, but simply we don’t want it, we need a class which is responsible for creating and maintaining its own unique instance.

It requires a mechanism to access the singleton class member without creating a class object and a mechanism to persist the value of class members among class objects. The singleton pattern is implemented by creating a class with a method that creates a new instance of the class if one does not exist. If an instance already exists, it simply returns a reference to that object. To make sure that the object cannot be instantiated any other way, the constructor is made private so we cannot use standard implementation. Implementation also use a public static property instance as the means of accessing the instance. Note the distinction between a simple static instance of a class and a singleton: although a singleton can be implemented as a static instance, it can also be lazily constructed, requiring no memory or resources until needed. Another notable difference is that static member classes cannot implement an interface, unless that interface is simply a marker. So if the class has to realize a contract expressed by an interface, it really has to be a singleton.

Finally, our structure will be like this:

ClassName objectName = ClassName.MethodName();  // Standart way to call a static method

Standart UML of Singleton Design Pattern:


But I simply convert it to this :

I’m creating the attributes and methods which I need to apply;

 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; }

        }

 

_serviceInstance property, which is consisting form Service object, actually do all the work. We are looking to it for decide our next action. IOrganizationService is one of instance of Dynamics CRM service object – it is an interface. Our goal is prevent to call repeatedly the formation stage of this object. ControlID were created to looking at how many times we have observed an instance of Service Object with the same id in the system. LockObject completely thought out for the future if you use multithreaded logic, it prevent you from experiencing distress variable. Because the singleton pattern must be carefully constructed in multi-threaded applications. If two threads are to execute the creation method at the same time when a singleton does not yet exist, they both must check for an instance of the singleton and then only one should create the new one.

After the basic needs section, we will start to placement process include the phrase in the right place of code that will do the actual job. I wrote the following block into my Singleton class - that is created with Singleton Design Pattern methodology, I’m going to want to run once for every time.

ClientCredentials clntCredentials = new ClientCredentials();

            clntCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("username", "password", "domain");

            Uri orgUri = new Uri("http://crm url/Organization Name/XRMServices/2011/Organization.svc");

            OrganizationServiceProxy orgService = new OrganizationServiceProxy(orgUri, null, clntCredentials, null);

            _organizationService = (IOrganizationService)orgService;

Next step is to create the code which is check the memory to this service is created before this call. I’m using attributes which are created before to checking and controlling process.

public static Service GetService()

        {

            try

            {

                if (_serviceInstance == null)

                {

                    lock (_lockObject)

                    {

                        if (_serviceInstance == null)

                            _serviceInstance = new Service(Guid.NewGuid());

                    }

                }

 

                return _serviceInstance;

            }

So, In conclusion we have this code block;

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("username", "password", "domain");

            Uri orgUri = new Uri("http://crm url/Organization Name/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;

            }

        }

    }

That’s all. We are ready to check. Now, I’m creating a sample console application to check all this process.

     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();

My main goal is to access Service object that is created from instance of CRM Organization Service. In this screenshot, you can clearly see that Service is created in the memory just one time. How is I know? Because ControlID value have same GUID.

Sum of this we can call this GetService() method from everywhere of code but service connection will open only one time.

Baris KANLICA
Dynamics CRM MVP
http://www.mawens.com/aboutme.aspx

 

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 !!!

Bahçeşehir Üniversitesi Dynamics CRM Semineri

15 Mayıs Çarşamba günü saat 10:30 - 12:30 arasında Bahçeşehir Üniversitesinde "CRM, XRM Kavramları ve Dynamics CRM" konulu bir seminer vereceğim. İçerik ise şu şekilde olacak; Dünya’da uzun yıllardır konuşulan CRM “Müşteri İlişkileri Yönetimi” kavramı müşterimizin neleri sevdiğini, neye para harcadığını ve neleri yapmaktan hoşlandığını kısacası bize müşterimizin kim olduğu gösteren temeller üzerine oturmuştur. XRM sadece müşteri değil onun haricinde dış dünyada yönettiğimiz varlıkların bize kim/ne olduğunu  göstermektedir. İşte bu seminerde Microsoft Dynamics CRM’in bu iki kavramın ortasına nasıl oturduğunu ve programatik olarak nasıl geliştirilebileceği anlatılacaktır.

Microsoft Dynamics CRM, adındaki CRM ibarisi nedeniyle sadece Müşteri İlişkileri departmanlarını ilgilendiren bir yazılım olarak anlaşılmaktadır. Aslında Dynamics CRM bir platfomdur ve üzerinde sizin şekillendirdiğimiz bir çok altyapıya destek verebilir. Örneğin aynı Dynamics CRM Ağaoğlu'nda gayrimenkul satış platformu olarak kullanılabilirken Levent'teki Sapphire İstanbul'daki evlerin yönetiminin merkezine oturtulmuştur. Yine aynı Dynamics CRM IKEA'nın Online Satış sisteminin yönetiminde kullanılırken Öztürkler için ise B2B Satış Portalı olarak da kullanılabilmektedir. Ele alınan örneklerde görüldüğü üzere Dynamics CRM tam bir iş platformudur ve esnek mimarisi sayesinde her türlü iş uygulamasının temelini oluşturabilme yeteneğine sahiptir.

Dynamics CRM ile İnşaat ve Gayrimenkul Satış Yönetimi

Yarın Microsoft'ta yapılacak olan etkinliğimize herkesi bekleriz. Özellikle Dynamics CRM'in bir XRM platformu olarak farklı sorunlara nasıl çözüm olduğunu görmek isteyen kişiler için çok önemli bir etkinlik olacak.
Yaptığımız çözüm genel hatları ile şu özellikleri kapsamakta; İnşaat firmalarının gayrimenkul havuzlarını ayrıntılı segmentasyon kriterleri ile birlikte tanımlamaları ve bu segmentler doğrultusunda filtreleyerek raporlayabildikleri, satış işlemlerini tüm aşamaları ve sözleşme, senet gibi finansal süreçlerini de tam entegre bir şekilde kulanabildikleri inşaat şirketleri için özelleştirilmiş tüm süreçlerini içeren konsolide bir CRM yazılımı olan Gayrımenkul satış platformunu bu etkinliğimizde detaylı olarak inceleyebilir, konunun uzmanlarından detaylı bilgi edinebilirsiniz.

Etkinliğe kayıt için lütfen linke tıklayınız : https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032547495&culture=tr-TR