cub-e.net

just coding...

Microsoft Dynamics Workshop - CRM Development Tickets, Manchester | Eventbrite

I'm one of presenter of this event. Please join us :)
More details here : bit.ly/1KGCxtp

ORGANISED BY
CRM Consultants UK
Event Description
The Objectives of the CRM User / Developer Group is to tackle issues related to overcoming common business obstacles when implementing CRM Business solutions.

This Month Microsoft CRM MVP Boris will be giving a presentation on how dynamics CRM can be extended and developed to provide XRM Solutions for various Industry requirements, and go beyond customer relationship management.

Razwan ( Microsoft Dynamics Solutions Architect) will then explore new features of CRM 2015 and SDK enhancements and open the floor and workshop for further dialogue related to technologies for business automation and analytics
WHEN
Saturday, 13 June 2015 from 18:00 to 20:00 (BST) 
WHERE
SpacePortX - 24-26 Lever Street Manchester, Gt Man M1 1DZ GB

Plug-in'i Debug Etmek

CRM 2015 icerisinde yazmis olduğumuz bir plug-in’i debug etmenin iki temel yolu bulunmakta. Birinci yol calisan sisteme visual studio ile attach olarak yapilan, ikinci yol ise plug-in profiller kullanmak. Profiller icin Microsoft dokümantasyonlarda plug-in performansini ölçmek icin kullaniliyor dese de aslinda 1. Yöntemden daha saglikli olduğunu söyleyebilirim. Ozellikle Online sistemler icin başka çareniz de yok zaten.

Servis’lere Attach olarak Debug Etme

Plug-in’i sisteme kaydettikten sonra visual studio ile nereye attach olacagimizi seçmemiz gerekmekte.

 

Kayit Ayari

Servis

online

w3wp.exe

offline

Microsoft.Crm.Application.Hoster.exe

asynchronous olarak kaydedilmis plug-in’ler (ya da custom workflow’lar)

CrmAsyncService.exe

sandbox (isolation mode)

Microsoft.Crm.Sandbox.WorkerProcess.exe

 

Online : CRM Web arabirimini

Offline : Outllok Client gibi offline yapidaki yazilimlar

 

Kendimize uygun olan secimi yaptıktan sonra geriye bir tek breakpoint’i seçip attach olmak kaliyor.

 

Visual Studio’yu acip “Attach to Process..” diyoruz.

 


Sonra asagidaki ekran goruntusu gelecek ve ilgili servisi seçeceğiz.

 

 


Asagidaki ekran goruntusunde de goruldugu uzere visual studio ilgili yerde devreye girecek ve bizim kodu debug etmemizi saglayacaktir.


 

Islem bu kadar basit sadece dikkat etmeniz gereken noktalar bulunmakta;

1.       Eger disk’e yaz adimini seçerek plug-in’i sisteme kayit ettiyseniz bu plug-in’in debug modda yeni bir versiyonunu ayni dizine kopyalamak icin plug-in üzerinde calistigi servisi yeniden baslatmaniz gerekir.

2.       Plug-in üzerinde değişiklikler yaptiginizda her seferinde registration tool’u ile güncelleme islemini yapin.

3.       Eger plug-in’i bu sekilde test edip butun işlemleri bitirdiyseniz onu veritabanina kaydetmenizi tavsiye ederim. Disk olarak birakmaniz pek önerilen bir yöntem değildir.

4.       Her ne olursa olsun .pdb uzantili dosyalari assembly klasörü içerisinde birakmayin.

5.       Sandbox içindeki bir plug-in’i debug etmek istiyorsaniz asagidaki registery ayarinin 1 (DWORD) değeri tasidigindan emin olun : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSCRM\SandboxDebugPlugins

Plug-in Profiller’i kullanarak Debug etme

Bu yöntemi kullanmak birçok bakimdan daha avantajli nedeni ise CRM size kullanicinin yaptigi hareketi simule ediyor ve böylece siz bunun üzerinden debug ediyorsunuz. Ayrica ciktilari baskalarina gönderme opsiyonu da bulunmakta. En değerli ozelligi ise plug-in’i derleyip derleyip CRM’e atmak gibi bir derdiniz yok. Yani bir hata mi yakaladiginiz ya da kodun bir yerini mi değiştirmek istiyorsunuz tek yapmaniz gereken degisikligi yapip uygulamaya yeniden bağlanmak ayni kullanici hareketi tekrar simule edilecek ve siz de yaptiginiz degisikligin etkilerini göreceksiniz.

 

Simdi sirasiyla bu işlemi nasil yapacagimiza bakalim. Oncelikle “Plug-in Registration Tool”’u aciyoruz ve işlem yapmak istediğimiz organizasyonu seçiyoruz.

Tool üzerindeki “Install Profiller” düğmesine tikliyoruz. Boylece “Plug-in Profiller”’da listemizde gozukmeye basliyor.

Daha sonra test etmek istediğimiz step’i seçiyoruz ve yine toolbar’da yer alan “Start Profilling” düğmesine basıyoruz. Karsimiza asagidaki gibi “Profiler Settings” ekrani cikiyor.

 

 

Bu adimda iki secenekten birini seçmeniz lazim.

·         Exception: Microsoft, Exception yöntemini önermekte gordugunuz gibi. Bunun anlami ise su kullanici ya da siz plug-in’i tetikledeginizde plug-in calisacak ve sistem size bir hata mesaji gösterecek. Bu hata mesaji içerisinde plug-i debug etmemize yarayacak bilgiler yer alacak. Bu bilgileri almak icin cikan hata penceresinde “Download Log File” düğmesine basmaniz gerekmekte.

 

