İlginizi Çekebilir
  1. Ana Sayfa
  2. Dynamics CRM
  3. Dynamics CRM 2015 Kodlama Mimarisi – Bölüm 3 – Create/Update/Delete Metotları

Dynamics CRM 2015 Kodlama Mimarisi – Bölüm 3 – Create/Update/Delete Metotları

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 metotta işlem yapmaya yetkili olması gerekmektedir.

Create Metodu CRM 2015 içerisinde bir entity içerisinde yeni bir nesne oluşturmamıza olanak tanır. Metot 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. Metot 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

public class Result

{

public string Message { get; set; }

public bool isError { get; set; }

public Object 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.

public class Base
{

public int ErrorCode { get; set; }

public string 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.

public Result Create(Entity EntityForCreate)
{

try

{

Service service = Service.GetService();

if (service == null)

throw new Exception(“Service is null”);

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

throw new Exception(service.ErrorDetail);

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

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

System.Diagnostics.EventLogEntryType.Information);

return new Result(“”, 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);

return new Result(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;

public Result Update(Entity EntityForUpdate, Guid EntityID)

{

try

{

Service service = Service.GetService();

if (service == null)

throw new Exception(“Service is null”);

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

throw new Exception(service.ErrorDetail);

service.OrganizationService.Update(EntityForUpdate);

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

System.Diagnostics.EventLogEntryType.Information);

return new Result(“”, 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);

return new Result(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;

public Result Delete(string EntityName, Guid EntityID)

{

try

{

Service service = Service.GetService();

if (service == null)

throw new Exception(“Service is null”);

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

throw new Exception(service.ErrorDetail);

service.OrganizationService.Delete(EntityName, EntityID);

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

System.Diagnostics.EventLogEntryType.Information);

return new Result(“”, 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);

return new Result(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;

public class Process : Base

{

public Result Create(Entity EntityForCreate)

{

try

{

Service service = Service.GetService();

if (service == null)

throw new Exception(“Service is null”);

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

throw new Exception(service.ErrorDetail);

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

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

System.Diagnostics.EventLogEntryType.Information);

return new Result(“”, 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);

return new Result(ErrorDetail, true);

}

}

public Result Update(Entity EntityForUpdate, Guid EntityID)

{

try

{

Service service = Service.GetService();

if (service == null)

throw new Exception(“Service is null”);

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

throw new Exception(service.ErrorDetail);

service.OrganizationService.Update(EntityForUpdate);

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

System.Diagnostics.EventLogEntryType.Information);

return new Result(“”, 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);

return new Result(ErrorDetail, true);

}

}

public Result Delete(string EntityName, Guid EntityID)

{

try

{

Service service = Service.GetService();

if (service == null)

throw new Exception(“Service is null”);

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

throw new Exception(service.ErrorDetail);

service.OrganizationService.Delete(EntityName, EntityID);

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

System.Diagnostics.EventLogEntryType.Information);

return new Result(“”, 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);

return new Result(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.

static void Main(string[] args)

{

try

{

Entity lead = new Entity(“lead”);

lead.Attributes[“subject”] = “Fuardan Gelenler”;

lead.Attributes[“firstname”] = “Barış”;

lead.Attributes[“lastname”] = “KANLICA”;

lead.Attributes[“companyname”] = “Omerd Business Solutions”;

Process process = new Process();

Result result = process.Create(lead);

if (result.isError)

throw new Exception(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 🙂

Bu konuyla ilgili sorularınızı https://forum.mshowto.org linkini kullanarak ulaşacağınız forum sayfamızda sorabilirsiniz.

Referanslar

https://www.mshowto.org

Yorum Yap

Yazar Hakkında

Barış Kanlıca firmalara CRM ve yazılım konusunda danışmanlık yapmaktadır ve yazılım eğitimleri vermektedir. Dynamics CRM alanında yaptığı çalışmalarından dolayı Microsoft kendisine bu alanda sadece 55 kişide olan MVP(Most Valuable Professional) unvanını ve ödülünü vermiştir. Barış Kanlıca birçok üniversite ve seminerde konuşmacı olmaktadır. Kendisi INETA topluluğunun bir konuşmacısıdır. Ayrıca www.yazgelistir.com, www.yazilimgunlugu.com ve www.nedirtv.com sitelerinde bölüm editörüdür.

Yorum Yap