Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Renanbg

[RESOLVIDO]Problemas validação CPF e CNPJ

Recommended Posts

To quase lá agora, mas ainda da um erro

 

vou colocar todo o codigo e ir comentando

 

To usando 3 funcoes

 

Uma para formatar o campo

 

function Tfboleto.FormatarCPFCNPJ(const Doc: String): String;begin  if (Length(Doc) = 11) then  begin	Result:= Copy(Doc,1,3) + '.' + Copy(Doc,4,3) + '.' + Copy(Doc,7,3) + '-' + Copy(Doc,10,2);  end;  if (Length(Doc) = 14) then  begin	Result:= Copy(Doc,1,2) + '.' + Copy(Doc,3,3) + '.' + Copy(Doc,6,3) + '/' + Copy(Doc,9,4) + '-' + Copy(Doc,13,2);  end;end;
uma para validar cpf

 

function Tfboleto.cpf(num:string):boolean;varn1,n2,n3,n4,n5,n6,n7,n8,n9:integer;d1,d2:integer;digitado,calculado:string;beginn1:=StrToInt(num[1]);n2:=StrToInt(num[2]);n3:=StrToInt(num[3]);n4:=StrToInt(num[5]);n5:=StrToInt(num[6]);n6:=StrToInt(num[7]);n7:=StrToInt(num[9]);n8:=StrToInt(num[10]);n9:=StrToInt(num[11]);if (n1=n2) and (n2=n3) and (n3=n4) and (n4=n5) and (n5=n6)and (n6=n7) and (n7=n8) and (n8=n9) thencpf:=falseElseBegind1:=n9*2+n8*3+n7*4+n6*5+n5*6+n4*7+n3*8+n2*9+n1*10;d1:=11-(d1 mod 11);if d1>=10 then d1:=0;d2:=d1*2+n9*3+n8*4+n7*5+n6*6+n5*7+n4*8+n3*9+n2*10+n1*11;d2:=11-(d2 mod 11);if d2>=10 then d2:=0;calculado:=IntToStr(d1)+IntToStr(d2);digitado:=num[13]+num[14];if calculado=digitado thencpf:=trueelsecpf:=false;endend;
uma para formatar cnpj

function Tfboleto.cnpj(num:string):Boolean;varn1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12:integer;d1,d2:integer;digitado,calculado:string;beginn1:=StrToInt(num[1]);n2:=StrToInt(num[2]);n3:=StrToInt(num[4]);n4:=StrToInt(num[5]);n5:=StrToInt(num[6]);n6:=StrToInt(num[8]);n7:=StrToInt(num[9]);n8:=StrToInt(num[10]);n9:=StrToInt(num[12]);n10:=StrToInt(num[13]);n11:=StrToInt(num[14]);n12:=StrToInt(num[15]);if (n1=n2) and (n2=n3) and (n3=n4) and (n4=n5) and (n5=n6)and (n6=n7) and (n7=n8) and (n8=n9) and (n9=n10) and (n10=n11) and (n11=n12) thencnpj:=falseelsebegind1:=n12*2+n11*3+n10*4+n9*5+n8*6+n7*7+n6*8+n5*9+n4*2+n3*3+n2*4+n1*5;d1:=11-(d1 mod 11);if d1>=10 then d1:=0;d2:=d1*2+n12*3+n11*4+n10*5+n9*6+n8*7+n7*8+n6*9+n5*2+n4*3+n3*4+n2*5+n1*6;d2:= 11-(d2 mod 11);if d2>=10 then d2:=0;calculado:=IntToStr(d1)+IntToStr(d2);digitado:=num[17]+num[18];if calculado=digitado thencnpj:=Trueelsecnpj:=false;endend;
Agora uso esse codigo no evento de onexit do edit

 