·         Persist to Entity: Eger ikinci adimi seçerseniz bu sefer butun bilgiler CRM içerisinde bir Entity içerisine yazılacak.

 

Iki adimdan birini seçip plug-in’i tetikleyecek işlemi yaptıktan sonra “Plug-in Registration Tool” içerisinde “Debug” düğmesine tiklamaniz gerekmekte.

 

 

Karsiniza asagidaki gibi bir ekran gelecek. Bu ekran bir önceki seçtiğiniz adima gore iki işlemden birini yapmaniz gerekmekte;

 

Eger “Exception” adimini seçtiyseniz “…”’ya basarak kaydetmiş olduğunuz hata dosyasinin yerini gösterin. Eger “Persist To Entity” adimini seçtiyseniz asagi doğru duran ok düğmesine basiniz. Karsiniza soyle bir ekran cikacak;

 

 

Bu ekrandan kaydettiğiniz profile log’unu seçebilirsiniz.

 

Sonra sirasiyla .dll dosyanizi sisteme gösterin ve debug etmek istediğiniz Plug-in’i secin. Visual Studio’yu acin ve “PluginRegistration.exe” uygulamasina attach olun. Start Execution dugmesina basin ve breakpoint koyduğunuz yerde bekleyin. Bir sure sonra Visual Studio’a beklediğimiz yere gelecek ve bizim debug etmemizi sağlayacak.

 

 


Eger plug-in’de değişiklik yapmaniz gerekiyorsa değişiklikleri yapin ama CRM’e atmayin ilk once biraz önceki adimlari uygulayarak kodu tekrar test edin. Artik koddan eminseniz CRM içerisine gönderebilirsiniz güncellediğiniz .dll’i.

 

Bu arada belirtmeliyim ki asagida “plug-in traces” bolumunden de debug etmeden kodun nasil calistigini izleyebilirsiniz.



Burada icin TracingService ile yazacaginiz mesajlar görüntülenecektir.

IFD Tabanlı Güvenlik Mekanizması Oluşturulması Hakkinda

CRM, ADFS Server kullanarak Security Token Service (STS) mimarisi altında daha fazla güvenlik içeren bir doğrulama mekanizmasına kavuşmaktadır.

Daha pratik bir şekilde anlatmak gerekirse normal şartlar altında kullanıcı internetten bir talepte bulunduğunda güvenlik mekanizmasından geçen talep direkt CRM sunucusuna ulaşmakta ve CRM sunucusu içeride güvenlik kontrolünü yapmaktadır. CRM sunucu DC ve SQL Server ile iletişime geçerek güvenlik kontrolünü yapmakta ve sonucunda kullanıcıya ya hata ya da içeriği döndürmektedir.


Eğer aynı senaryo IFD yapılandırılmış bir CRM için geçerli olsaydı, güvenlik sisteminden (ISA, Firewall) sonra CRM’e ulaşan kullanıcı güvenlik kontrolü için ADFS’e sunucusuna gönderilecek ve burada doğrulama işlemi gerçekleştikten sonra tekrar CRM sunucuna dönülecek ve içeriği iletmesi istenecektir. Eğer kullanıcı bilgileri yanlışsa IFD kullanıcıya hata döndürecektir.

Daha ayrıntılı bakacak olursak;


Görüldüğü gibi 3 adımlı doğrulama mekanizması IFD sayesinde 10 adımlı bir yapıya dönüşmektedir. Bu yüzden IFD CRM sisteminin güvenliğini arttırmaktadır.

IFD’nin bir diğer avantajı ise CRM sistemiyle aynı domainde olmayan kullanıcının sanki domain içinde bir kullanıcıymış gibi sistem üzerinde hareket etmesini sağlamaktadır.

Bu giriş bilgisinden sonra IFD yapılandırmasının adımlarından ve zorunluluklarından bahsedelim. Öncelikle ADFS ile CRM aynı sunucuya kurulabilse dahi bu pek önerilen bir yöntem değildir. Bu yüzden her zaman ADFS sunucusunu ayrı bir sunucu olarak düşünmek en mantıklısıdır.

Adımlar ise şu şekildedir;

1.       CRM standart bir şekilde kurulur.

2.       ADFS 2.0 default web site’da olacak şekilde ADFS sunucusuna kurulur.

3.       *.domainadı.com şeklinde wildcard sertifika alınır ve CRM ve ADFS sunucularına yüklenir.

4.       Sistem kontrol için iki sunucu kullanacağından bu iki sunucuya dışarıdan erişmek gerekmektedir. İstemci tarafından sunuculara erişilirken aşağıda belirtilen subdomain yönlendirmelerin Firewall ve public dns’de yapılmış olması gerekmektedir (Sistem ssl sertifikası kullandığından 443 nolu port düşünülerek işlem yapılmalıdır);

a.       Organizasyonadı.domainadı.com -> CRM sunucusuna

b.      Auth.domainadı.com -> CRM sunucusuna

c.       Dev.domainadı.com -> CRM sunucusuna

d.      Adfs.domainadı.com -> ADFS sunucusuna

e.      İnternalcrm.domain.com -> CRM sunucusuna (bu subdomain sadece sistemin içindeki DNS’de açılacaktır. Diğerleri gibi dış dünyaya açılmayacaktır.)

Yukarıda da görüldüğü gibi dışarıdan erişilmesi gereken 2 sunucumuz olduğuna göre 2 adet ip adresine ihtiyacımız olacaktır subdomainlerin yönlendirilmesi için.

5.      Bu işlemler yapıldıktan sonra CRM sunucusu üzerinde Deployment Manager ile gerekli yapılandırma ayarları yapılmalı

6.      ADFS Sunucu üzerinde de Primary SID, UPN ve AccountName ayarlarının yapılması gerekemektedir.

