Usuário com melhor resposta
Recuperar Conta com Javascript - SOAP - CRM 2011

Pergunta
-
Oi, estou precisando de ajuda para montar um xml para recuperar dados da entidade Conta via SOAP/Javascript/CRM 2011. Quero pegar o endereço de um cliente pesquisando pelo seu ID.
O código que montei não dá erro, mas não retorna nenhum dado. Segue abaixo o código que estou utilizando:-------------------------------------------------------------------------------------------------------------------------------------------
function getAccount() {
var customerid = "8C07672C-3644-E011-8722-1CC1DEE87ACD";
var address = getAddressAccount("account","accountid","address1_line1",customerid);
alert(address);
}
function getAddressAccount (sEntityName, sFilterAttribute,sEntityGuidAttribute, sLookupValue)
{
var xml = "" +
"<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>" +
" <soap:Body>" +
"<RetrieveMultiple xmlns='http://schemas.microsoft.com/xrm/2011/Contracts/Services' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'> "+
"<query xsi:type='q1:QueryExpression' xmlns:q1='http://schemas.microsoft.com/xrm/2011/Contracts'>" +
" <q1:EntityName>" + sEntityName + "</q1:EntityName>" +
" <q1:ColumnSet xsi:type=\"q1:AllColumns\" />" +
" <q1:Distinct>false</q1:Distinct>" +
" <q1:Criteria>" +
" <q1:FilterOperator>And</q1:FilterOperator>" +
" <q1:Conditions>" +
" <q1:Condition>" +
" <q1:AttributeName>" + sFilterAttribute + "</q1:AttributeName>" +
" <q1:Operator>Equal</q1:Operator>" +
" <q1:Values>" +
" <q1:Value xsi:type=\"c:string\">" + sLookupValue + "</q1:Value>" +
" </q1:Values>" +
" </q1:Condition>" +
" </q1:Conditions>" +
" </q1:Criteria>" +
" </query>" +
" </soap:Body>" +
"</soap:Envelope>";var req = new ActiveXObject ("Msxml2.XMLHTTP");
req.open("POST", _getServerUrl(), true);
req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/RetrieveMultiple")
req.setRequestHeader ("Content-Type", "text/xml; charset=utf-8");
req.setRequestHeader ("Content-Length", xml.length);
req.send (xml);var resultXML = req.responseXml;
// Check for errors.
var errorCount = resultXML.selectNodes ('//error').length;
if (errorCount != 0) {
var msg = resultXML.selectSingleNode ('//description').nodeTypedValue;
return "-1";
}
var nodeList = resultXML.selectNodes ("//BusinessEntity")
var result = "";for(i = 0; i < nodeList.length; i++) {
result = nodeList[i].selectSingleNode ("./q1:" + sEntityGuidAttribute).text;
}
return result;
}-------------------------------------------------------------------------------------------------------------------------------------------
Alguém sabe o que tem de errado?
obrigado
William
Respostas
-
Willian,
Pelo que li no SDK, não é mais possível recuperar o WS do CRM via SOAP ("Use Web Service Data in Web Resources (REST and SOAP Endpoint)"), porém, todavia e entretanto eu consegui, fazer da mesma maneira que já fazíamos anteriormente, creio que não deva ser mais suportado nas próximas versões, veja:
var authenticationHeader = Xrm.Page.context.getAuthenticationHeader(); function FetchEncode(strInput) { var c; var HtmlEncode = ''; if(strInput == null) { return null; } if (strInput == '') { return ''; } for(var ct = 0; ct < strInput.length; ct++) { c = strInput.charCodeAt(ct); if (( ( c > 96 ) && ( c < 123 ) ) || ( ( c > 64 ) && ( c < 91 ) ) || ( c == 32 ) || ( ( c > 47 ) && ( c < 58 ) ) || ( c == 46 ) || ( c == 44 ) || ( c == 45 ) || ( c == 95 )) { HtmlEncode = HtmlEncode + String.fromCharCode(c); } else { HtmlEncode = HtmlEncode + '&#' + c + ';'; } } return HtmlEncode; } function Fetch() { // SEU FETCH var xml = "<fetch mapping='logical' count='50' version='1.0'>"; xml += "<entity name='account' /></fetch>"; var Xml = "<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\">" Xml += authenticationHeader; Xml += "<soap:Body>"; Xml += "<Fetch xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">"; Xml += "<fetchXml>"; Xml += FetchEncode(xml); Xml += "</fetchXml>"; Xml += "</Fetch>"; Xml += "</soap:Body>"; Xml += "</soap:Envelope>"; var xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); xmlHttp.open("POST", "/mscrmservices/2007/crmservice.asmx", false ); xmlHttp.setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate"); xmlHttp.setRequestHeader("Cache-Control", "post-check=0, pre-check=0"); xmlHttp.setRequestHeader("Pragma", "no-cache"); xmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); xmlHttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Fetch"); xmlHttp.send(Xml); var XmlDoc = new ActiveXObject("Msxml2.DOMDocument"); XmlDoc.async = false; XmlDoc.resolveExternals = false; XmlDoc.loadXML(xmlHttp.responseXML.text); alert(xmlHttp.responseText); return XmlDoc; }
O correto seria através de REST, que pelo que entendi não é um protocolo, mas sim uma técnica (acaba usando HTTP mesmo), que nesta nova versão somente podemos recuperar o WS com ela.
Ainda estou pesquisando sobre quais são as best practices da versão 2011, caso alguém tenha maiores informações, por favor, comunique-nos.
Att,
Tiago Cardoso
- Sugerido como Resposta Tiago Michelini CardosoMVP, Moderator terça-feira, 22 de março de 2011 17:33
- Marcado como Resposta RicardoAlves terça-feira, 29 de março de 2011 09:34
-
Buenas,
Caros, estou fazendo da seguinte maneira para a a entidade Ocorrência:
1) Criei uma app Silverlight e no onload chamo o seguinte comando:
string entityId = HtmlPage.Document.QueryString["id"];
2) Esta aplicacao Silverlight é inserida como WebResource no CRM e colocada dentro do Form de Ocorrencia.
3) No meu caso tenho um Serviço WCF esperando este ID e com o ID faço toda a pesquisa (usando LINQ) baseado no ID da Ocorrencia.
Não sei se é o melhor Approach mas é um.
Espero q ajude.
Até
- Marcado como Resposta RicardoAlves terça-feira, 29 de março de 2011 09:34
-
Olá,
Na verdade todas as maneiras são corretas, com certeza umas mais complicadas que outras.
No caso de utilizar o SL apenas para consulta não acho muito produtivo, claro que também dependendo da consulta, caso seja muito complexa e envolva aplicações legadas.
O SOAP continua válido normalmente. Na versão 2011 existe o Endpoint REST (o serviço foi criado em WCF), com ele fica muito mais simples criar uma consulta com JScript.
Fiz um exemplo utilizando com OData e jQuery:
http://ricardoalves.me/2011/03/25/odata-no-dynamics-crm-2011/
Abs,
Ricardo Alves
www.ricardoalves.me
- Sugerido como Resposta RicardoAlves sexta-feira, 25 de março de 2011 04:35
- Editado RicardoAlves sexta-feira, 25 de março de 2011 04:39 correção
- Marcado como Resposta RicardoAlves terça-feira, 29 de março de 2011 09:34
Todas as Respostas
-
Willian,
Pelo que li no SDK, não é mais possível recuperar o WS do CRM via SOAP ("Use Web Service Data in Web Resources (REST and SOAP Endpoint)"), porém, todavia e entretanto eu consegui, fazer da mesma maneira que já fazíamos anteriormente, creio que não deva ser mais suportado nas próximas versões, veja:
var authenticationHeader = Xrm.Page.context.getAuthenticationHeader(); function FetchEncode(strInput) { var c; var HtmlEncode = ''; if(strInput == null) { return null; } if (strInput == '') { return ''; } for(var ct = 0; ct < strInput.length; ct++) { c = strInput.charCodeAt(ct); if (( ( c > 96 ) && ( c < 123 ) ) || ( ( c > 64 ) && ( c < 91 ) ) || ( c == 32 ) || ( ( c > 47 ) && ( c < 58 ) ) || ( c == 46 ) || ( c == 44 ) || ( c == 45 ) || ( c == 95 )) { HtmlEncode = HtmlEncode + String.fromCharCode(c); } else { HtmlEncode = HtmlEncode + '&#' + c + ';'; } } return HtmlEncode; } function Fetch() { // SEU FETCH var xml = "<fetch mapping='logical' count='50' version='1.0'>"; xml += "<entity name='account' /></fetch>"; var Xml = "<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\">" Xml += authenticationHeader; Xml += "<soap:Body>"; Xml += "<Fetch xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">"; Xml += "<fetchXml>"; Xml += FetchEncode(xml); Xml += "</fetchXml>"; Xml += "</Fetch>"; Xml += "</soap:Body>"; Xml += "</soap:Envelope>"; var xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); xmlHttp.open("POST", "/mscrmservices/2007/crmservice.asmx", false ); xmlHttp.setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate"); xmlHttp.setRequestHeader("Cache-Control", "post-check=0, pre-check=0"); xmlHttp.setRequestHeader("Pragma", "no-cache"); xmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); xmlHttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Fetch"); xmlHttp.send(Xml); var XmlDoc = new ActiveXObject("Msxml2.DOMDocument"); XmlDoc.async = false; XmlDoc.resolveExternals = false; XmlDoc.loadXML(xmlHttp.responseXML.text); alert(xmlHttp.responseText); return XmlDoc; }
O correto seria através de REST, que pelo que entendi não é um protocolo, mas sim uma técnica (acaba usando HTTP mesmo), que nesta nova versão somente podemos recuperar o WS com ela.
Ainda estou pesquisando sobre quais são as best practices da versão 2011, caso alguém tenha maiores informações, por favor, comunique-nos.
Att,
Tiago Cardoso
- Sugerido como Resposta Tiago Michelini CardosoMVP, Moderator terça-feira, 22 de março de 2011 17:33
- Marcado como Resposta RicardoAlves terça-feira, 29 de março de 2011 09:34
-
Buenas,
Caros, estou fazendo da seguinte maneira para a a entidade Ocorrência:
1) Criei uma app Silverlight e no onload chamo o seguinte comando:
string entityId = HtmlPage.Document.QueryString["id"];
2) Esta aplicacao Silverlight é inserida como WebResource no CRM e colocada dentro do Form de Ocorrencia.
3) No meu caso tenho um Serviço WCF esperando este ID e com o ID faço toda a pesquisa (usando LINQ) baseado no ID da Ocorrencia.
Não sei se é o melhor Approach mas é um.
Espero q ajude.
Até
- Marcado como Resposta RicardoAlves terça-feira, 29 de março de 2011 09:34
-
Entendi o que você, é muito que provavelmente deve ser a maneira correta de se fazer nesta nova versão. Mas veja bem, é muito mais complexo do que usar um javascript e percorrer um nó xml, não é? rs
Obrigado pela contribuição, pessoal quem tem outra maneira ai? rs
Att,
Tiago
-
Olá,
Na verdade todas as maneiras são corretas, com certeza umas mais complicadas que outras.
No caso de utilizar o SL apenas para consulta não acho muito produtivo, claro que também dependendo da consulta, caso seja muito complexa e envolva aplicações legadas.
O SOAP continua válido normalmente. Na versão 2011 existe o Endpoint REST (o serviço foi criado em WCF), com ele fica muito mais simples criar uma consulta com JScript.
Fiz um exemplo utilizando com OData e jQuery:
http://ricardoalves.me/2011/03/25/odata-no-dynamics-crm-2011/
Abs,
Ricardo Alves
www.ricardoalves.me
- Sugerido como Resposta RicardoAlves sexta-feira, 25 de março de 2011 04:35
- Editado RicardoAlves sexta-feira, 25 de março de 2011 04:39 correção
- Marcado como Resposta RicardoAlves terça-feira, 29 de março de 2011 09:34