Makale Özeti

CRM servis nesnesi bize kayıtlar üzerinde işlem yapma özelliği sağlamaktadır. Servis içinden yapmak istediğimiz harekete uygun metodu çağırmamız gerekmektedir. Tabii burada unutulmaması gereken konu servisi çağıran kullanıcının çağrılan metodda işlem yapmaya yetkili olması gerekmektedir.

Makale

CRM servis nesnesi bize kayıtlar üzerinde işlem yapma özelliği sağlamaktadır. Servis içinden yapmak istediğimiz harekete uygun metodu çağırmamız gerekmektedir.  Tabii burada unutulmaması gereken konu servisi çağıran kullanıcının çağrılan metodda işlem yapmaya yetkili olması gerekmektedir.

Create Metodu CRM 2011 içerisinde bir entity içerisinde yeni bir nesne oluşturmamıza olanak tanır. Metod parametre olarak entity türünden bir nesne alır ve yeni oluşturulmuş nesnenin GUID türünden değerini geri döndürür.

Aşağıdaki örnek bu metodun late-bound sınıfla kullanımını göstermektedir.

// Entity nesnesinin yeni bir instance’ini olusturuyoruz

Entity account = new Entity("account");

// Gerekli attribute’lara atama yapiyoruz.

account["name"] = "Örnek Firma";

// Örnek Firma adında bir firma karti olusturuyoruz.

_accountId = ioService.Create(account);

 

Aşağıdaki örnek bu metodun early-bound sınıfla kullanımını göstermektedir.

Contact contact = new Contact()

{

    FirstName="Deneme",

    LastName="Kisisi",

    Address1_City="İstanbul",

};

Guid contactGuid =_service.Create(contact);

 

Update Metodu CRM 2011 içerisinde bir entity içerisinde bir nesneyi güncellememizi sağlar. Metod parametre olarak entity türünden bir nesne alır. Güncellenecek nesnenin id’si mutlaka parametre olarak verilmelidir.

Guid gContact = new Guid("7bE545CCD3-9A3A-E011-BA8B-78E7D1623F9D");

 

Contact contact = new Contact()

{

     ContactId = gContact,

     FirstName="Test",

     LastName="Kisisi",

     Address1_City="Ankara",

};

_service.Update(contact);


Delete Metodu CRM 2011 içerisinde Id’sini verdiğiniz bir nesneyi sistemden silmeye yarar. Metod parametre olarak silinecek nesnenin Id’si yanında bu nesnenin türünü ister.

Guid gContact = "7bE545CCD3-9A3A-E011-BA8B-78E7D1623F9D";

_service.delete("contact", gContact);

 

Bir programcı olarak çok standart olan bu işlemleri isterseniz bir class mantığı altında birleştirelim. Bu sayede daha yönetilebilir bir CRUD (Create, Read, Update, Delete) yapısı oluşturabiliriz. Ben bu sınıf için Process adını kullandım ve Process sınıfı içerisinde şu anda Oluşturma, Güncelleme ve Silme işlerimi yapmaktayım. İlerleyen makalelerde Okuma yapılarını incelerken onları da bu sınıfa dâhil ederiz.

Burada öncelikle açıklamalıyım ki bir önceki makalede yer alan Singleton tasarım deseniyle CRM servisini oluşturma yazımdaki class’tan faydalanarak servisi çağırma işlemini gerçekleştirdim. O yazıyı okumak isterseniz buraya tıklayınız

Ek olarak hata olaylarını kontrol etmek için Result isimli bir class kullandım bu class’ın içeriği şu şekilde

    publicclassResult

    {

        publicstring Message { get; set; }

        publicbool isError { get; set; }

        publicObject BusinessObject { get; set; }

 

        public Result(string _Message, bool _isError, Object _BusinessObject)

        {

            Message = _Message;

            isError = _isError;

            BusinessObject = _BusinessObject;

        }

 

        public Result(string _Message, bool _isError)

        {

            Message = _Message;

            isError = _isError;

            BusinessObject = null;

        }

    }

Görüldüğü üzere çok basit bir class bize sonucun başarılı mı başarısız mı olduğunu döndürecek o kadar.