Eğer bir sistem sağlayıcıyla iş bölümü yapılacaksa sunucuların kurulması, 2. , 3. ve 4. Adımlar bu firma tarafından yapılmalıdır.

Plug-in Registration Tool’u Kullanmak

Ilk plug-in’imizi yazdıktan sonra geldi onu CRM içerisine eklemeye. Bu işlem için Plugin Registration Tool dediğimiz CRM SDK içerisinden cikan bir uygulamayi kullanacagiz. Bu uygulama sayesinde hem plug-in hem de custom workflow’lari CRM içerisine ekleyebilmekteyiz.

 

SDK\Tools\PluginRegistration\PluginRegistration.exe yolu ile ulaşabileceğiniz uygulamayi calistirdiginizda sizden bağlanmak istediğiniz server ile ilgili bilgileri isteyecektir.

 

Dynamics CRM Online için Online’i seçebilirsiniz ama unutmayin ki Office 365 hesabi kullaniyorsaniz Office 365’i seçmeniz gerekmekte. Ikisi de Online ama yetki mekanizmaları farkli.

 

Eger On-Premises yani Microsoft disinda host edilen bir CRM’e erişmek istiyorsaniz o zaman On-Premises seçeneğini seçmeniz gerekmekte. IFD’ler için de bu seçeneği kullanabilirsiniz.


 

Eger “Always display list of available orgs” seçeneğiniz seçerseniz bağlanmak istediğiniz kullanici ile erişebileceğiniz organizasyonlarin listesini görüntüleyebilirsiniz.

Basarili bir sekilde giriş yaptiginizda asagidaki gibi bir ekran karsiniza gelecektir.


 

1.       Plug-in’i sisteme kayit edebilmek için yukarıdaki “Register” düğmesine tikliyoruz ve ardindan “Register New Assembly” ‘ ye tikliyoruz.

2.       Step#1 bolumundeki … düğmesine tikliyarak kayit ettirmek istediğimiz .dll’i seçiyoruz.


          


3.       Step#2 bolumunde kaydetmek istediğimiz plug-in class’ini seçiyoruz.

4.       Step#3 bolumunde 2 tane seçeneğimiz bulunmakta;

a.       Sandbox : Bu seçeneği seçer isek plug-in bir Sandbox içerisinde calisacak yani dis ortamdan izole edilecek. Boylece bu plugin sistem içerisinde calisacak ama sisteme zarar veremeyecek ve izlenebilir olacak. Kisacasi yazdiginiz bir plug-in production ortamina tasimadan once test etmek için bu senecegi kullaniyoruz.

b.      None : hiçbir kisitlama olmadan .dll içerisindeki kodlar icra edilir.

5.       Step#4 bolumunde ise plug-in nerede duracagini seçmemizi istemekte.

a.       Database: tavsiye edilen yöntem budur. Boylece dll işletim sistemi kaynakli sorunlardan izole edilir. Veritabani yedeklendikçe dll de içinde olduğundan yedeklenecektir ve herhangi bir durumda geriye dönmenizi sağlar.

b.      Disk: Sistemin varsayilan dll yerleştirme yeri olan CRM Kurulum Yolu\Server\bin\assembly klasörü içerisinden dll’i okur.

c.       GAC: Global Assembly Cache üzerinden dll’leri okur.


Bu noktada bir not ileteyim eger server üzerinde calisan kodu debug etmek isterseniz yine server\bin\assembly klasörüne .pdb uzantili debug symbol’lerinizi yerleştirmeniz gerekmekte.

 

Ikinci bir not da eger serverda custom code execution kapaliysa açmak için server üzerinde powershell ile su kodlari calistirmaniz gerekmekte:

 

Add-PSSnapin Microsoft.Crm.PowerShell

$setting = get-crmsetting customcodesettings

$setting.AllowExternalCode="True"

 

Degerleri kontrol etmek için bu komutlari calistirabilirsiniz :

set-crmsetting $setting

get-crmsetting customcodesettings

 

Ayarlari tersine çevirmek için “AllowExternalCode”’a “False” değerini vermeniz yeterli.


Butun bu adimlari tamamladıktan sonra “Register Selected Plugin” düğmesine tikliyoruz. Plug-in kaydetmediki ilk adimi gerçekleştirmiş olduk sira diğer adimlarda :)

 

Bu noktada plug-in’i hangi event(ler) için yazdiysak onun için adim(lar) eklememiz gerekiyor. Plug-in anlatirken hep bir olay olduğunda yani veritabanina bir kayit eklendiğinde, silindiğinde ya da bir alani güncellendiğinde tetiklenebilir gibi orneklerle anlatıyoruz ama aslinda olay bundan daha derin gelin simdi custom entity’ler için yani bizim oluşturduğunuz varliklar için sistem üzerinde nasil olaylarin tetiklenmelerini yakalayabiliyoruz. Literaturde bu konu message olarak geçmekte yani CRM eventlarina mesaj adi verilmekte.

 

Message Name

Ownership Type

Message Availability

Entity Supported Deployment

Assign

User-owned entities only

Server

Server

Create

User-owned and organization-owned entities

Both

Server

Delete

User-owned and organization-owned entities

Both

Server

GrantAccess

User-owned entities only

Server

Server

ModifyAccess

User-owned entities only

Server

Server

Retrieve

User-owned and organization-owned entities

Both

Server

RetrieveMultiple

User-owned and organization-owned entities

Both

Server

RetrievePrincipalAccess

User-owned entities only

Both

Server

RetrieveSharedPrincipalsAndAccess

User-owned entities only

Both

Server

RevokeAccess

User-owned entities only

Server

Server

SetState

