Microsoft Dynamics CRM üzerinde program geliştiriren herkes veri yazarken ve
veri okurken web servisinden faydalanmamız gerektiğini bilir. (Veri okurken ek
olarak fetchxml ve filteredview da kullanılabilir)
Peki bu işlemler sırasında web servisindeki nesnelere nasıl erişirsirsiniz?
Peki CRM üzerinde çalışacak bir uygulama geliştirdiniz ve bu uygulama web
servislerini kullanarak CRM üzerine veri yazan bir uygulama olsun. Amacınız bu
uygulamayı CRM kullanan firmalara satarak çok para kazanmak. Ama her müşterideki
özelleştirme (customization) birbirinden farklı olacağından web servisleri de
birbirinden farklı olacak. Çünkü standart yöntemde web servisindeki bir sınıf
türetilerek, türetilen sınıftaki nesnelere erişilir. Her firmada nesneler de
birbirinden farklı olabilir. Sonucunda uygulamanızı her müşteri için
derleyecek misiniz?
Bu çok saçma ve çok yorucu olurdu. Bu durumda bize kod zamanında değil çalışma
zamanında nesneleri yönetmemizi sağlayacak bir yapıya ihtiyacımız var. Yani
çalışma zamanında nesneler yaratıp bunlara değer atamalıyız.
İşte
CRM içerisinde bu düşünülmüş, Core Entity yani standart nesne yönetimini yerine
Dynamic Entity modeli ile nesneleri çalışma zamanında oluşturabilir ve
yönetebiliriz. Dynamic Entity yöntemiyle veri sorgulayabilir ve veri
yazabiliriz. Sırasıyla bu ikisini göreceğiz.
Konuyu örnek uygulamamızda irdeleyelim. Örnek uygulamamız için şöyle bir senaryo
düşünelim. Bir web sitemiz olacak ve bu web sitemize insanlar
ad,soyad,e-mail,ilçe ve il bilgilerini yazarak kayıt olacaklar. Fakat biz forma
girilen e-mail'i kullanarak veritabanımızda bu kişinin kayıtlı olup olmadığını
kontrol edeceğiz eğer yoksa müşteri adayı (lead) olarak bu kişiyi CRM'e
kaydedeceğiz.

