IOrganizationService Retrieve Metodu

Bu yazı 25 Mayıs 2019 tarihinde Medium/@dynamics365 altında yayınlanmıştır. 21 Mayıs 2020 tarihinde emregulcan.com altında taşınmıştır.

Merhaba,

Bu yazıda Dynamics 365 CE (CRM) SDK ‘da IOrganizationService interface ‘in sağlamış olduğu Retrieve metodunu inceleyeceğiz.

Retrieve metodu, Dynamics 365 CE (CRM) ‘de herhangi bir kaydı okumamızı / sorgulamamızı sağlamaktadır.

SQL ‘de SELECT sorgusu ile aynı işlemi yapmaktadır, fakat sonunda WHERE kriterine ID parametresi eklenerek sadece ilgili kaydı almamızı sağlar.

Önemli Noktalar

  • Retrieve metodu ile kayıt bilgisine ulaşmak için ilgili kaydın Dynamics 365 CE (CRM) ID bilgisine ihtiyacımız vardır.
  • Retrive metodu 3 parametre almaktadır. Bunlar string olarak Entity (Varlık) LogicalName bilgisi, GUID formatında ilgili kaydın Id bilgisi ve ColumnSet türünde sonuçta görmek istediğimiz alanları içeren nesnedir.
  • Retrieve metodunun geri dönüş türü Entity ‘dir. Eğer göndermiş olduğumuz ID ile ilişkili bir kayıt varsa Entity olarak sonuç döner, hatalı bir ID bilgisi girmişsek ya da ilgili varlıkta bu ID ile ilişkili bir kayıt yoksa -2147220969 kodlu Object Does Not Exist hatası döner. Hata mesajının formatı {EntityLogicalName} With Id = {Entity Record Id} Does Not Exist ‘dir. Örnek olarak contact With Id = a5161572-876b-c911-a888-001d3aa8652a Does Not Exist. Dolayısıyla bu metodu try – catch içinde kullanmak ve gerekli durumlarda kullanıcıya hata göstermek ve log kayıtlarına yazmak doğru olacaktır.
  • Retrieve metodu sonuç olarak sadece Dynamics 365 CE (CRM) ‘de data içeren alanları (Column / attribute) içermektedir. Örnek olarak ilgili Entity ‘de 30 alan varsa ve sorguladığınız kayıtta sadece 10 alan dolu ise sonuç kümenizde 10 alan olacaktır. Ayrıca bu alanlarda Field Level Security ‘de uygulanmaktadır, dolayısıyla dönen alanlar buna göre değişecektir.
  • Retrieve metodu ile sadece ilgili kaydı okuyabiliriz, ilişkili alt kayıtlarını aynı sonuç kümesi içinde alamayız.
  • İşlem yapan kullanıcı (IOrganizationService ‘i oluşturan kimlik sahibi ya da CallerId olarak verilmiş SystemUser) ilgili Entity (Varlık) için Read (Okuma) yetkisine sahip olmalıdır.

İlgili Entity (Varlık) için Ownership (Sahiplik) ayarı User or Team (Kullanıcı veya Takım) ise işlem yapan kullanıcının Read yetkisi buna göre olmalıdır, eğer kayıt üzerinde yetki sahibi değilse Dynamics 365 CE (CRM) aşağıdaki gibi bir hata fırlatacaktır.