Bunun haricinde bir de Base isimli bir class’ım var ki Process sınıfını aslında bu class’dan türetmekteyim. Şu anda bu class’ı sadece ErrorNumber ve ErrorDetail gibi hata oluştuğunda bilgi almamızı sağlayacak iki property ile kullanmaktayım ama ileride farklı propertyler de eklenecek.

    publicclassBase
    {

        publicint ErrorCode { get; set; }

        publicstring ErrorDetail { get; set; }

         }

Bu iki class’ımı açıkladıktan sonra asıl yapıda kullanacağımız metodlara gelelim. İlk önce create metodunu inceleyelim. Hatırlayacağınız üzere CRM servisinde Create metdonun Update metodundan tek farkı id’ye ihtiyaç duymamasıydı. Çünkü bu metod id’yi üretip bize geri döndürecek. Ben de kurguyu buna göre planladım.

publicResult Create(Entity EntityForCreate)
       {

            try

            {

                Service service = Service.GetService();

 

                if (service == null)

                    thrownewException("Service is null");

                if (service != null && service.ErrorCode > 0)

                    thrownewException(service.ErrorDetail);

 

                Guid EntityID = service.OrganizationService.Create(EntityForCreate);

 

                DetailedLog.CreateLog("Entity Created! Type: " + EntityForCreate.LogicalName + ", ID : " + EntityID,

                    System.Diagnostics.EventLogEntryType.Information);

 

                returnnewResult("", false, EntityID);

            }

            catch (Exception ex)

            {

                ErrorCode = 100;

                ErrorDetail = ExceptionHandler.HandleException(ex);

                DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name

                    + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString()

                    + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error);

 

                returnnewResult(ErrorDetail, true);

            }

        }

Aslında yapı çok basit servis nesnemi çağırıyorum, servis oluşurken hata var mı diye bakıyorum eğer hata varsa hatayı fırlatıyorum. (bu noktada şunu belirtmeliyim ki catch bölümünde yer alan DetailLog ve ExceptionHandler benim daha önceden yazmış olduğum hata yönetimi ile ilgili class’lar catch bölümünü siz de istediğiniz gibi düzenleyebilirsiniz) Eğer hata yok ise OrganizationService metodumu kullanarak nesnemi oluşturuyorum. Bu noktada da bir hata yoksa servis bana oluşturduğu nesnenin id’sini döndürüyor yok eğer hata varsa zaten kod catch bloğuna düşüyor. İşte bu kadar.

Şimdi gelin diğer metodlara bir göz atalım;

        publicResult Update(Entity EntityForUpdate, Guid EntityID)

        {

            try

            {

                Service service = Service.GetService();

 

                if (service == null)

                    thrownewException("Service is null");

                if (service != null && service.ErrorCode > 0)

                    thrownewException(service.ErrorDetail);

 

                service.OrganizationService.Update(EntityForUpdate);

 

                DetailedLog.CreateLog("Entity Updated! Type: " + EntityForUpdate.LogicalName + ", ID : " + EntityID,

                    System.Diagnostics.EventLogEntryType.Information);

 

                returnnewResult("", false);

            }

            catch (Exception ex)

            {

                ErrorCode = 100;

                ErrorDetail = ExceptionHandler.HandleException(ex);

                DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name

                    + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString()

                    + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error);

 

                returnnewResult(ErrorDetail, true);

            }

        }

Update metodu neredeyse Create metodunun aynısı tek fark daha önce de ifade ettiğim gibi güncellenecek nesnenin id’sini alması. Bunu almalı ki neyi güncellediğini bilebilsin. Aslında burada şöyle bir mantıksal kargaşa var update metodu ek olarak id’yi almamakta zaten sizin ona update edilmesi için vereceğiniz entity’nin Id alanına vermelisiniz. Benim burada ek olarak almamdaki amaç onu loglamak için.

Bir de Delete metoduna göz atalım;

publicResult Delete(string EntityName, Guid EntityID)

        {

            try

            {

                Service service = Service.GetService();

 

                if (service == null)

                    thrownewException("Service is null");

                if (service != null && service.ErrorCode > 0)

                    thrownewException(service.ErrorDetail);

 

                service.OrganizationService.Delete(EntityName, EntityID);

 

                DetailedLog.CreateLog("Entity Deleted! Type: " + EntityName + ", ID : " + EntityID,

                    System.Diagnostics.EventLogEntryType.Information);

 

                returnnewResult("", false);

            }

            catch (Exception ex)

            {

                ErrorCode = 100;

                ErrorDetail = ExceptionHandler.HandleException(ex);

                DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name

                    + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString()

                    + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error);

 

                returnnewResult(ErrorDetail, true, null);

            }

        }

