terça-feira, 10 de fevereiro de 2009

>> CRM 4.0 - Preenchimento Automático de PickList (REVISADO)

------------ REVISÃO ---------------
Efetuei algumas alterações/correções pois, ao salvar o registro, estava gerando erro (explicado no passo 2 abaixo).
------------------------------------

Ainda na atual versão do CRM (4.0) não se pode configurar objetos para preenchimento automático de outros, via configuração básica do produto. Por exemplo, ao selecionar uma Conta, em um [Lookup], retornar em um [Picklist] os Contatos da Conta.

Segue então solução, via desenvolvimento JavaScript, para isto.

1 - Criar um PickList vazio;

2 - Carregar o Picklist com uma quantidade "razoável" de linhas "VAZIAS". Porquê? Acontece que estamos carregando o Picklist dinamicamente. Internamente, o CRM busca em seu [METADADOS] as informações do Picklist tanto no [OnLoad] do Formulário quanto no [OnSave]. Ignorando este processo interno, ao carregar aleatóriamente os dados no PickList vai gerar um erro, pois o CRM nos dirá que [incialmente, ao carregar o formulário, o metadados para este Picklist não continha informação, porém agora contém, gerando uma exceção de índice do Dropdownlist].

3 - No [OnChange] do Lookup desejado (no meu exemplo, de Conta) adicionar o código:

window.getAccountContacts();


4 - E no [OnLoad] do Form do CRM, adicionar o código abaixo:

window.getAccountContacts = function (e)
{
crmForm.all.new_pickcontact.DataValue = null;
crmForm.all.new_pickcontact.Disabled = true;

if (crmForm.all.customerid.DataValue==null) return;

var customerid = crmForm.all.customerid.DataValue[0].id;
var authenticationHeader = GenerateAuthenticationHeader();

var xml = "<" + "?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<" + "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\">" +
authenticationHeader+
"<" + "soap:Body>" +
"<" + "RetrieveMultiple xmlns="+
"\"http://schemas.microsoft.com/crm/2007/WebServices\">" +
"<" + "query xmlns:q1="+
"\"http://schemas.microsoft.com/crm/2006/Query\" "+
"xsi:type=\"q1:QueryByAttribute\">" +
"<" + "q1:EntityName>contact" + "<" + "/q1:EntityName>" +
"<" + "q1:ColumnSet xsi:type=\"q1:ColumnSet\">" +
"<" + "q1:Attributes>" +
"<" + "q1:Attribute>fullname" + "<" + "/q1:Attribute>" +
"<" + "/q1:Attributes>" +
"<" + "/q1:ColumnSet>" +
"<" + "q1:Attributes>" +
"<" + "q1:Attribute>parentcustomerid" + "<" + "/q1:Attribute>" +
"<" + "/q1:Attributes>" +
"<" + "q1:Values>" +
"<" + "q1:Value xsi:type=\"xsd:string\">"+
customerid+
"<" + "/q1:Value>" +
"<" + "/q1:Values>" +
"<" + "/query>" +
"<" + "/RetrieveMultiple>" +
"<" + "/soap:Body>" +
"<" + "/soap:Envelope>";

xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
xmlHttpRequest.Open(
"POST",
"/mscrmservices/2007/CrmService.asmx",
true
);

xmlHttpRequest.setRequestHeader(
"SOAPAction",
"http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple" );

xmlHttpRequest.setRequestHeader(
"Content-Type", "text/xml; charset=utf-8" );

xmlHttpRequest.setRequestHeader(
"Content-Length", xml.length );

xmlHttpRequest.onreadystatechange = StateChangeAccountContacts;
xmlHttpRequest.send(xml);
}

function StateChangeAccountContacts()
{
if (xmlHttpRequest.readyState == 4)
{
var resultXml = xmlHttpRequest.responseXML;
var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM");
oXmlDoc.async = false;
oXmlDoc.loadXML(resultXml.xml);
var businessEntities = oXmlDoc.getElementsByTagName('BusinessEntity');

var oTempArray = new Array();
oTempArray[0] = crmForm.all.mit_pickcontact.originalPicklistOptions[0];

for (i=0;i < businessEntities.length;i++)
{
var fullName = businessEntities[i].selectSingleNode('./q1:fullname');
if (fullName != null)
{
var opt = crmForm.all.mit_pickcontact.originalPicklistOptions[i+1];
opt.Text = fullName.text;
oTempArray[i+1] = opt;
}
}

crmForm.all.new_pickcontact.Options = oTempArray;
crmForm.all.new_pickcontact.Disabled = false;
crmForm.all.new_pickcontact.DataValue = crmForm.all.new_pickcontact.originalSelectedIndex;

}
}

crmForm.all.new_pickcontact.originalPicklistOptions = crmForm.all.new_pickcontact.Options;
crmForm.all.new_pickcontact.originalSelectedIndex = crmForm.all.new_pickcontact.selectedIndex;
window.getAccountContacts();

Nenhum comentário:

Postar um comentário

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