Crm fromlarında yapacağımız işlemler için bazen crm web servislerini kullanmamız gerekir.Mesela account entity sinde primary contact lookup ına ilişkili contact ın mail adresine veya başka bir attributune ihtiyaç duyabiliriz bu ihttiyaç başka entity ilşişkilerindede oluşabilir.Bazı işlemler içinse entityler arasında ilişki olmasına gerek yoktur.Yani fromun ve field ların eventlerinde crm servislerini kullanarak veri sorgulaması yapmak istediğimizde fetch xml e başvururuz.Fetch xml ile veri sorgulamak için ise crm servisini kullanan bir SOAP (Simple Object Access Protocol) nesnesi oluşturmamız gerekir.
SOAP Nedir?
Veri sorgulamasının yapılabilmesi için istemci ve web servisi arasındaki haberleşmeyi sağlayacak bir Proxy nesnesi oluşturmamız gerekir.İstemci uygulama crm servisini kullanmak istediğinde, yani bu servis üzerinden bir metodu çağırmak istediğinde, bu talebi proxy nesnesinden ister. Proxy nesnesi ise bu talebi , web servisine iletir. Web servisi gelen talebi değerlendirir ve ürettiği cevabı yine istemci uygulamadaki proxy nesnesine gönderir. Proxy nesneside sonuçları, uygulama ortamına iletir.
İstemci uygulama, proxy nesnesinde normal olarak talepte bulunur ve cevapları alır. Buradaki ilişki normal olarak bir nesne.metod ilişkisidir. Ancak proxy nesnesi bu mesajları, esnek, kolay okunabilir, herhangibir engele takılmayacak bir hale getirmek durumundadır. Bu iş için XML tabanlı bir bilgi akışı kullanılır. Yinede hareket edecek mesajların uygun bir formasyonda taşınmaları ve web servisinin anlayabileceği bir dilde ifade edilebilmeleri daha doğrudur. Bu noktada SOAP (Simple Object Access Protocol – Basit Nesne Erişim Antlaşması) devreye girer.SOAP, web servisleri ve istemciler arasında gidip gelecek mesajların, XML tabanlı olarak belirlendiği standartlara uygun formatta taşınmasını sağlayan bir protokoldür.
SOAP protokolü, web servisleri ile istemciler arasında gerçekleştirilen veri alışverişinde, karşılıklı olarak akıcak mesajların nasıl ve ne şekilde paketleneceğini yada başka bir deyişle bilgilerin nasıl kapsülleneceğini belirtir. SOAP, özünde XML tabanlı mesajların oluşturulmasını belirtir. Bu nedenle SOAP protokolünü uygulayan mesajlar (ki bunlar SOAP Mesajı olarak adlandırılır), herhangibir ağ ortamında hiç bir sorunla karşılaşmadan uzak makineler arasında iletilebilirler. SOAP protokolü, 4 temel üzerine inşa edilmiştir.
-Envelope (Zarf)
-Veri Kodlama Kuralları (Data Encoding Rules)
-Mesaj Değişim Modeli (Message Exchange Model)
-Veri Bağlama
SOAP protokolünün dayandığı bu temel kurallar içerisinde en önemlisi Envelope kısmıdır. Bir SOAP mesajı mutlaka bir zarf olarak teşkil edilmeli ve Zarf kurallarına göre tasarlanmalıdır.Bir soap zarfı soap header ve soap body den oluşur. SOAP Body kısmında yapılan metod çağırımlarına ilişkin bilgiler ile çağrı sonucu istemcilere gönderilecek cevaplara ait xml tabanlı bilgiler yer alır. Diğer temellerin uygulanması zorunlu değildir. Veri kodlama kuralları, özellikle serileştirilen nesneler için bir model sunar.
Örnek bir javascript kodu ile işlemin nasıl yapılacağını görelim:
Account formumuzun onload() eventine aşağıdaki kodu yazalım.
var fetchXml = "<fetch mapping='logical'>" + "<entity name='contact'>" + "<attribute name='emailaddress1'/>" +
"<filter type='and'>" +
"<condition attribute='contactid' operator='eq' value='" + crmForm.all.primarycontactid.DataValue[0].id + "' />" +
"</filter>" +
"</entity>" + "</fetch>";
var xmlDoc = createSOAPMessage(fetchXml);
var xmlVal= xmlDoc.selectSingleNode("resultset/result/emailaddress1");
var emailaddress=xmlVal.text;
alert(emailaddress);
function createSOAPMessage(fetchXml)
{
var soapHeaderXml = "<soap:Envelope " +
"xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' "+
"xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' "+"xmlns:xsd='http://www.w3.org/2001/XMLSchema'>"+
GenerateAuthenticationHeader() +
"<soap:Body>";
var soapFooterXml = "</soap:Body></soap:Envelope>";
// XMl encode
fetchXml = fetchXml.replace(/&/g, '&');
fetchXml = fetchXml.replace(/</g, '<');fetchXml = fetchXml.replace(/>/g,
'>');
fetchXml = fetchXml.replace(/'/g, ''');
fetchXml = fetchXml.replace(/"/g, '"');
fetchXml = "<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>" +
"<fetchXml>" + fetchXml + "</fetchXml>" +
"</Fetch>";
var soapXml = soapHeaderXml + fetchXml + soapFooterXml;
var crmServiceUrl = SERVER_URL.replace(ORG_UNIQUE_NAME,"");
crmServiceUrl += "mscrmservices/2007/crmservice.asmx"
// Create the XMLHTTP object for the execute method.
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
xmlhttp.open("POST", crmServiceUrl , false);xmlhttp.setRequestHeader(
"Content-Type", "text/xml; charset=utf-8");xmlhttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Fetch");
//Send the XMLHTTP object.
xmlhttp.send(soapXml);
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");xmlDoc.async=false;
xmlDoc.loadXML(xmlhttp.responseXML.text);
return xmlDoc; }
formumuzu publish edip örnek bir kayıt için çalıştırırsak mail adresinin bize döndüğünü görebiliriz.
İyi Çalışmalar...