CRM 2011 Plugin etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
CRM 2011 Plugin etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

CRM 2011 Plugin - context.UserId ve context.InitiatingUserId

CRM 2011 de plugin üzerinde 2 adet kullanıcı bilgisi tutulur. bunlardan biri plugini tetikleyen kişinin id si diğeri ise pluginin register eden kullanıcının id sidir.


context.UserId

     Pluginin hangi user üzerinden çalışacaksa o userın crm guid değerini verir. Bu değer Plugin Registration Tool üzerinden Run in User's Context alanından seçilir.Default olarak Calling User değerini alır.

context.InitiatingUserId 
  
     Plugini tetikleyen kullanıcının crm guid değerini verir.

Örnek vermek gerekirse , Test adında bir entity nin  update inde çalışan plugin için aşağıdaki adımları inceleyebilirsiniz.


Örnek 1:




Sonuc 1:

Örnek 2 :


Sonuc 2 :


Örnek 3:


Sonuc 3:

Örnek 4: 


Sonuç 4:




CRM 2011 Plugin - Değişken Paylaşımı ( Shared Variables )

Bazen plugin yazımında pre deki değişkeni postta kullanmak isteriz. Bazen de başka bir plugin üzerindeki değişkeni kullanmak isteriz. Bunun için CRM in context i üzrindeki SharedVariables özelliğini kullanıyoruz.

Aynı entiti üzerinde çalışan pluginler için örnek kod yazımı

using System;
using Microsoft.Xrm.Sdk;

namespace Microsoft.Crm.Sdk.Samples
{
    /// <summary>
    /// A plug-in that sends data to another plug-in through the SharedVariables
    /// property of IPluginExecutionContext.
    /// </summary>
    /// <remarks>Register the PreEventPlugin for a pre-event and the
    /// PostEventPlugin plug-in on a post-event.
    /// </remarks>
    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.
            }
        }
    }
}


İki farklı entiti üzerinde çalışan plugin için ;

context.ParentContext.SharedVariables["PrimaryContact"] şeklinde değerleri alabilirsiniz.

CRM 2011 Plugin - Merge Plugin Yazımı

Bu makalemde iki contact varlığının merge edildiğinde  çalışacak  pluginin nasıl yazılacağını anlatacağım.

Merge plugini yazımında context ten bize Target ve SubordinateId diye tanımlı InputParameterelere dikkat edeceğiz.Target parametresi bize geriye kalcak varlığın bilgisini verirken , SubordinateId parametresi bize deactivate olacak ikinci varlığın bilgisini verir.
Aşağıdaki kodları incelerseniz beni daha ii anlayacaksınız.

contact1 nesnesi işlem sonunda geriye kalan contact ı
contact2 ise deactivate olan contactı simgeler.

Kaynak Kodlar

public class ContactMerge : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            Guid contact1 = Guid.Empty;
            Guid contact2 = Guid.Empty;
            try
            {
                #region Plugin Tanımlamaları
                IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                serviceFactory.GetType().GetProperty("ProxyTypesAssembly").SetValue(serviceFactory, typeof(XrmServiceContext).Assembly, null);
                IOrganizationService crmService = serviceFactory.CreateOrganizationService(context.UserId);

                if (!context.InputParameters.Contains("Target"))
                    return;

                if (string.IsNullOrEmpty(context.MessageName))
                    return;

                if (!context.MessageName.Equals("Merge"))
                    throw new Exception("Plugin executed but message was not merge");
                #endregion
                #region Main Code
                if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is EntityReference)
                {
                    EntityReference eTarget = (EntityReference)context.InputParameters["Target"];
                    contact1 = eTarget.Id;
                    contact2 = (Guid)context.InputParameters["SubordinateId"];

                    if (contact1 != Guid.Empty && contact2 != Guid.Empty)
                    {
                        Contact contact1Entity = (Contact)crmService.Retrieve("contact", contact1, new ColumnSet(new string[] { "contactid", "ite_industryid" }));
                        if (contact1Entity != null && contact1Entity.Id != Guid.Empty)
                        {
                        }
                        else
                            throw new Exception("Contact not found.");
                    }
                    else
                        throw new Exception("Contact1 or Contact2 id guid empty.");
                }
                else
                    throw new Exception("Not right type of target");
                #endregion
            }
            catch (Exception ex)
            {
                throw new InvalidPluginExecutionException("An error occurred in the ContactMerge plug-in" + ex.Message);
            }
        }
    }