User-owned and organization-owned entities

Both

Server

SetStateDynamicEntity

User-owned and organization-owned entities

Both

Server

Update

User-owned and organization-owned entities

Both

Server

 

Listede de yer aldigi gibi Retrieve, RetrieveMultiple yani veritababindna sorgulama ya da SetState yani bir kaydin durumun değişmesi gibi birçok farkli mesaj için plug-in’i tetikletebilmekteyiz.

 

Lutfen sunu unutmayin yukarıdaki liste sadece custom entity’ler için campaign, campaignactivity, list gibi entity’ler için farkli mesajlar da mevcut tum listeye SDK içindeki “Message-entity support for plug-ins.xlsx” isimli dosyadan ulaşabilirsiniz.

 

Simdi yeni bir adim ekleyerek bir mesaj için plug-in’imizin tetiklenmesini saglayalim. Bunun için plug-in üzerinde sag tuşa tıklayarak ya da yukarıdaki “Register” düğmesine tıklayarak acilan menüden “Register New Step”’e tikliyoruz. Karsimiza asagidaki gibi bir pencere cikacak:


 

Message:  Yukarida bahsettigim mesajlardan birini buraya yazabilirsiniz. Hangi mesaji yazarsaniz plug-in bu olay icin calisacak. Create/Update gibi mesaj isimleri yazarken otomatik olarak tamamlamaya calistigini göreceksiniz. Her bir mesaj icin ayri step’ler tanimlaniz gerekmektedir.

Primary Entity: Bu plug-in hangi entity yani varlik üzerinde calisacak. Buraya account, contact gibi bir varlik adi yazabilirsiniz.

Secondary Entity: Bu plug-in’i ikinci bir varlik icin tanıtacaksak buraya yazabiliriz.

Event Pipeline Stage of Execution: Bu kisimda plug-in’i pre yani veri veritabanina gitmeden mi calistiracagiz yoksa post yani kaydedildikten sonra mi calistiracagiz bunu seçiyoruz.

Execution Mode: (sadece post da ikisinden birini seçebilmekteyiz) kod senkron yani sistemde kullanici ile etkileşimli ayni anda mi hareket etsin yoksa asenkron yani kullanicidan bagimsiz arka tarafta sessizce mi calissin bunu seciyoruz.

Deployment: Bu kod server da mı calissin yoksa Outlook client gibi offline modda da calissin seçeneğidir.

 

Bu yukarida acikladigim bolumler standart ayarlar. Yani her plug-in step’i tanimladigimizda mutlaka bakmamiz gereken ayarlar. Ekranda bir de farkli ayarlar var onlara da bakalim.


Event Handler: Bu kodun calismaya baslayacagi class’in seçildiği yerdir. Cok değişik bir hareket yapmadiginiz surece zaten plugin registration tool otomatik bir sekilde “Execute” metodunu görecek ve orayi seçecektir.

Name: Sistem bu step icin otomatik bir atamakta ama değiştirmek isterseniz buradan yapabilirsiniz.

Run in User’s Context: Belki dokunmaniz gereken noktalardan biri olabilir. Bu kodu hangi kullanici yetkileriyle calistirmak istiyorsaniz onu seçebilirsiniz. Standartta ayari “Calling User” yani hangi kullanici bu işlemi yaparsa seçilidir.

ExecutionOrder: eger ayni varlik içinde ve ayni mesaj icin başka bir plug-in daha varsa buraya sira numaralari vererek hangisini once-sonra calisacagini belirleyebilirsiniz.

 

Unsecure ve Secure Configuration’larin ne ise yaradigina zaten “Plug-in Yapici Metodlari” basligi altinda değinmiştim.

 

Butun gerekli ayarlamalari yaptıktan sonra en allta bulunan “Register New Step” düğmesine tıklayarak işlemi tamamlıyoruz.  Artik plug-in’i test edebilirsiniz.

Hadi Plug-in Yazalim

Plug-in’ler hakkında temel bilgileri öğrendiğimize gore artik plug-in yazabiliriz. Asagida vereceğim orneklerde bir plug-in içerisinde yapabileceğiniz temel işlemleri anlatmaya calisacagim. Bu kodlara CRM SDK\SampleCode\CS\Plug-ins içerisinden ulaşabilirsiniz.

Veritabanina gitmeden kayitlari değiştirmek

Daha once de ifade ettiğim gibi CRM içerisinde bir kayit veritabanina gitmeden Pre-Operation(Pre-Event) adiminda kaydettiğiniz bir plug-in ile kullanicinin oluşturmak istediği kayda ulaşabilirsiniz.

Asagidaki kod oluşturulan bir account(firma) nesnesinin içerisine eger yok ise bir numara oluşturarak bunu accountnumber(müşteri numarasi) alanina vermekte böylece kayitta olmayan bir alan veritabanina bu alan eklenmiş bir sekilde gidecek.

Kodda da görebileceğiniz uzere ilk once Execute metodumuzu oluşturuyoruz. Biliyorsunuz ki bu metod parametre olarak içine aldigi ServiceProvider ile bize ihtiyacimiz olan butun verileri sunacak.

Ilk once Context’i ServiceProvider’dan türetiyoruz. Daha sonra da Context içerisindeki Target’in bir Entity mi olup olmadigina bakıyoruz. Tam bu noktada gelin Context nesnesinin içerisine bir bakalim.

Asagidaki ekran goruntusunu bu plug-in’i debug ettiğim anda aldim. Ilerleyen bölümlerde bir plug-in’in nasil debug edileceğini anlatacagim. Simdilik Context’e odaklanalim.

