Ir para conteúdo

POWERED BY:

Arquivado

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

Faccruz

Validar CPF/CNPJ antes de gravar no banco

Recommended Posts

Boa tarde, tenho 2 questões

 

 

1 - Como faço para validar um CPF/CNPJ antes de efetuar a gravação no banco. A função para a validação eu já tenho.

 

Tentei colocar no OnExit do DBEdit mas não caiu nessa instrução. Coloquei também no BeforePost do ClientDataSet, até dá a mensagem de erro, mas grava do mesmo jeito.

 

Como posso resolver isso?

 

Trabalhando com Herança de Form, Delphi 2009, FireBird e ClientDataSet.

 

**********************

 

2 - Qndo vou debugar minha aplicação sempre cai em uma tela (creio que seja endereços de memória), como faço para não exibir mais essa tela?

Compartilhar este post


Link para o post
Compartilhar em outros sites

quando a tua função que valida retornar false você deve dar um exit da rotina.

faz tempo que não trabalho com delphi, mas se nao me engano é exit o comando.

 

if not validaCPF then

exit;

Compartilhar este post


Link para o post
Compartilhar em outros sites

quando a tua função que valida retornar false você deve dar um exit da rotina.

faz tempo que não trabalho com delphi, mas se nao me engano é exit o comando.

 

if not validaCPF then

exit;

 

 

era exatamente isso que eu estava fazendo no Evento BeforePost do ClientDataSet, mas mesmo assim estava gravando (repetindo) o último cliente salvo.

 

Mas consegui resolver da seguinte forma:

