Usuário com melhor resposta
Bloquear Save da Entidade

Pergunta
-
Bom dia a Todos.
Estou desenvolvendo um Plugin para detectar a duplicidade de um CPF na base de dados.
Como deve funcionar: O Plugin executa em Evento Pré e verifica se o CPF digitado já consta na base, se sim devo exibir uma mensagem e impedir que o registro seja salvo.
Como posso fazer essa parte de Impedir que o registro seja salvo?
Respostas
-
Carlos,
Tentei reproduzir seu caso aqui e consegui a seguinte solução: Eu consigo travar a criação da nova conta porém o usuário não é informado o motivo da não realização do cadastro, se bem que a regra de detecção de duplicata estiver ativa ele será informada, você pode fazer da seguinte forma:
acrescenta esse trecho no plugin pre da conta:
//Cria o metodo
public boolean ExisteCPF(String cpf){
Laço{
//busca os cpfs das contas
if(cpf == vet){
return true;
}
}
return false;
}
no trecho create da conta acrescente:
if(ExisteCPF(meuCPF) )
throw new Exception("CPF existente!");
//Não consegui fazer essa mensagem aparecer, mas pelo menos a pessoa nao consegue concluir o cadastro do cliente
Se você utilizar a detecção de duplicatas junto com a customização do plugin, você conseguirá resolver o seu problema.
- Marcado como Resposta Carlos Vinhas sexta-feira, 5 de novembro de 2010 13:28
-
Olá,
Para parar a execução e mostrar mensagem ao usuário, utilize:
throw new InvalidPluginExecutionException("mensagem");
Abraço,
Ricardo Alves
www.ricardoalves.me- Sugerido como Resposta RicardoAlves sexta-feira, 5 de novembro de 2010 12:13
- Marcado como Resposta RicardoAlves sexta-feira, 5 de novembro de 2010 13:29
-
Muito Obrigado Pessoal,
Consegui resolver com uma solução bem parecida com a que o Fernando propôs.
Segue abaxo o código
if (myContacts.BusinessEntityCollection.BusinessEntities.LongLength > 0) { throw new InvalidPluginExecutionException("Este CPF já encontra-se cadastrado"); }
- Marcado como Resposta Carlos Amorim Junior sexta-feira, 5 de novembro de 2010 13:27
Todas as Respostas
-
Boa tarde Carlos,
Essa forma de implementação via Plugin pode resolver o problema, no entanto o CRM 4.0 possui funcionalidades de detecção de dados duplicados que podem resolver seu problema. Você pode ir no menu "Gerenciador de Dados" => Regras de detecção de duplicatas e cria uma regra para que o sistema informe quando houver dados repetidos e em "Gerenciador de Dados" => Configurações de Detecção de duplicatas habilitar a detecção na criação do registro, com isso ao tentar salvar será exibida uma msg informando os dados já existentes. No entanto a pessoa pode escolher salvar assim mesmo ou não, aí vai da política que você quer inserir na organização. Espero ter ajudado.
Abraços!
-
-
Opa Fernando,
Obrigado pela resposta. Porém aqui eu preciso implementar via plugin pois não podemos em hipótese alguma ter estes registros duplicados. E pelas regras de Detecção de Duplicatas do proprio CRM ele permite a inclusão do registro (se o cliente escolher "Sim" na tela da detecção).
Fiz o código para verificar se existe o registro duplicado, porém não consigo barrar o usuário de salvar o registro.
-
Carlos,
Tentei reproduzir seu caso aqui e consegui a seguinte solução: Eu consigo travar a criação da nova conta porém o usuário não é informado o motivo da não realização do cadastro, se bem que a regra de detecção de duplicata estiver ativa ele será informada, você pode fazer da seguinte forma:
acrescenta esse trecho no plugin pre da conta:
//Cria o metodo
public boolean ExisteCPF(String cpf){
Laço{
//busca os cpfs das contas
if(cpf == vet){
return true;
}
}
return false;
}
no trecho create da conta acrescente:
if(ExisteCPF(meuCPF) )
throw new Exception("CPF existente!");
//Não consegui fazer essa mensagem aparecer, mas pelo menos a pessoa nao consegue concluir o cadastro do cliente
Se você utilizar a detecção de duplicatas junto com a customização do plugin, você conseguirá resolver o seu problema.
- Marcado como Resposta Carlos Vinhas sexta-feira, 5 de novembro de 2010 13:28
-
Oi Carlos,
Há também a possíbilidade de implementar via javascript, conforme o exemplo abaixo:
function valida_cpf(cpf)
{
var numeros, digitos, soma, i, resultado, digitos_iguais;
digitos_iguais = 1;
if (cpf.length < 11)
return false;
for (i = 0; i < cpf.length - 1; i++)
if (cpf.charAt(i) != cpf.charAt(i + 1))
{
digitos_iguais = 0;
break;
}
if (!digitos_iguais)
{
numeros = cpf.substring(0,9);
digitos = cpf.substring(9);
soma = 0;
for (i = 10; i > 1; i--)
soma += numeros.charAt(10 - i) * i;
resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
if (resultado != digitos.charAt(0))
return false;
numeros = cpf.substring(0,10);
soma = 0;
for (i = 11; i > 1; i--)
soma += numeros.charAt(11 - i) * i;
resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
if (resultado != digitos.charAt(1))
return false;
return true;
}
else
return false;
}
var exp = /\-|\.|\/|\(|\)| /g
var cpfFormatado = crmForm.all.gl_cpf.DataValue;
if(cpfFormatado == null){return;}
/*Somente números*/
cpfFormatado = cpfFormatado.replace(exp,"");/*validação de CPF*/
if (valida_cpf(cpfFormatado)) {
/*Formata como ###.###.###-##*/
cpfFormatado = cpfFormatado.substr(0, 3) + '.' + cpfFormatado.substr(3, 3) + '.' + cpfFormatado.substr(6, 3) + '-' + cpfFormatado.substr(9, 2);
/*Atualiza no formulário*/
crmForm.all.gl_cpf.DataValue = cpfFormatado;
}else{
alert("Número de CPF inválido.");
crmForm.all.gl_cpf.DataValue = "";
}var input = crmForm.all.gl_cpf.DataValue;
var soapBody ="<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:Attribute>contactid</q1:Attribute>" +
"</q1:Attributes>" +
"</q1:ColumnSet>" +
"<q1:Attributes>" +
"<q1:Attribute>gl_cpf</q1:Attribute>" +
"</q1:Attributes>" +
"<q1:Values>" +
"<q1:Value xsi:type=\"xsd:string\">" + input + "</q1:Value>" +
"</q1:Values>" +
"</query>" +
"</RetrieveMultiple>" +
"</soap:Body>" ;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\">" +
GenerateAuthenticationHeader() +
soapBody +
"</soap:Envelope>" +
"";var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
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.send(xml);
var resultXml = xmlHttpRequest.responseXML;var businessEntities = resultXml.getElementsByTagName('BusinessEntity');
if(businessEntities.length > 0){
alert("Já existe uma pessoa física cadastrada com esse CPF.\n" + businessEntities[0].selectSingleNode('./q1:fullname').text);
// window.open("/XYZ/sfa/conts/edit.aspx?id="+ businessEntities[0].selectSingleNode('./q1:contactid').text,"_self");
}Uma vez que você identifica que já existe o CPF, pode tomar ações no formulário.
[]´s
Carlos Amorim Junior
"Colabore! A comunidade precisa de você."
http://www.dynamicscrm.com.br- Sugerido como Resposta Carlos Amorim Junior sexta-feira, 5 de novembro de 2010 12:56
-
Olá,
Para parar a execução e mostrar mensagem ao usuário, utilize:
throw new InvalidPluginExecutionException("mensagem");
Abraço,
Ricardo Alves
www.ricardoalves.me- Sugerido como Resposta RicardoAlves sexta-feira, 5 de novembro de 2010 12:13
- Marcado como Resposta RicardoAlves sexta-feira, 5 de novembro de 2010 13:29
-
Vinhas,
Como o Amorim sugeriu acima, se a porta de entrada de dados for apenas o formulário do Dynamics CRM, não seria nescessario o plugin.
Mas para todos os casos você pode colocar o o campo CPF como obrigatório e no OnChange colocar uma validação para buscar na base se existe o CPF cadastrado (fetch ou webservice).
Se existe você simplesmente limpa o campo, desta forma o usuário não poderá seguir com o cadastro e evita ele digitar todos os dados do formulário desnecessariamente (ganha uns pontos com o keyuser ;) ).
Abraço,
Ricardo Alves
www.ricardoalves.me -
-
Muito Obrigado Pessoal,
Consegui resolver com uma solução bem parecida com a que o Fernando propôs.
Segue abaxo o código
if (myContacts.BusinessEntityCollection.BusinessEntities.LongLength > 0) { throw new InvalidPluginExecutionException("Este CPF já encontra-se cadastrado"); }
- Marcado como Resposta Carlos Amorim Junior sexta-feira, 5 de novembro de 2010 13:27
-
Carlos Amorim, boa noite!
Fiz um código parecido com o seu, porém os usuários só tem permissão de visualizar as contas deles, ou seja, como este script passa o parâmetro do usuário logado ele não identifica a duplicidade.
Tem algum jeito de passar o parâmetro do crmadmin para que eu consiga resolver meu problema com um script, porque não tenho a manha em criação de plugin. No aguardo!
- Editado Farley Faria quarta-feira, 15 de dezembro de 2010 21:18 faltou sobrenome
-
Olá Jefferson,
Por favor, peço que crie uma nova thread com a sua dúvida. Assim fica mais fácil para podermos ajuda-ló, e é uma documentação a mais para a comunidade ;)
Abraço,
Ricardo Alves
www.ricardoalves.me