Gorebileceginiz uzere Context UserId, BusinessUnitId, MessageName, PrimaryEntityName, CreatedOn gibi o anda isimize yarayacak birçok veri yiginini içermekte. Iste Plug-in içerisinde ihtiyacimiz olanlari buradan alip kullanacagiz.

Entity ise onu entity sinifindan bir nesne haline getiriyoruz.

Bu sefer bu oluşturduğumuz yeni entity nesnesi account turunden bir nesne midir diye bakıyoruz.

Daha sonra Icinde accountnumber diye bir alan var mi diye bakıyoruz. Yoksa iste tam bu noktada veritabanina doğru yolculuğa cikmis olan kullanicinin bu kaydına müdahale edip içerisine bizim urettigimiz numara ile accountnumber nesnesini doldurarak entity mize veriyoruz. Artik içerisinde accountnumber alani da var.

             /// <summary>

        /// A plug-in that auto generates an account number when an

        /// account is created.

             /// </summary>

        /// <remarks>Register this plug-in on the Create message, account entity,

        /// and pre-operation stage.

        /// </remarks>

        //<snippetAccountNumberPlugin2>

        public void Execute(IServiceProvider serviceProvider)

             {

            // Obtain the execution context from the service provider.

            Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)

                serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));

 

            // The InputParameters collection contains all the data passed in the message request.

                    if (context.InputParameters.Contains("Target") &&

                           context.InputParameters["Target"] is Entity)

            {

                // Obtain the target entity from the input parameters.

                           Entity entity = (Entity)context.InputParameters["Target"];

                //</snippetAccountNumberPlugin2>

 

                // Verify that the target entity represents an account.

                // If not, this plug-in was not registered correctly.

                if (entity.LogicalName == "account")

                {

                    // An accountnumber attribute should not already exist because

                    // it is system generated.

                                  if (entity.Attributes.Contains("accountnumber") == false)

                                  {

                        // Create a new accountnumber attribute, set its value, and add

                        // the attribute to the entity's attribute collection.

                                        Random rndgen = new Random();

                        entity.Attributes.Add("accountnumber", rndgen.Next().ToString());

                                  }

                                  else

                                  {

                                        // Throw an error, because account numbers must be system generated.

                        // Throwing an InvalidPluginExecutionException will cause the error message

                        // to be displayed in a dialog of the Web application.

                        throw new InvalidPluginExecutionException("The account number can only be set by the system.");

                                  }

                           }

                    }

             }

Umarim birsey dikkatinizi çekmiştir. Entity içerisine direkt alani Attributes.Add metodu ile ekliyoruz. Yani bir update işlemi yapmıyoruz zaten kayit daha veritabanina gitmedi doğal olarak CRM Service nesnesinin bir instance’ini olusturmamiza da gerek kalmadi.

Update aninda update edilmemiş değerlere ulaşmak

Baslik biraz karisik gelebilir ama aslinda tam olarak da durum bu update aninda update edilmemiş alanlara ulaşmak istiyorsaniz birazdan bahsedecegim yöntemi uygulamniz gerekmekte. Peki biz neye neden ulasamiyoruz diye soracak olursaniz aciklayayim. Dynamics CRM’in Create aninda kayit ile ilgili elde ettiği butun bilgileri bize Target’tan türettiğimiz entity içerisinde verir. Asagidaki ekran goruntusunde de bu durumu görebilirsiniz.

Update aninda durum bundan farkli sistem bize sadece (doğal olarak) update edilmiş alanlari vermektedir. Asagidaki ekran goruntusune bakabilirsiniz.

Ben bu contact üzerinde sadece jobtitle alanini güncelledim. Sistem jobtitle ve yaninda ihtiyaç duyulacak birkaç bilgiyi daha Target’a vermekte o kadar.

Simdi konu basligina dönecek olursak iste tam bu update aninda ben update edilmemiş bir alanin değerine ulaşmak istersem ne yaparim? Sistemde bunun için Image yani o kaydin o anki snapshot’ini almamizi sağlayan bir ozellik var.

Herhangi bir plug-in step’i üzerinde sag tuşa basarak “create new image” seçeneğini seçtiğimizde asagidaki ekran karsimiza gelecektir.

Bu ekranda Pre ve Post olarak istediğimiz alanlari parametre olarak seçebilir ve bunlara genel bir isim verebiliriz. Ben Target dedim.

Iste bu ayarlamayi yapdiginizda asagidaki ekran goruntusundeki gibi update aninda değişmeyen ama sizin erişmek istediğiniz alan/alanlar PreEntityImages içerisinde hazir olacaktır.

 

Peki kod tarafında buna nasil ulasacagiz derseniz o da su sekilde olacak;

Once image nesnesine ulaşıyoruz:

Entity image = (Entity)context.PreEntityImages["Target"];

Sonra image içerisinden istediğimiz alana erişiyoruz:

String descriptionMessage = "Old full name: " + image["fullname"];

 

Uzerinde calistigim nesnenin id’si nerede?

Update edilmis ya da post-operation durumdaki bir nesnenin id’sine ihtiyaç duyarsaniz su sekilde elde edebilirsiniz:

Guid id = new Guid(context.OutputParameters["id"].ToString());

Ya da

Guid id = context.PrimaryEntityId;

 

Plug-in’ler arasinda bilgi paylasimi

Eger bir plug-in içinde oluşturduğumuz bir veriyi diğer plug-in’lerin de erişmesini istiyorsak “SharedVariables” yapisini kullanmamiz gerekmekte. SharedVarabiles aslinda bir parametre kolleksiyonu ve içerisinde paylaşmak istediğiniz nesneleri saklayabilirsiniz.

 

Asagida 2 tane plug-in yer almakta. Ilk plug-in (PreEventPlugin)

