sexta-feira, 19 de dezembro de 2008

>> CRM 4.0 - AJAX + Preenchimento Automático de Lookup

Já tiveram a necessidade de preenchimento automático de um campo Lookup, baseado na escolha de alguma informação em outro campo? Somente em JavaScript?

Segue código template que ilustra isto, de forma que, ao selecionar uma Conta na Oportunidade, o sistema atualize a Lista de Preço da Oportunidade (existente na Conta).

Note que o código (JavaScript) utiliza o Web Services do CRM, método Retrieve para busca de dados de uma entidade, baseado no ID.

No [OnChange] do campo [Cliente Provável] da Oportunidade, adicionar o template abaixo:

P.S.: Substitua o nome [CAMPO_RETORNO] pelo nome do campo que representa o ID da Lista de Preço da Conta.

---- ONCHANGE FIELD ACTION ----
getAccountPriceLevel();

function getAccountPriceLevel()
{
var server = window.location.host;
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
xmlhttp.open("POST", "http://" + server + "/mscrmservices/2007/crmservice.asmx", true);
xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlhttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Retrieve");

var soapBody = "<soap:Body><Retrieve xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\"><entityName>account</entityName>";
soapBody += "<id>" + crmForm.all.customerid.DataValue[0].id + "</id>";
soapBody += "<columnSet xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:ColumnSet\"><q1:Attributes>";
soapBody += "<q1:Attribute>CAMPO_RETORNO</q1:Attribute>";
soapBody += "</q1:Attributes></columnSet>";
soapBody += "</Retrieve></soap:Body>";

var soapXml = "<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'>";
soapXml += GenerateAuthenticationHeader();
soapXml += soapBody;
soapXml += "</soap:Envelope>";

xmlhttp.onreadystatechange = StateChangeAccountPriceLevel;
xmlhttp.send(soapXml);
}


function StateChangeAccountPriceLevel()
{
if (xmlhttp.readyState == 4)
{
var oNodes = xmlhttp.responseXML.selectSingleNode("//RetrieveResult").childNodes;
var priceLevelID = oNodes[0].text;

if (crmForm.all.pricelevelid.DataValue == null)
{
var lookupData = new Array();
var lookupItem= new Object();
lookupItem.id = priceLevelID;
lookupItem.typename = 'pricelevel';
lookupItem.name = 'Lista de Preço Padrão';
lookupData[0] = lookupItem;
crmForm.all.pricelevelid.DataValue = lookupData;
}
}
}

5 comentários:

  1. Olá Gilberto, muito bom artigo...

    Estou encontrando problemas de permissão, no .send aparece o login de rede e mesmo eu informando o resultado não é retornado.

    ResponderExcluir
  2. Olá!, Muito grato,

    Na linha: var server = window.location.host;

    Verifique o que a variável [server] contém.

    ResponderExcluir
  3. Este comentário foi removido pelo autor.

    ResponderExcluir
  4. Este comentário foi removido pelo autor.

    ResponderExcluir
  5. Gilberto, tbm gostei muito deste artigo.

    Fiz o que vc mencinou no artigo, e troquei na linha server:

    server = window.location.host;
    para
    server = http://meuservidor:5555;

    porém quando seleciono o cliente ele não preenche nenhuma informação no campo lista de preço e tbm ele não me permite visualizar as listas de preços existentes.

    Alguma sugestão? Meu CRM é o 4.0.

    ResponderExcluir

<< Ao enviar um comentário, favor clicar na opção [Enviar por e-mail comentários de acompanhamento para gtezini@gmail.com] >>