none
Recuperar Conta com Javascript - SOAP - CRM 2011 RRS feed

  • 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

    domingo, 20 de março de 2011 15:21

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

    terça-feira, 22 de março de 2011 17:33
    Moderador
  • 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
    quinta-feira, 24 de março de 2011 20:15
  • 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
    sexta-feira, 25 de março de 2011 04:35

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

    terça-feira, 22 de março de 2011 17:33
    Moderador
  • 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
    quinta-feira, 24 de março de 2011 20:15
  • 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

    quinta-feira, 24 de março de 2011 22:22
    Moderador
  • 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
    sexta-feira, 25 de março de 2011 04:35