context.SharedVariables.Add("PrimaryContact", (Object)contact.ToString());


Kodu ile Contact isimli Guid nesnesini “PrimaryContact” adinda SharedVariables içerisinde saklamakta.

 

Ikinci plug-in ise Post-event aninda calismakta ve SharedVariables’den istediği değeri örnekteki gibi almaktadır.

 

Boylece plug-inler arasi veri transferi ve yapilmis olmakta.

 

Guid contact = new Guid((string)context.SharedVariables["PrimaryContact"]);

 

 

    public class PreEventPlugin : IPlugin

    {

        public void Execute(IServiceProvider serviceProvider)

        {

            // Obtain the execution context from the service provider.

            Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)

                serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));

 

            // Create or retrieve some data that will be needed by the post event

            // plug-in. You could run a query, create an entity, or perform a calculation.

            //In this sample, the data to be passed to the post plug-in is

            // represented by a GUID.

            Guid contact = new Guid("{74882D5C-381A-4863-A5B9-B8604615C2D0}");

 

            // Pass the data to the post event plug-in in an execution context shared

            // variable named PrimaryContact.

            context.SharedVariables.Add("PrimaryContact", (Object)contact.ToString());

        }

    }

 

    public class PostEventPlugin : IPlugin

    {

        public void Execute(IServiceProvider serviceProvider)

        {

            // Obtain the execution context from the service provider.

            Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)

                serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));

 

            // Obtain the contact from the execution context shared variables.

            if (context.SharedVariables.Contains("PrimaryContact"))

            {

                Guid contact =

                    new Guid((string)context.SharedVariables["PrimaryContact"]);

 

                // Do something with the contact.

            }

        }

    }

Plug-in Yapici Metodlari

Bir plug-in için Microsoft Dynamics CRM’de opsiyonel olarak kullanabileceğiniz yapici metod(constructor) türleri mevcuttur. Hic parametre vermeden yapici metod cagirabileceginiz gibi bir ya da iki parametre vererek de cagirabilirsiniz.

SamplePlugin isimli plug-in için 3 cesit yapici metod ornegi asagidaki gibidir.

public SamplePlugin()

public SamplePlugin(string unsecure)


public SamplePlugin(string unsecure, string secure)


Yapici metodun ilk parametresi public yani unsecure bilgi yigini içermelidir. Ikinci parametre ise non-public (secure) bilgi yigini içermelidir. Buradan da anlayabileceğiniz uzere secure string encrypted yani sifrelenmis veri unsecure ise unencrypted yani sifrelenmemis değer içermelidir. Office Outlook client da calisan bir plug-in yazdiysaniz bilmelisiniz ki secure string offline yani cevrimdisi modda calismayacaktir.

Bu bilgileri bir plug-in’e Plugin Registration Tool vasitasiyla bir step’in kaydi sirasinda sisteme iletiyoruz. Bu mesajlar için ayrilmis 2 alan bulanmaktadır.

Step içerisinde bu ayarlamalari yaptıktan sonra yazmis olduğumuz degerlere kod içerisinden asagidaki gibi ulaşabilirsiniz.

private readonly string _unsecureString;

private readonly string _secureString;

 

public AdvancedPlugin(string unsecureString, string secureString)

{

    if (String.IsNullOrWhiteSpace(unsecureString) ||

          String.IsNullOrWhiteSpace(secureString))

    {

        throw new InvalidOperationException

             ("Unsecure and secure strings are required
               by the Advanced Plug-in, but not provided."
);

    }

 

    _unsecureString = unsecureString;

    _secureString = secureString;

}

Müşterinin Kalbine Giden Yol Teknolojiden Geçer - Bolum 2

Çözüm nedir peki…

Amacımız basit aslında “Müşterilerin tercih ettiği markaları yaratan ve vazgeçilmez olabilmek.” Bu durumda ne yapmak gerekiyor? İşte bu soruya iki yönden bakarak farklı cevaplar vermek gerekiyor.

1. İnternet’ten doğru müşteri kitlesine ulaşın : Websiteniz eğer arama motorlarında (google, yandex vb.) üst sıralarda yer almıyorsa size ulaşamayacaklardır. O zaman siteniz için SEO(Search Engine Optimization) çalışmaları yapmak gerekmektedir. SEO çalışmaları ile siteniz uygun kelimeler için üst sıralarda yer alacaktır. Bunun haricinde sitenizin facebook ve twitter’da yer alması ve mümkünse buralarda  doğru kitleye uygun reklam vermeniz çok önemli olacaktır.

Ek olarak yazımın başında artan mobil cihaz ve tablet kullanıma örnekler vermiştim. Bu durumda websitemizin bütün cihaz ve browserlardan(internet explorer, chrome vb..) düzgün görüntülenecek şekilde ayarlanması gerekmektedir.

 

Eğer işiniz için uygun ise iOS, Android ve Windows Phone gibi tablet ve cep telefonlarında çalışan işletim sistemlerine uygun birer uygulama yazdırmanız da gerekebilir. Yine yapılan araştırmalarda mobil uygulamaların web sitelerinden daha fazla kullanıldığı ve bağımlılık yaptığı da bir gerçek.

 

2. İşinizi yönetmek için bütünleşik sistemler kullanın : Müşteriler cep telefonları, tabletler vb.. cihazlar ve yazılımları kullanıyorlar da siz bundan farklı mısınız? Hangi ürün ya da hizmeti ürettiğiniz önemsiz sonuçta siz de işinizi yönetmek için bunlara mecbursunuz. Bu durumda sizin işinizi yönetmek için kullandığınız yazılımın da iş yapmak için kullandığınız bütün enstrümanlara erişmesi ve en önemlisi bunu cihaz, zaman ve mekan fark etmeksizin sizin kullanımıza sunmalı.

 

