Faccruz 0 Denunciar post Postado Junho 16, 2010 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
EuToComProblema! 1 Denunciar post Postado Junho 16, 2010 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
Faccruz 0 Denunciar post Postado Junho 17, 2010 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
wllf 2 Denunciar post Postado Junho 17, 2010 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
Faccruz 0 Denunciar post Postado Junho 17, 2010 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
wllf 2 Denunciar post Postado Junho 18, 2010 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
Faccruz 0 Denunciar post Postado Junho 18, 2010 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
Rodrigo R. Moraes 0 Denunciar post Postado Junho 18, 2010 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
Faccruz 0 Denunciar post Postado Junho 18, 2010 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