Plugin Registration Tool ile MErge Plugin Deploy Etme

Plugin inize aşağıdaki step i eklemeniz yeterli olacaktır.

CRM 2011 Plugin - Crm Admin ile CRM Servise Bağlanma

 public static IOrganizationService GetCrmServiceByCrmAdmin(IServiceProvider serviceProvider)
        {
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            serviceFactory.GetType().GetProperty("ProxyTypesAssembly").SetValue(serviceFactory, typeof(XrmServiceContext).Assembly, null);
            return serviceFactory.CreateOrganizationService(new Guid(_settingFactory.GetCrmAdminId));
        }

CRM 2011 - Plugin Images

Aşağıdaki ekran görüntüsünde plugin steplerinde Image kullanımının olup olmadığı görülmektedir.


CRM 2011 - Plugin Debug Etme


  • Yazılan pluginde eksiklik yapıp yapmadıgınızı kontrol edin. Bakınız.
  • Plugin projemizi ReBuild edelim.
  • IIS e reset atalım.Command Prompt u acalım ve iisreset yazıp calıstıralım.
  • CRM Asynchronous Service leri restart edelim.


  • Projenın .pdp ve .dll dosyalarını Crm assembly klasorune tasıyalım.

       C:\\ProgramFiles\Microsoft Dynamics CRM\Server\bin\assembly

  • Plugin Registration Tool u acalım.Download CRM Sdk
  • Pluginimizi CRM e yukleyelim.Bir önceki yazımda nasıl yuklenecegını yazmıstım Bakınız
  • Yükleme işlemi tamamlandıktan sonra Visual Studio da projemizi acalım ve menuden Debug-Attach Process secelim.

             Eger senkron bir pluginse w3wp leri,
             Eger asenkron plugin veya custom workflow sa CRMAsyncService.exe attachleyelim.


  • Son olarak pluginimizi tetıklemek yeterli olacaktır.











CRM 2011 - Plugin Kod Yazımı


  • Asagıda kod sayfasının gorunumu vardır.Kapalı kısımlara sayfanın devamında ulasabılırsınız.

  • Plugin Tanımlamaları

  • Parameters and GetTargetEntityId

  • MainCode







CRM 2011 - PLUGIN MESAJ


Örnegin,teklif yaratırken hem teklif üzerinden hem firsat üzerinden teklif yaratırız.Teklif create için plugin yazdıysak bunun hangi create anında calısmasını plugin registor tool üzerinden vermemız gerekır.

İlk Senaryo : Sales->Quotes->New (Teklif üzerinden teklif yaratma)


PLugin  Code

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.Sdk.Query;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Crm.SdkTypeProxy.Metadata;
using Microsoft.Crm.Sdk.Metadata;
using System.Web.Services;
using Microsoft.Win32;

namespace TestQuotePlugin
{
    public class QuotePlugin : IPlugin
    {
        public void Execute(IPluginExecutionContext context)
        {
            ICrmService crmService = (ICrmService)context.CreateCrmService(true);
     IMetadataService metaData = context.CreateMetadataService(true);
     lead ld = new lead();
            ld.subject = "Test Subject";
            ld.firstname = "Test FirstName";
            ld.lastname = "Test LastName";
            ld.companyname = "Test Company";
            crmService.Create(ld);
        }    
    }
}


Bu sekılde olustugunda fırsat üzerinden teklif yaratılınca plugin calısmayacaktır.

İkinci senaryo : Sales->Opportunity->(Open Opportunity)->Quotes->New Quote

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.Sdk.Query;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Crm.SdkTypeProxy.Metadata;
using Microsoft.Crm.Sdk.Metadata;
using System.Web.Services;
using Microsoft.Win32;