Principal user (Id=xxxxx, type=8, roleCount=X, privilegeCount=X, accessMode=x, is missing prvReadContact privilege (Id=xxxxx)

Aslında bu hata sadece Retrieve için değil, tüm operasyonlar için geçerlidir. Dikkat ederseniz işlem yapan kullanıcının (Principal user) prvReadContact yetkisinin olmadığını belirtiyor.

.NET Projesi – Örnek Kod

.NET projelerimizde Microsoft.CrmSdk.CoreAssemblies kütüphanelerini kullanarak Dynamics 365 CE (CRM) ‘de Retrieve işlemi yapabiliriz. Bu kütüphaneleri NuGet üzerinden projemize dahil edebiliriz.

Dynamics 365 CE (CRM) SDK kütüphanelerini projemize nasıl ekleyeceğimizi daha önce burada detaylı olarak anlatmıştım.

IOrganizationService.Retrieve metodu kullanımı - 01
IOrganizationService.Retrieve metodu kullanımı – AllColumns
IOrganizationService.Retrieve metodu kullanımı - 02
IOrganizationService.Retrieve metodu kullanımı – 02

Yukarıdaki 2 örnekte tek farklılık ColumnSet parametresine vermiş olduğumuz değerler.

İlk örnekte new ColumnSet(true) olarak gönderdiğimiz değerde true değeri tüm alanları (Column / attribute) almak istediğimizi belirtmekte. SQL ‘de karşılığı SELECT * FROM [tabloadi] komutudur, burada gönderdiğimiz true aslında * ‘dır.

İkinci örnekte ise new ColumnSet("firstname", "lastname", "emailaddress1", …..) olarak değer gönderdik. Burada vermiş olduğumuz değerler ilgili Entity için geçerli olan Column / attribute isimleridir. Böylece sadece ihtiyacımız olan kadar alanı sorguluyoruz. SQL ‘de karşılığı SELECT firstname, lastname, emailaddress1 FROM [tabloadi] komutudur.

Performans sorunu yaşamamak için sadece ihtiyacımız olan alanları sorgulamak çok daha doğru olacaktır, bu nedenle ikinci yöntemi kullanmanızı öneririm.

Retrieve metodunun geri dönüş türü Entity nesnesidir.

İlk örnek üzerinden dönen datayı incelediğimizde aşağıdaki gibi bir sonuç olacaktır.

IOrganizationService.Retrieve - Sonuç
IOrganizationService.Retrieve – Sonuç
IOrganizationService.Retrieve - Sonuç
IOrganizationService.Retrieve – Sonuç

Daha önce Entity kavramını anlattığım yazıda bahsettiğim üzere Attributes property KeyValuePair<string, object> olarak değer içermektedir, dolayısıyla bu property içinde for ya da foreach ile dönerek ilgili Column (attribute) değerini okuyabiliriz.

Burada önemli olan nokta, işlem yapacağınız alanın (Column / attribute) ilgili kayıtta boş olması ve dolayısıyla dönen sonuçta bulunmaması ihtimalini göz önüne alarak işlem yapmanız.

Örnek olarak emailaddress1 alanı için var email = data['emailaddress1']; olarak okuma işlemi yaptığımızı düşünelim.

Eğer ilgili kayıtta bu alan data içeriyorsa ve Attributes içinde yer alıyorsa sorunsuz olarak email değişkenine bu değeri atayabiliriz.

Fakat sonuç kümemizde emailaddress1 yoksa bu durumda The given key was not present in the dictionary hatası alırız. Bu Dynamics 365 CE (CRM) hatası değil, .NET Framework ‘e ait bir hatadır ve data['KEY'] olarak belirttiğimiz Key değerinin ilgili Collection ‘da bulunmadığını belirtmektedir.

The given key was not present in the dictionary hatası, Dynamics 365 CE (CRM) geliştirmelerinde en çok alınan hata olabilir 🙂

Bu hatanın önüne geçmek için dönen kayıtta ilgili alanın var olup olmadığını kontrol etmeli ve eğer varsa değerini okumalıyız. Bunun için aşağıdaki 2 yöntemden istediğinizi kullanabilirsiniz;

IOrganizationService.Retrieve - Sonuç - Alan Kontrolü
IOrganizationService.Retrieve – Sonuç – Alan Kontrolü

İlk yöntem klasik if ile ilgili Collection içinde Key olup olmadığını kontrol edip, eğer varsa değerini okuyoruz.

İkinci yöntem ise Dynamics 365 CE (CRM) SDK ‘da yer alan Generic bir metot ve vermiş olduğumuz parametreye göre ilgili alanı kontrol edip, değerini <T> ‘de belirttiğimiz türe dönüştürmektedir. Bu metodun kullanımında önemli olan nokta ilgili alanın data türünü bilmemizdir.

GetAttributeValue<T> metodunun en önemli özelliği; sorguladığımız alan sonuç kümesinde yoksa hata oluşturmak yerine <T> ‘ye vermiş olduğumuz değerin default değerini ya da Null değer dönmesidir.

GetAttributeValue<T> ‘nin geri dönüş değerleri için detaylı bilgiye buradan erişebilirsiniz.

Attributes üzerinden okuyacağımız tüm değerler database ‘de olan değerlerdir, eğer işlem yapan kullanıcının dil, timezone vb. ayarlarına göre Dynamics 365 CE (CRM) arayüzünde görüldüğü gibi değer okumak istersek FormattedValues üzerinden işlem yapabiliriz.

FormattedValues, KeyValuePair<string, string> olarak değer tutmaktadır, dolayısıyla tüm alanlar için geri dönüş tipi string olacaktır.

Örnek olarak gendercode alanı üzerinden cinsiyet bilgisini okumak istersek aşağıdaki gibi işlem yapabiliriz.

Entity.GetAttributeValue<T> ve Entity.FormattedValues ile data okumak
Entity.GetAttributeValue ve Entity.FormattedValues ile data okumak

Bu örnekte ilk satır OptionSetValue türünde değer dönecek, bu durumda genderTypeCode.Value ile ilgili alanın database değerini alabiliriz. Bu alan OptionSet olduğu için Value değeri Integer ‘dır.

İkinci satırda FormattedValues["gendercode"] ise, işlem yapan kullanıcının Dil ayarlarına göre (varsa) ilgili alanın değerini string olarak dönecektir, yani Erkek, Kadın gibi bir değer içerecektir. Eğer kullanıcı dilinde çeviri bilgisi yoksa default değerleri dönecektir.

Entity.GetAttributeValue<T> ve Entity.FormattedValues ile data okumak
Entity.GetAttributeValue ve Entity.FormattedValues ile data okumak

Umarım faydalı bir yazı olmuştur.


IOrganizationService metotları için oluşturduğum Index yazısına buradan ulaşabilirsiniz.

Dynamics 365 CE (CRM) SDK konusunda ilgili tüm yazılara tek nokta üzerinden ulaşmak isterseniz http://www.emregulcan.com/dynamics365-sdk adresine bakabilirsiniz.

You may also like...

Bir yanıt yazın

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

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.