Bu noktada size tam da bütün bunları sunabilen bir yazılımı size tanıtacağım;

Microsoft Dynamics CRM. Yazılım 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.

 

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.

 

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.

 

Extend : 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.

Harvard Business School’dan Prof.Dr. Rajiv Lal diyor ki: “CRM programları uygulanırken, yalnızca sistemler değil, şirket içi akışlar, müşteriye dair süreçler ve teşvik politikaları da değişmeli; çünkü müşteri merkezlilik şirketin yalnızca teknolojik ya da satış odaklı gücü değil, kültürel olgusudur. Kültürel değişimi sağlamadan müşteri bağlılığını garanti edemezsiniz.”

 

İşte bu özellikleri sayesinde Dynamics CRM firmanızın ihtiyaçlarına göre şekillenir ve işinizi yönetmede size yardımcı olur ve birlikte çalışmayı arttırarak Prof.Dr. Rajiv Lal’ın dediği gibi kültürel değişimi sağlar.

 

 

grafik ve rakamlar için kaynak http://www.webrazzi.com

Müşterinin Kalbine Giden Yol Teknolojiden Geçer - Bolum 1

Bizde meşhur bir atasözü vardır “erkeğin kalbine giden yol midesinden geçer” derler. Günümüzde bu sözü iş dünyasına odakladığımızda müşterinin kalbine giden yolda teknolojisinin olması bizi hiç de şaşırtmamalı aslında.

Rakamlar yalan söylemez…

Apple’ın 10 Eylül’de tatnıttığı  iPhone 5c ve iPhone 5s  bir haftada şimdiye kadar bütün iPhone’ların ilk hafta satışlarını geçti. Apple yaptığı açıklama ile bir haftada 9 milyon iPhone 5C ve iPhone 5S satıldığını duyurdu. iPhone 5 ile karşılaştırdığımızda geçen sene yine Eylül ayında tanıtılan iPhone 5 ilk haftasında 5 milyon rakamına ulaşmıştı.

Geçen sene tek ürünle 5 milyonu yakalamasına karşılık 2 ürünle toplamda 9 milyon satışa ulaşmış oldu.

Mobil kullanım oranları her geçen gün artıyor ve yapılan araştırmalar daha uzun süre bu büyümenin devam edeceğini öngörüyor. IDC‘nin yayınladığı rapora göre tablet bilgisayarlar, kişisel bilgisayarların yıllık üretimini 2015 sonu itibariyle geçecek.

Akıllı telefonlar ve tabletlerin bulunduğu mobil cihazlarda geçen yıl %30.3 büyüme yakalamasına göre bu yıl hafif bir gerileme ile %27.8 büyüme bekleniyor. Buna karşın PC üretiminin 2013 yılı itibari ile %10 düşeceği tahmin ediliyor. Akıllı telefonların anormal büyümesini sürdüreceği ve 1.4 milyar akıllı telefonun üretiminin gerçekleşeceği de beklentiler arasında. Dikkat çeken bilgilerden birisi de tabletlerin en büyük rakibinin yine mobil bir cihaz olan akıllı telefonların büyüyen ekranları olması.

Şirket websitesini yaptık herşey bitti…

Hal böyle olunca oturup düşünmek gerekiyor, peki biz işimizi teknolojiye uyarlayabildik mi? ya da internet ve sosyal medyanın gücünü doğru kullanabiliyor muyuz? İşte bu noktada en çok yapılan hata şirket web sitemizi yaptık herşey bitti şeklindeki yanlış düşüncede yatmakta. Türkiye’den örnek verecek olursak IAB Türkiye’nin sunduğu rapora göre ‘display’, arama raporu, mobil reklam, ilan, e-posta, oyun içi reklam gibi oluşan internet reklam yatırımları toplamına göre 2013’ün ilk 6 ayında internet reklam pazarı hacmi yarım milyar TL’yi aşarak 541.8 milyon TL olarak gerçekleşti.

2015 Yılı CRM Trendleri - Bolum 1

Nereden geldik…

Teknolojinin inanılmaz bir hızla ilerlediği dünyamızda insana dair olan her şeyde mecburen teknoloji ile bağlantı kurmak zorunda kalıyoruz. Şu anda birçoğumuzun kullandığı cep telefonların en eskisi eminin en iyi tahminle 3 yıllıktır. Bu teknolojik gelişim bizim her alanda karşımıza çıkmakta ve kavramları da şekillendirmekte. Yaklaşık 10 sen önce en iyi cep telefonunun en küçük en hafif telefon olduğu halk tarafından kabul görürken şu anda ekranı en büyük en hızlı internete giren pili en çok giden gibi kıyaslama ölçüleri ortaya çıktı. Bunun nedeni de insanların telefon üzerinde yapabildiklerinin günümüzde bilgisayara eşit hale gelmesine bağlamak gerekir.

Aynı açıdan bakarsak bundan çok değil 5-7 yıl önce en yeni ve en hızlı pazarlama aracı SMS yani kısa mesaj göndermekti. Kısa mesaj hala yaşamına devam etse de firmaların müşterilerine ulaşmak için gönderdikleri SMS oranları o kadar çılgın boyutlara ulaştı ki devlet bu işe sınırlama getirmek zorunda kaldı ve izinli pazarlama yöntemi ortaya çıktı. 

Nereye gidiyoruz…