namespace TestQuotePlugin
{
    public class QuotePlugin : IPlugin
    {
        public void Execute(IPluginExecutionContext context)
        {
            CrmService crmService = CreateCrmService(context);    
     lead ld = new lead();
            ld.subject = "Test Subject";
            ld.firstname = "Test FirstName";
            ld.lastname = "Test LastName";
            ld.companyname = "Test Company";
            crmService.Create(ld);
        }   

        private static CrmService CreateCrmService(IPluginExecutionContextcontext)
        {
            CrmAuthenticationToken token = new CrmAuthenticationToken();
            token.AuthenticationType = AuthenticationType.AD;
            token.OrganizationName = context.OrganizationName;

            CrmService crmService = new CrmService();
            crmService.UseDefaultCredentials = true;
            crmService.Url = (string)(Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\MSCRM").GetValue("ServerUrl")) + "/2007/crmservice.asmx";
            crmService.CrmAuthenticationTokenValue = token;
            return crmService;
        }   
    }
}






CRM 2011 - PLUGIN YUKLEME (ADDING PLUGIN )




Crm 2011 SDK klasörunun içerisinde pluginregistration.exe dosyasını calıstırın.
Sdk//tools//pluginregistration//bin//debug yoluyla ulasabilirsiniz.

RESİM 1:













Karsınıza RESİM 2 deki ekran belirecektir.Bu ekranda baglanacagımız crm ile ilgili birgileri doldurduktan sonra Connect butonuna tıklayınız.
Label:Baglantı isminize vereceğiniz adı giriniz.
Discovery Url:   CRM  inizin bılundugu url yi girin.Örnegın http://localhost:80 (Localhostun 80. Portunda crm oldugunu belirtir.)
User Name=CRM e baglanırken kullandıgınız kullanıcı adı nı girmeniz gerekmektedir.Örnegin:GOKHANM\gokhan
RESİM 2:
Daha sonra o portta bulunan CRM ler Baglantı ismi verdiğimiz alanın altında belirecektir.
Bizim portumuzda bir adet TESTCRM adında CRM bulunmaktadır.
NOT :TESTCRM :CRM in Organization Name idir.
RESİM 3:
TESTCRM i secip Connect Butonuna tekrar bastıgımızda sag taraftakı panelde Crm imize yuklu pluginler listelenir.(bkz RESİM 4)
RESİM 4:


PLUGIN EKLEME

Eger Crm e yeni bir plugin eklemek istersek Register bolumunden Register New Assembly secenegini seceriz.Karsımıza RESİM 5 teki ekran gelir.
RESİM 5:
Cıkan ekrandan Load Assembly butonuna tıklayarak assembly mizi seceriz.Burada dikkat edilmesi gereken assembly mizi Program Files daki CRM klasorunun icerısındek, assembly kalsorunde olması gerekmektedir.
Bu klasore C:\Program Files\Microsoft Dynamics CRM\Server\bin\assembly bu sekılde ulasabılırız.
NOT :Assembly mızı buraya kopyalarken alacagımız bazı hataları nasıl duzeltecegımızı anlatımın sonunda paylasacagım.
2.STEP alanında dll ınızın ıcerısındekı hangı pluginınızı secenegınızı belırtın.Burada Select All dememız yeterli olacaktır.
3.STEP alanından None ve Disk butonlarını secın.
4.STEP Sayfanın sonunda bulunan Register Selected Plugins butonunu tıklayın ve plugınızın CRM e yuklenmesını bekleyın.Eger burada hata almazsanız plugınınız CRM e sorunsuz yuklendı demektır.

STEP EKLEME

Şimdi de ekledıgımız pluginimizi hangı durumlarda calısması gerektıgınız sececegız.Bunun için  calısacak plugın dosyamızı sectıkten sonra Register sekmesınden Register New Step secenegını secın.Alttakı resimde ki ekranı goreceksınız.(RESİM 6)
RESİM 6:
 Burada Message kısmında plugının tetıklenecegı anı secın.
Primary entity bolumunden hangı entity uzerınde calısacagınız secın.
Asagıdakı Eventhing Pipeline Stage of Execution bolumunden Pre demı yoksa Post anında mı calısacagını secın.
Diger kısımlar resimde isretlı oldugu gıbı kalır.İstisnai durumlarda degısır.
Resmin sag alt kısmında bulunan Register New Step butonuna tıklayarak step ımızı olusturmus oluruz.

PLUGİN UPDATE

Pluginimizi Update yapmak ıcınse RESİM 7 de oldugu gibi güncellenecek dll i sectıkten sonra Update butonuna basarak cıkan ekrandan plugınımızı secerız.
RESİM 7:
Şimdi de yukarıda bahsettıgımız Crm içerisindekı assembly klasorune plugınımızı kopyalarken alacagımız hataları cozelım.
Burada daha once secılı plugının uzerıne kopyalama ıslemmı ya da silerken hata alırız.
Bunları cozmek ıcın,
Command Prompt u yonetici olarak calıstırın.
services.msc satırını calsıtırın.Karsınıza RESİM 8 dekı HİZMETLER ekranı gelecektır.
RESİM 8:
RESİM 8 dekı ekranda oklarla belırtılen Microsoft Dynamics CRM Asynchronous Processing Service adında 2 adet servisi yukarıda kı restart servise butonuna tıklayarak tekrar baslamasını secın.
Daha sonra yine command prompt yonetıcı modunda acıkken iisreset satırını etkınlestırmemız yeterlı oalcaktır.Simdi kopyalama sılme işlemını sorunsuz yapabılırsınız.

CRM 2011-PLUGIN YAZMA


Bugünkü makalemizde Microsoft Dynamics Crm 2011 içerisindeki bir entity'e pre plug-in yazmasını öğreneceğiz. Plug-in mimarisini Microsoft Dynamics Crm 4.0 mimarisinden bildiginiz gibi iki çeşiti vardır. ( Pre Plugin ve Post Plugin )
İsterseniz ilk önce pre plugin ile post plugin arasındaki farkları anlatalım.
Pre-Plugin : Kayıt içerisinde kayıt edilmeden hemen önce çalışan yapıdır. Bu yapıda biz ilgili kayıt henuz kayıt edilmeden istersek gerekli kontrollerimizi yapar ve kaydı engelleriz istersek kayıt henuz kayıt edilmeden önce ilgili kayıt üzerinde bazı değerler ekleyebilir veya çıkartabiliriz.
Post Plugin : Kayıt içerisinde kayıt edildikten sonra çalışan yapıdır. Post pluginler ile yapabiliceklerimiz örnek olarak bir kayıt oluştuktan sonra bir başka entity de farklı bir kayıt oluşturmak olabilir.
Biz makalemizde pre plugin yapısını inceleyeceğiz.
Seneryomuzda kişi kartı üzerinde çalışan bir pre plugin yapımızın olduğunu varsayalım. Microsoft Dynamics Crm 2011 sisteminde bir kişi eklendiği zaman ilgili kişiye bir kişi seri numarası atayalım.
  • İlk önce kişi kartı üzerinde kişi  seri numarası adında bir field oluşturalım . new_kisiserinumarasi.
  • Visual Studio 2010 üzerinde  yeni bir class library projesi açalım.
Class ımızın adına KisiSeriUpdate adını verdim. Plug-in işlemlerimizi gerçekleştirmek için ihtiyacımız olan referansları ve dll leri sırası ile ekleyelim.
microsoft.xrm.sdk.dll
Microsoft.Crm.Sdk.Proxy.dll
Yukarıdaki ilgili dll leri Crm server ımızın kurulu olduğu makina üzerinde bin klasörünün altında bulabilirsiniz.
System.Runtime.Serialization referansımızıda projemize ekleyelim.
Uygulamamız içerisindeki referanslarımız aşağıdaki şekilde olmalıdır.
Kod yazımına başlamadan önce projemize son olarak bir key file ekleyelim. bunun için gerekli olan adımlar aşağıdaki gibidir.
  • Projemiz üzerinde sağ tuş özellikler ekranına ulaşalım . Karşımıza aşağıdaki gibi bir ekran gelecektir.
Dikkat etmemiz gereken noktalardan biri uygulamamızın .net framework 4.0 olmasıdır.
Signing kısmından yeni bir key file ekleyelim.
Yukarıdaki adımlarımızı tamamladıktan sonra artık plugin yazma işlemlerimize başlayabiliriz.
using Microsoft.Xrm.Sdk;
 
namespace PrePlugin
{
    public class KisiSeriUpdate:IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            throw new NotImplementedException();
        }
    }
}
Uygulama içerisinde oluşturduğumuz KisiSeriUpdate class ımıza IPlugin interface ini implement edelim. IPlug in interface i Microsoft.Xrm.Sdk içerisinde bulunmaktadır.
İnterface imizi implement ettikten sonra Execute method unun geldiğini göreceksiniz. Plugin işleyişi Execute metot'u içerisinde olur.  Şimdi Execute method u içerisinde ilgili işlemlerimizi yapalım.
 public void Execute(IServiceProvider serviceProvider)
        {
            try
            {
                // Plug-in imizi yakalamak için serviceprovider nesnesi üzerinden gelen asagıdaki adımlarımızı tamamlayalm.  
Asagıdaki kod blogunda plug-in imizi çalıstırmak için gerekli olan servislerimizi ve ilgili servisi çalıstırmamız için gerekli olan kullanıcımızı 
yakalamaktayız. ( Plug-in imizi hangi kullanıcı çalıstırdıgı ise o kullanıcının bilgileri bize context.UserId degeri ile birlikte gelecektir.  
Dolayısı ile islemlerimiz de ilgili kullanıcının yetkisi dahilinde olacaktır. 
 
                 Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)
                serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));
                
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
 
                // if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) context nesnesinin içerisindeki 
