0

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

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ı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org

Bu İçeriğe Tepkin Ne Oldu?
  • 0
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 0
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

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.Uzunca bir süredir Londra'da yaşayan Barış Kanlıca ve kurucusu olduğu Mawens Business Solution'da danışmanlık hizmeti vermeye devam etmektedir.

Yazarın Profili
İlginizi Çekebilir
CRM ve Raporlar

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir