CRM 2011 - XrmServiceToolkit - Exemplo RetrieveAttributeMetadata

by Pedro Azevedo 17. December 2013 15:44

Boas pessoal,

Aproveitando o último post onde utilizei uma chamada SOAP “inteira”, ou seja, tive que colocar todo o request e comparar como poderíamos ter feito a mesma coisa com o uso de a biblioteca XrmServiceToolkit que já apresentei antes aqui no blog.

Para além de menos código, esta biblioteca já resolve um dos problemas que encontraram com o último post, não funciona com o IE10 (nem em browsers como Firefox e Chrome já que não é standard da W3C), isto porque o IE10 já não suporta XPath e por consequência não consegue executar o seguinte código:

selectSingleNode("c:OptionSet//c:Options");

Para resolver este problema usei JQuery para resolver este problema, mas se tivéssemos a usar a biblioteca XrmServiceToolkit este problema já estava resolvido, já que esta biblioteca está sempre a ser atualizada.

Substituindo o código que usava o método anterior por jQuery fica assim:

 

function getOptionSet (entityLogicalName, attributeLogicalName, retrieveAsIfPublished) {				
	var context = GetGlobalContext();
	var serverUrl = context.getServerUrl();
	var SoapPath = serverUrl + "/XRMServices/2011/Organization.svc/web";
	var MetadataId = "00000000-0000-0000-0000-000000000000";
	
	var request = " <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Body>"
	request += "<Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
	request += "<request i:type=\"a:RetrieveAttributeRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">";
	request += "<a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
	request += "<a:KeyValuePairOfstringanyType>";
	request += "<b:key>EntityLogicalName</b:key>";
	request += "<b:value i:type=\"c:string\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">" + entityLogicalName + "</b:value>";
	request += "</a:KeyValuePairOfstringanyType>";
	request += "<a:KeyValuePairOfstringanyType>";
	request += "<b:key>MetadataId</b:key>";
	request += "<b:value i:type=\"ser:guid\"  xmlns:ser=\"http://schemas.microsoft.com/2003/10/Serialization/\">" + MetadataId + "</b:value>";
	request += "</a:KeyValuePairOfstringanyType>";
	request += "<a:KeyValuePairOfstringanyType>";
	request += "<b:key>RetrieveAsIfPublished</b:key>";
	request += "<b:value i:type=\"c:boolean\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">" + retrieveAsIfPublished + "</b:value>";
	request += "</a:KeyValuePairOfstringanyType>";
	request += "<a:KeyValuePairOfstringanyType>";
	request += "<b:key>LogicalName</b:key>";
	request += "<b:value i:type=\"c:string\"   xmlns:c=\"http://www.w3.org/2001/XMLSchema\">" + attributeLogicalName + "</b:value>";
	request += "</a:KeyValuePairOfstringanyType>";
	request += "</a:Parameters>";
	request += "<a:RequestId i:nil=\"true\" /><a:RequestName>RetrieveAttribute</a:RequestName></request>";
	request += "</Execute>";
	request += "</soapenv:Body></soapenv:Envelope>";
	
	var req = new XMLHttpRequest();
	req.open("POST", SoapPath, false);
	req.setRequestHeader("Accept", "application/xml, text/xml, */*");
	req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
	req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
	req.send(request);

	if (req.responseXML != null) {
		return req.responseXML;
	}
}

 

Ficando a chamada e o parsing do resultado assim:

var optionXML = getOptionSet(entityName, fieldName, true);
var a =  $(optionXML.xml).find('OptionMetadata');
a.each(function(){
		  var text = $(this).find('Label').find('UserLocalizedLabel').find('Label').text();
		  $(myList).append('<option>' + text + '</option>');
});

E agora vejam como fica tirando partido da biblioteca XrmServiceToolkit:

var OptionSetControl = XrmServiceToolkit.Soap.RetrieveAttributeMetadata(entityname, fieldname, true);
for(var i = 0; i < OptionSetControl[0].OptionSet.Options.length; ++i)
{
	$(myList).append('<option>' + OptionSetControl[0].OptionSet.Options[i].Label.UserLocalizedLabel.Label + '</option>')
}

Uma diferença ENORME e sim funciona :P.

Mais uma vez fica a solução com os dois Recursos Web, um com a chamada SOAP e outra com o recurso a XrmServiceToolkit. Bem como todas as dependências.

 

Até a próxima.

ListadeEstados_1_0_0_1.zip (66,54 kb)

Tags: ,

Comments (2) -

Keven Magee
Keven Magee United States
6/28/2015 2:10:01 PM #

This is very interesting, You are a very skilled blogger. I've joined your rss feed and look forward to seeking more of your wonderful post. Also, I have shared your website in my social networks!|

Reply

agua bendita swimwear
agua bendita swimwear United States
8/5/2015 5:21:07 PM #

I gotta  favorite this  site it seems  very helpful   extremely helpful

Reply

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading

About

Muito bem casado, Pai babado e um gosto muito grande pela tecnologia.

Tenho um lema "Sharing is Learning"

Mais aqui -> http://www.psazevedo.com

Month List