procedure Tfboleto.EditCgccpfExit(Sender: TObject);var num_cpf, num_cnpj:string;beginEditCgccpf.Text:= FormatarCPFCNPJ(EditCgccpf.Text); //formata o campoif (Length(EditCgccpf.Text) = 11) then  // valida cpfnum_cpf:=EditCgccpf.Text;if NOT cpf(EditCgccpf.Text) thenBeginShowMessage('CPF INVALIDO!!!');EditCgccpf.SetFocus;exit;end;if (Length(EditCgccpf.Text) = 14) then  // valida cnpjnum_cnpj:=EditCgccpf.Text; If not cnpj(EditCgccpf.Text) thenBeginShowMessage('CNPJ INVALIDO!!!');EditCgccpf.SetFocus;exit;end;end;
Agora o problema

 

Se uso só uma das funcoes no exit do edit funciona certo, mas usando o codigo acima com as duas da o erro abaixo qndo o valor é valido

 

Imagem Postada

 

Alguma idéia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Somente alguns problemas no OnExit de validação e bloco de código, tente assim:

 

procedure TForm1.EditCgccpfExit(Sender: TObject);var	num_cpf, num_cnpj:string;beginnum_cpf:=EditCgccpf.Text;EditCgccpf.Text:=FormatarCPFCNPJ(EditCgccpf.Text); //formata o campoif (Length(num_cpf) = 11) then  // valida cpf	begin	if NOT cpf(EditCgccpf.Text) then		Begin		ShowMessage('CPF INVALIDO!!!');		EditCgccpf.SetFocus;		exit;		end;	end;if (Length(num_cpf) = 14) then  // valida cnpj	begin	If not cnpj(EditCgccpf.Text) then		Begin		ShowMessage('CNPJ INVALIDO!!!');		EditCgccpf.SetFocus;		exit;		end;	end;end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa..deu certo marcioAgora preciso de mais uma coisapreciso colocar nesse codigo um teste para caso o tamanho seja diferente de 11 ou 14 de uma mensagem dizendo q tem algo errado, pq do jeito q esta se eu digitar um valor diferente de 11 ou 14 o campo fica em branco...Pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma das formas:

 

procedure TForm1.EditCgccpfExit(Sender: TObject);var	num_cnpj:string;	num_cpf: integer;beginnum_cpf:=Length(EditCgccpf.Text);if ((num_cpf = 11) or (num_cpf = 14)) then	begin	EditCgccpf.Text:=FormatarCPFCNPJ(EditCgccpf.Text); //formata o campo	if (num_cpf = 11) then  // valida cpf		begin		if NOT cpf(EditCgccpf.Text) then			Begin			ShowMessage('CPF INVALIDO!!!');			EditCgccpf.SetFocus;			end;		end;	if (num_cpf = 14) then  // valida cnpj		begin		If not cnpj(EditCgccpf.Text) then			Begin			ShowMessage('CNPJ INVALIDO!!!');			EditCgccpf.SetFocus;			end;		end;	endelse	begin	ShowMessage('Tamanho inválido !!!');	EditCgccpf.SetFocus;	end;end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deu certo, agora só falta uma coisa

 

Estou trabalhando td isso direto no dbedit ao inves do maskedit

 

e se eu for passando todos os campos com enter numa edição no exit vai dar uma mensagem de erro como mostrei no post acima para cpf e vai dar o showmessage de tamanho invalido para o cnpj.

 

Preciso remover os "." "/" "-" (pontinhos, barras e traços) do campo no evento de enter

 

se fosse um maskedit eu só faria

 

maskedit1.editmask:= '';

mas como posso fazer no dbedit?

Compartilhar este post


Link para o post
Compartilhar em outros sites

No evento OnEnter pode fazer algo do tipo:

 

procedure TForm1.EditCgccpfEnter(Sender: TObject);beginEditCgccpf.Text:=RemoveFormatacaoCPFCNPJ(EditCgccpf.Text);end;

E a função:

 

function RemoveFormatacaoCPFCNPJ(const Doc: String): String;var	x: integer;	ret: string;beginret:='';for x:=1 to Length(Doc) do	if (Doc[x] in ['0'..'9']) then		ret:=ret + Doc[x];Result:=ret;end;

No caso somente vai pegar os números, removendo os caracteres...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.