Kullanıcı elektroniğindeki bu gelişmeler doğal olarak yazılım dünyasına da yansımakta. Facebook internet üzerinden fotoğraf ve resim hizmeti Instagram için 1 milyar dolar ödeyerek satın almıştı. Yine Facebook, 450 milyon aktif kullacısı ve 55 çalışanı olan WhatsApp'ı, 3 milyar doları tedbirli hisse olmak üzere 19 milyar dolara satın alarak, her bir kullanıcıya 42 dolar değer biçti. Peki Facebook’un kendisi nedir? Sonuçta o da bir yazılım ve reklamlar üzerinden gelir sağlayan bir modeli var aynı Google gibi. Kısacası öyle bir dünyada yaşıyoruz ki bir Whatsapp Türkiye’nin sanayi devlerinden 4 tane Tüpraş’a eşit.

Türkiye’de ise internet kullanım oranı 9 yaşına kadar düştü ve Türkiye’deki evlerin %60’ı aktif olarak internete bağlı durumda.

Şekil 1 - Kaynak TÜİK

Hal böyle olunca CRM gibi kavramlarda bütün bu teknolojik gelişmelerden nasibini fazlasıyla almakta ve bu kavramların geleceği de bu teknolojik gelişmeler karşısında şekillenmekte. Daha önce de ifade ettiğim gibi bundan 5-7 sene önce son kullanıcıya ulaşmak ve ürün ve hizmetler hakkında bilgi vermek ve müşteri ile interaktif işler yapabilmek için SMS en iyi araç gibi görünüyordu. Gelin 2015 itibariyle CRM dünyasının trendleri neler olacak bu teknolojik gelişmeler bizi nereye götürecek bunlara bakalım.

2015 Yılı Trendleri

1.      Online Sistemler ve Tablet Uygulamaları

CRM dünyasından geçen seneden beri en çok öne çıkan konulardan biri artık Cloud Computing (Bulut Bilişim) üzerine yerleşmiş sistemleri kiralamak ve kullanmak oldu. Biliyorsunuz ki teknoloji çok hızlı ilerliyor ve özellikle şirketlerin bu hız karşısında donanımsal ihtiyaçları ve internet, soğutma gibi altyapı ihtiyaçlarını karşılaması buna uygun yazılım alması ve belki de en önemlisi bu yazılımları ve donanımı ayakta tutacak uygun personeli/personelleri tutması çok yüklü maliyetler olmaya başladı. İşte bu nedenle Salesforce, Dynamics CRM gibi CRM yazılımları internet tabanlı hizmetlerinde çok büyük ataklar yaptılar. Bu sistemleri hem tek başlarına online hem de mevcut altyapınızla entegre olacak şekilde hybrid bir mimaride kullanabilmektesiniz.

Ayrıca bu online sistemler tablet ürünleriyle de (Ipad, Android, Windows Tablet) tam entegre bir şekilde çalışmakta ve bir bilgisayara ihtiyaç duymadan sadece bir tablet ile sistemleri tam entegre kullanabilmektesiniz.

2015 yılı ve gelecek yıllar saha personellerinin sadece ellerinde tabletler ile güçlü CRM altyapılarına bağlandıkları ve hiçbir ek sisteme gerek kalmadan bütün veri girişi ve raporlama altyapılarını sağlayabildikleri yıllar olacak. Kısacası bu dönemden sonra artık bilgisayarlar değil tablet ve cep telefonu tarafında olanlar sahadan gelen verileri hızlıca izleyip analiz edip müşteri ihtiyaçlarını karşılayabilir hale gelecekler.

2.      Mobil Dizayn

Geçen seneden bize miras kalan bu kavram hala geçerliliğini sürdürmekte. Önceki yıllarda bu kavram her cihaza uygun web sitesi tasarımı şeklindeydi. Yani ben bir şirketin web sitesine girdiğimde bilgisayardan mı yoksa tablet veya cep telefonundan mı girdiğimi algılayacak ona göre dizayn değiştirecek ki ben de buna göre sitede rahatça gezebileceğim. Artık bu durum daha farklı bir yöne kaydı; artık her firma kendi mobil uygulamasını yapmakta. Bu sayede kullanıcının direkt cep telefonun ya da tabletinde kullanıcının izin verdiği ölçüde her şeye erişim hakkı olmakta. Biliyorsunuz ki Whatsapp sözleşmesi gereği sizin telefonunuzda kayıtlı kişiler listesine erişme hakkına sahip. Bu hakkı siz ona uygulamayı kurarken kabul ettiğiniz lisans sözleşmesinde veriyorsunuz ve Whatsapp bu veriyi alıp istediği gibi değerlendirebilir. İşte mobil uygulama kavramı bu yüzden çok önemli.

Olayı Türkiye düzeyine indirgersek mobil cihaz kullanım oranına bakınca firmaların neden bunun için savaş verdiğini çok daha iyi anlayacaksınız.

 

Masaüstü bilgisayar
Desktop computer

Taşınabilir bilgisayar (Laptop, Tablet PC)
Portable computer (Laptop, Tablet PC)

Taşınabilir bilgisayar (Dizüstü, tablet, netbook vb)
Portable computer (Laptop, netbook, tablet)

Tablet bilgisayar
 Tablet computer

Cep telefonu (Akıllı telefonlar dahil)
Mobile phone (incl. smart phone)

 

 

 

Yıl
Year

2014

27.6

 

40.1

-

96.1

 

Kısacı şu anda bırakın cep telefonunu tablet kullanım oranı bile masaüstü bilgisayarların 2 katına ulaşmış durumda. Doğal olarak firmaların müşterileriyle iletişime geçmek, kullanıcı deneyimi öğrenmek, ürün kullanım oranları üzerinde analiz yapabilmek ya da müşteri şikâyetlerini almak için mobiliteye önem vermesi ve CRM analizlerini bunun üzerinden de veri toplayacak şekilde geliştirmeleri 2015 ve sonrasında artarak devam edecek.