Kaydet düğmesinin arkasında aşağıdaki kod yer almakta.
Mail adresinin yazılıp yazılmadığına bakıyoruz. Eğer yazıldı ise
dynamicRetrieve metodu ile bu mailinde
birilerinin sistemde olup olmadığına bakıyoruz.
///
<summary>
///
Kaydet Dugmesi Click Olayi
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
protected
void btnSave_Click(object
sender, EventArgs e)
{
if (txtMail.Text
!= "")
{
if (!dynamicRetrieve(txtMail.Text))
{
if (coreCreate())
lblMessage.Text =
"başarıyla oluşturuldu";
if (dynamicCreate())
lblMessage.Text =
"başarıyla oluşturuldu";
}
}
}
Dynamic Entity yönetemiyle veri sorgulamayı göreceğiz ilk önce. (Core
entity ve diğer veri sorgulama yöntemleri ile ilgili olarak 3 makalelik bir yazı
dizisi yayınlamıştım hatırlarsanız o yüzden bu makalede bu konulara girmeyeceğim.)
İlk önce kodu inceleyelim.
1. query nesnemizi oluşturuyoruz
QueryByAttribute
query = new
QueryByAttribute();
2. hangi entity üzerinde
sorgulama yapacağımızı söylüyoruz.
query.EntityName =
EntityName.lead.ToString();
3. sorgulama sonucunda hangi alanları geri istiyoruz
bunu söylüyoruz
ColumnSet cs =
new
ColumnSet();
cs.Attributes =
new
string[] {
"firstname","lastname","address1_city"
};
query.ColumnSet = cs;
4.
koşulumuzu veriyoruz.
query.Attributes =
new
string[] {
"emailaddress1" };
query.Values =
new
object[] { mail };
Aslında buraya kadar ( " select firstname","lastname","address1_city
from filteredlead where emailaddress1 = '"+ mail +"' ") dedik. Ama servis
kullanarak bunu demek daha zahmetli.
5. servisimizi çağırıyoruz. Burada
service(); benim oluşturduğum bir metod. CRM 3.0 ve CRM 4.0
arasında servise bağlanmakta farklılıklar var. Bunu daha önceki bir makalemde
anlattığım için burada anlatmıyorum.
CrmService
MyService = service();
6. işte can alıcı nokta burası geriye core entity
değil dynamic entity istediğimizi söylüyoruz.
retrieved.ReturnDynamicEntities =
true;
7. gelen sınıfı DynamicEntity
türüne çeviriyoruz.
DynamicEntity
entity = (DynamicEntity)responsed.BusinessEntityCollection.BusinessEntities[0];
8. işte ikinci can alıcı nokta burası. gelen DynamicEntity içinden property leri
birer birer çıkartıyoruz.
Gelen property
inin Value attribute 'u içerisinde değer bulunmakta bunu set ediyoruz.
StringProperty
property = (StringProperty)entity.Properties[i];
firstname = property.Value;
Kodun tamamı aşağıdadır.
///
<summary>
///
dynamicRetrieve metdodu Dynamic Entity kavramiyla veri cekmeyi bize gosterecek
///
</summary>
private
bool dynamicRetrieve(string
mail)
{
try
{
//query nesnemizi oluşturuyoruz
QueryByAttribute
query = new
QueryByAttribute();
//hangi entity üzerinde sorgulama yapacağımızı söylüyoruz.
query.EntityName =
EntityName.lead.ToString();
//sorgulama sonucunda hangi alanları geri istiyoruz bunu söylüyoruz
ColumnSet cs =
new
ColumnSet();
cs.Attributes =
new
string[] {
"firstname","lastname","address1_city"
};
query.ColumnSet = cs;
//koşulumuzu veriyoruz.
query.Attributes =
new
string[] {
"emailaddress1" };
query.Values =
new
object[] { mail };
//aslında buraya kadar ( " select
firstname","lastname","address1_city
from filteredlead where emailaddress1 = '"+ mail +"' ") dedik.
//servisimizi
çağırıyoruz.
CrmService
MyService = service();
RetrieveMultipleRequest
retrieved = new
RetrieveMultipleRequest();
//işte can alıcı nokta burası geriye core entity değil dynamic entity
istediğimizi söylüyoruz.
retrieved.ReturnDynamicEntities =
true;
retrieved.Query = query;
RetrieveMultipleResponse
responsed = (RetrieveMultipleResponse)MyService.Execute(retrieved);
if (responsed !=
null &&
responsed.BusinessEntityCollection.BusinessEntities.Length > 0)
{
//gelen sınıfı DynamicEntity türüne
çeviriyoruz.
DynamicEntity
entity = (DynamicEntity)responsed.BusinessEntityCollection.BusinessEntities[0];
string firstname
= "";
string lastname =
"";
string city =
"";
for (int
i = 0; i < entity.Properties.Length; i++)
{
if
(entity.Properties[i].Name.ToLower() == "firstname")
{
//işte
ikinci can alıcı nokta burası. gelen DynamicEntity içinden property leri birer
birer çıkartıyoruz.
//gelen property inin Value attribute 'u içerisinde değer bulunmakta bunu
set ediyoruz.
StringProperty
property = (StringProperty)entity.Properties[i];
firstname = property.Value;
}
if
(entity.Properties[i].Name.ToLower() == "lastname")
{
StringProperty
property = (StringProperty)entity.Properties[i];
lastname = property.Value;
}
if
(entity.Properties[i].Name.ToLower() == "address1_city")
{
StringProperty
property = (StringProperty)entity.Properties[i];
city = property.Value;
}
}
string result =
"<table border=1><tr>";
result +=
"<td>Ad</td>";
result +=
"<td>Soyad</td>";
result +=
"<td>Şehir</td>";
result +=
"</tr>";
result +=
"<tr>";
result +=
"<td>"
+ firstname + "</td>";
result +=
"<td>"
+ lastname + "</td>";
result +=
"<td>"
+ city + "</td>";
result +=
"</tr></table>";
lblMessage.Text =
"eşleşen kayıtlar
bulundu";
lblMessage.Text += result;
return
true;
}
return
false;
}
catch (Exception
ex)
{
HandleException(ex);
return
false;
}
}
Daha önceden sitemize kayıt olmuş test1 kişisinin sitemize tekrar kayıt olmaya
çalıştığını düşünelim uygulama eşleşen bir kayıt bulacağından görüntü şöyle
olacak.
Bu makaleye de burada noktayı koyalım. Unutmayın sırada veri yazma ile
ilgili bir makale var.
Barış KANLICA
Yazılım Uzmanı – Software Specialist
brsk@e-kolay.net
www.cub-e.net
7be17c8d-e19a-4a37-aebb-0df8982a5126|0|.0
Dynamics CRM
microsoft, dynamics, crm, 3.0, 4.0, script, c#, web servisi, core, dynamic, entity, lead, query, sorgulama