Delete metodu entity’nin adını ve id’sini almakta. Bu iki veriyi de servise vermekteyiz.

Class’ın tamamına bakacak olursak;

publicclassProcess : Base

    {

        publicResult Create(Entity EntityForCreate)

        {

            try

            {

                Service service = Service.GetService();

 

                if (service == null)

                    thrownewException("Service is null");

                if (service != null && service.ErrorCode > 0)

                    thrownewException(service.ErrorDetail);

 

                Guid EntityID = service.OrganizationService.Create(EntityForCreate);

 

                DetailedLog.CreateLog("Entity Created! Type: " + EntityForCreate.LogicalName + ", ID : " + EntityID,

                    System.Diagnostics.EventLogEntryType.Information);

 

                returnnewResult("", false, EntityID);

            }

            catch (Exception ex)

            {

                ErrorCode = 100;

                ErrorDetail = ExceptionHandler.HandleException(ex);

                DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name

                    + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString()

                    + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error);

 

                returnnewResult(ErrorDetail, true);

            }

        }

 

        publicResult Update(Entity EntityForUpdate, Guid EntityID)

        {

            try

            {

                Service service = Service.GetService();

 

                if (service == null)

                    thrownewException("Service is null");

                if (service != null && service.ErrorCode > 0)

                    thrownewException(service.ErrorDetail);

               

                service.OrganizationService.Update(EntityForUpdate);

 

                DetailedLog.CreateLog("Entity Updated! Type: " + EntityForUpdate.LogicalName + ", ID : " + EntityID,

                    System.Diagnostics.EventLogEntryType.Information);

 

                returnnewResult("", false);

            }

            catch (Exception ex)

            {

                ErrorCode = 100;

                ErrorDetail = ExceptionHandler.HandleException(ex);

                DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name

                    + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString()

                    + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error);

 

                returnnewResult(ErrorDetail, true);

            }

        }

 

        publicResult Delete(string EntityName, Guid EntityID)

        {

            try

            {

                Service service = Service.GetService();

 

                if (service == null)

                    thrownewException("Service is null");

                if (service != null && service.ErrorCode > 0)

                    thrownewException(service.ErrorDetail);

 

                service.OrganizationService.Delete(EntityName, EntityID);

 

                DetailedLog.CreateLog("Entity Deleted! Type: " + EntityName + ", ID : " + EntityID,

                    System.Diagnostics.EventLogEntryType.Information);

 

                returnnewResult("", false);

            }

            catch (Exception ex)

            {

                ErrorCode = 100;

                ErrorDetail = ExceptionHandler.HandleException(ex);

                DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name

                    + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString()

                    + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error);

 

                returnnewResult(ErrorDetail, true, null);

            }

        }

    }

Class’ımızı bu şekilde oluşturduktan sonra gelin onu bir konsol uygulaması yardımıyla çağıralım ve iş başında görelim.

staticvoid Main(string[] args)

        {

            try

            {

                Entity lead = newEntity("lead");

                lead.Attributes["subject"] = "Fuardan Gelenler";

                lead.Attributes["firstname"] = "Barış";

                lead.Attributes["lastname"] = "KANLICA";

                lead.Attributes["companyname"] = "Omerd Business Solutions";

 

                Process process = newProcess();

                Result result = process.Create(lead);

                if (result.isError)

                    thrownewException(result.Message);

 

                Console.WriteLine("Lead created : " + result.BusinessObject.ToString());

                Console.ReadLine();

            }

            catch (Exception ex)

            {

                Console.WriteLine("Error : " + ex.Message);

                Console.ReadLine();

            }

        }

 

Gördüğünüz üzere Entity nesnemi çağıyor ve ona lead adını veriyorum. İçerisi istediğim bilgiler ile dolduruyor ve Process class’ımın içindeki Create metodu vasıtasıyla CRM içerisinde oluşmasını sağlıyorum. İşte hepsi bu kadar :)