if not ValidaCPF then
  DatabaseError( 'CPF inválido!' + #13 + 'Por favor, corrija.' );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega acho que está faltando isso:

 

if not ValidaCPF then

DatabaseError( 'CPF inválido!' + #13 + 'Por favor, corrija.' );

Abort;

 

Entre os componentes ACbr existe um validador de documentos, mas acho que esse componente não é compatível com o delphi 2009.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega acho que está faltando isso:

 

if not ValidaCPF then

DatabaseError( 'CPF inválido!' + #13 + 'Por favor, corrija.' );

Abort;

 

Entre os componentes ACbr existe um validador de documentos, mas acho que esse componente não é compatível com o delphi 2009.

 

 

É exatamente esse ACBrValidador que estou utilizando.

Não foi necessário colocar o Abort, ao exibir a mensagem de erro, creio eu que dê o Abort automaticamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega eu uso esse validador(CNPJ, CPF, INSCRIÇÃO EST.) no evento OnExit do DBEdit e funciona legal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega eu uso esse validador(CNPJ, CPF, INSCRIÇÃO EST.) no evento OnExit do DBEdit e funciona legal.

 

 

Então, eu tentei colocar no OnExit do DBEdit também, mas ele nem passou por essa propriedade. Creio que por causa da instrução que coloquei para trocar cor qndo o foco esteja nele.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, vamos por partes:

 

Funções para validação, caso você não tenha:

 

------------------------------------------------------------

...

 

{$R *.dfm}

 

// FUNCAO PARA VALIDAR CPF...

function TformCadCliente.ValidaCPF(numCPF: string): boolean;

var

cpf: string;

x, total, dg1, dg2: Integer;

ret: boolean;

begin

ret:=True;

for x:=1 to Length(numCPF) do

if not (numCPF[x] in ['0'..'9', '-', '.', ' ']) then

ret:=False;

if ret then

begin

ret:=True;

cpf:='';

for x:=1 to Length(numCPF) do

if numCPF[x] in ['0'..'9'] then

cpf:=cpf + numCPF[x];

if Length(cpf) <> 11 then

ret:=False;

if ret then

begin

//1° dígito

total:=0;

for x:=1 to 9 do

total:=total + (StrToInt(cpf[x]) * x);

dg1:=total mod 11;

if dg1 = 10 then

dg1:=0;

//2° dígito

total:=0;

for x:=1 to 8 do

total:=total + (StrToInt(cpf[x + 1]) * (x));

total:=total + (dg1 * 9);

dg2:=total mod 11;

if dg2 = 10 then

dg2:=0;

//Validação final

if (dg1 = StrToInt(cpf[10])) and (dg2 = StrToInt(cpf[11])) then

ret:= True

else

ret:= False;

 

//Inválidos

case AnsiIndexStr(cpf,['00000000000' '11111111111','22222222222','33333333333','44444444444',

 

'55555555555','66666666666','77777777777','88888888888','99999999999']) of

 

0..9: ret:=False;

 

end;

 

end

else

{ begin

//Se não informado deixa passar

if cpf = '' then

ret:=True;

end;}

end;

ValidaCPF:=ret;

end;

 

--------------------------------------------

// FUNCAO PARA VALIDAR CNPJ...

function TFormCadCliente.ValidaCNPJ(numCNPJ: string): boolean;

var

cnpj: string;

dg1, dg2: integer;

x, total: integer;

ret: boolean;

begin

ret:=False;

cnpj:='';

//Analisa os formatos

if Length(numCNPJ) = 18 then

if (Copy(numCNPJ,3,1) + Copy(numCNPJ,7,1) + Copy(numCNPJ,11,1) + Copy(numCNPJ,16,1) = '../-') then

begin

cnpj:=Copy(numCNPJ,1,2) + Copy(numCNPJ,4,3) + Copy(numCNPJ,8,3) + Copy(numCNPJ,12,4) + Copy(numCNPJ,17,2);

ret:=True;

end;

if Length(numCNPJ) = 14 then

begin

cnpj:=numCNPJ;

ret:=True;

end;

//Verifica

if ret then

begin

try

//1° digito

total:=0;

for x:=1 to 12 do

begin

if x < 5 then

Inc(total, StrToInt(Copy(cnpj, x, 1)) * (6 - x))

else

Inc(total, StrToInt(Copy(cnpj, x, 1)) * (14 - x));

end;

dg1:=11 - (total mod 11);

if dg1 > 9 then

dg1:=0;

//2° digito

total:=0;

for x:=1 to 13 do

begin

if x < 6 then

Inc(total, StrToInt(Copy(cnpj, x, 1)) * (7 - x))

else

Inc(total, StrToInt(Copy(cnpj, x, 1)) * (15 - x));

end;

dg2:=11 - (total mod 11);

if dg2 > 9 then

dg2:=0;

//Validação final

if (dg1 = StrToInt(Copy(cnpj, 13, 1))) and (dg2 = StrToInt(Copy(cnpj, 14, 1))) then

ret:=True

else

ret:=False;

except

ret:=False;

end;

//Inválidos

case AnsiIndexStr(cnpj,['00000000000000','11111111111111','22222222222222','33333333333333','44444444444444',

'55555555555555','66666666666666','77777777777777','88888888888888','99999999999999']) of

0..9: ret:=False;

end;

end;

 

ValidaCNPJ:=ret;

end;

 

--------------------------------------------

 

Lembrando que você tem que declarar as funções:

 

--------------------------------------------

...

public

{ Public declarations }

function ValidaCPF(numCPF: string): boolean;

function ValidaCNPJ(numCNPJ: string): boolean;

--------------------------------------------

 

você tem três maneiras para fazer a chamada da função para a validação:

1 - Através de um click em algum botão (totalmente inviável da minha parte);

2 - Através da saída do campo de validação (mais indicado);

3 - No ato da gravação dos dados na tabela, ele faz a verificação (if .... ) then

 

* Escolha o mais viável para você.

 

--------------------------------------------

 

você pode fazer um procedimento para veirificação, tipo?:

 

---------------------------------------------

 

// PROCEDIMENTO PARA VERIFICAR PREENCHIMENTO CAMPO CPF/CNPG..

procedure TformCadCliente.VerificaCampo();

begin

//se o 1º texto for igual

if(dbedTipo1.Text = 'FÍSICA') then

begin

//se nao validar

if (ValidaCpf(dbedCpfCgc.Text) = False) then

begin

dbedCpfCgc.color := (clRed);

MessageDlg('CPF incorreto.'+#13+'Por favor, informe um número de <<CPF>> válido!'+#13,mtError,[mbOk],0);

tbCadClientes.FieldByName('CpfCnpj').Value := NULL;

dbedCpfCgc.SetFocus;

end

//se validar

else

begin

dbedCpfCgc.color := (clMoneyGreen);

MessageDlg('Número de documento válido!'+#13,mtInformation,[mbOk],0);

dbedRgIe.SetFocus;

end;

end

else

// se o 1º texto nao for igual, segundo...

if(dbedTipo1.Text = 'JURÍDICA') then

begin

//se nao validar

if (ValidaCnpj(dbedCpfCgc.Text) = False) then

begin

dbedCpfCgc.color := (clRed);

MessageDlg('CNPJ incorreto.'+#13+'Por favor, informe um número de <<CNPJ>> válido!'+#13,mtError,[mbOk],0);

tbCadClientes.FieldByName('CpfCnpj').Value := NULL;

dbedCpfCgc.SetFocus;

end

//se validar

else

begin

dbedCpfCgc.color := (clMoneyGreen);

MessageDlg('Número de documento válido!'+#13,mtInformation,[mbOk],0);

dbedRgIe.SetFocus;

end;

end

else

//se o 1º, 2º texto for igual, terceiro...

if(dbedTipo1.Text = '') then

begin

dbedTipo1.color := (clRed);

MessageDlg('Você não informou nenhum tipo <<FÍSICA ou JURÍDICA>>!'+#13,mtError,[mbOk],0);

dbedTipo1.SetFocus;

end;

end;

----------------------------------------------------------------

 

você declada o procedimento da mesma forma que a função, como explicado acima.

E coloca a chamada do procedimento como mencionado mais a cima, em botão, ou saida do campo ou no ato da gravação.

Aconselho na saida do campo, assim, ele ja faz a validação logo de cara.

 

----------------------------------------------------------------

 

Se for na saída, sera no "onExit" do campo.

Ai você coloca:

 

Ex:

 

VerificaCampo;

---------------------------------------------------------------

 

RESUMO:

você cria duas funções para validação (uma pra cpf e outra pra cnpj);

você cria um procedimento de verificação do preenchimento do campo;

você chama esse procedimento na saída do campo.

 

Todos os códigos que mandei acima, foram testados e funcionam 100%, claro que você deverar verificar os nomes dos campos e forms.

 

Espero ter ajudado e qualquer coisa, posta ai.

 

T+.

 

Rodrigo R. Moraes

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os códigos eu já possuia (estou utilizando o componente ACBRValidador).

Só estava tendo dificuldades para dar um abort qndo ele encontrasse o CPF/CNPJ inválido.

O problema já foi resolvido.

 

Obrigado a todos.

 

abraços.

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.