parmetrelerde Target parametresini olup olmadıgına ve ilgili parametrenin entity olup olmadıgına bakalım. 
 
                if (context.InputParameters.Contains("Target") && context.InputParameters["Target"is Entity)
                {
                    // Son olarak kendi olusturmus oldugumuz entity nesnesi içerisine yukarıda kontrol ettigimiz context nesneinin 
Target input parametresini verelim. 
                    Entity entity = (Entity)context.InputParameters["Target"];
 
                    // entity nesnesi içerisinde bizim kisi kartı üzerinde girdigimiz degerler bulunmaktadır. 
                }
            }
            catch (Exception ex)
            {
                // Plug-in içerisinde herhangi bir hata ile karsılasır isek bunu kullanıcıya mesaj olarak çıkartalım. 
                throw new InvalidPluginExecutionException("Genel Hata : " + ex.Message);
            }
        }
Yukarıda yapmış olduğumuz işlemler aslında bir plug-in yazımı aşamasındaki kalıp işlerimizdir. Servis ayarlarımızı aldık servise hangi kullanıcı ile baglanıcağımızın bilgilerini aldık . Kişi kartı içerisinde kullanıcının girdiği değerleri yakaladık.
Şimdi kişi kartı içerisine kisi seri numarası alanına değerimizi yazalım.
entity.Attributes.Add("new_kisiserinumarasi", 123456);
entity nesnesi içerisindeki Attributes listesine Add method u ile yeni bir değer ekleyelim. Eklemek istediğimiz field ın sistemsel adını verelim. new_kisiserinumarasi , field değerini belirttikten sonra ilgili alana değerimizi yazalım ben burda 123456 değerlerini yazdım bu değerler istenirse bir xml dosyasından da çekilebilir.
Plug-in işlemlerimiz bitmiştir. Şimdi uygulamamızı derleyelim ve dll çıktımızı alalım.
PrePlugin.dll dosyamızı Crm server ımıza plugin registration tool ile yukleyip test edebiliriz.