dúvidas com validação de cpf?

Senhores sou novo aqui, e estou totalmente perdido com validação de cpf em java
na realidade tenho um sistema que estou criando e preciso que o banco não aceite o “cpf” se ele já existe no banco tudo isso, gostaria de saber como faço no btnGravar !

Obrigado!

Jefferson, Bom dia

Na realidade vc precisa sabe roque realmente precisa, no meu sistema utilizo um validador de cpf, muito bom por final, baixei da api Brasilutils.

Vc precisa desenvolver as suas camadas, por exemplo:

Camada Dao - faz a comunicação com o banco, aqui vc terá métodos de acesso ao banco, como inclusão e consulta de cpf´s

Camada de Serviço - Setá a sua camada da lógica de negocio, por exemplo apenas gravar o cpf se ele não estiver no banco, vc fará um mpetodo que dado o cpf, busque no banco, se não tiver vc chama o método de save, ai salva o cara no banco.

Camada Apresentação - Aqui que vem seu botão de incluir o cpf, ele chamara sua camada de serviço e a de serviço chamara o Dao.

Entendeu ? se precisar dos códigos eu posto aqui, me diz quais framework´s vc está usando ?

abs

Antes de mais nada, vaja a diferença entre VALIDAR CPF e NÃO ACEITAR CPF EXISTENTE

  1. CPF EXISTENTE: Se você usar este campo como chave primária e próprio banco se encarrega de não permitir a insersão de registros duplicados.
    Por outro lado, você pode não criar uma chave primária e usar um SELECT * FROM tabela WHERE cpf=cpfDigitado

  2. VALIDAÇÃO DE CPF: Este é um cálculo matemático que verifica os dois últimos algarismos do CPF digitado. A conta é a seguinte:
    CPF=asd.fgh.jkl-qw
    onde as letras representam os algarismos do CPF então você faz o seguinte
    (a+2s+3d+4f+5g+6h+7j+8k+9l) mod 11
    onde mod representa o resto da divisão da soma por 11. Este resto deve ser igual a q, se o resto for 10 então você considere como sendo 0 e checha se é igual a q, se não for o CPF é inválido. Feito isto, se o CPF for válido faz-se o seguinte
    (s+2d+3f+4g+5h+6j+7k+8l+9q) mod 11
    e o resultado deve ser igual aw, caso contrário o CPF é inválido.

Espero ter sido claro.

Aqui tem uma classe para Validar CPF, porém não verifica se o cpf já está cadastrado. Ve se ajuda

[code]public class ValidarCPF {

/** Creates a new instance of ValidaCpf */  
public ValidarCPF() {   
}   
public  boolean validacpf(String strCpf){ // formato XXX.XXX.XXX-XX   
    if (! strCpf.substring(0,1).equals("")){   
        try{   
            boolean validado=true;   
            int     d1, d2;   
            int     digito1, digito2, resto;   
            int     digitoCPF;   
            String  nDigResult;   
            strCpf=strCpf.replace('.',' ');   
            strCpf=strCpf.replace('-',' ');   
            strCpf=strCpf.replaceAll(" ","");   
            d1 = d2 = 0;   
            digito1 = digito2 = resto = 0;   
               
            for (int nCount = 1; nCount < strCpf.length() -1; nCount++) {   
                digitoCPF = Integer.valueOf(strCpf.substring(nCount -1, nCount)).intValue();   
                   
                //multiplique a ultima casa por 2 a seguinte por 3 a seguinte por 4 e assim por diante.   
                d1 = d1 + ( 11 - nCount ) * digitoCPF;   
                   
                //para o segundo digito repita o procedimento incluindo o primeiro digito calculado no passo anterior.   
                d2 = d2 + ( 12 - nCount ) * digitoCPF;   
            };   
               
            //Primeiro resto da divisão por 11.   
            resto = (d1 % 11);   
               
            //Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é 11 menos o resultado anterior.   
            if (resto < 2)   
                digito1 = 0;   
            else  
                digito1 = 11 - resto;   
               
            d2 += 2 * digito1;   
               
            //Segundo resto da divisão por 11.   
            resto = (d2 % 11);   
               
            //Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é 11 menos o resultado anterior.   
            if (resto < 2)   
                digito2 = 0;   
            else  
                digito2 = 11 - resto;   
               
            //Digito verificador do CPF que está sendo validado.   
            String nDigVerific = strCpf.substring(strCpf.length()-2, strCpf.length());   
               
            //Concatenando o primeiro resto com o segundo.   
            nDigResult = String.valueOf(digito1) + String.valueOf(digito2);   
               
            //comparar o digito verificador do cpf com o primeiro resto + o segundo resto.   
            return nDigVerific.equals(nDigResult);   
        }catch (Exception e){   
            System.err.println("Erro !"+e);   
            return false;   
        }   
    }else return false;   
}   

} [/code]

Aí vá no seu programa e coloque esse método

private void ValidaCPF(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_ValidaCPF ValidarCPF cpf = new ValidarCPF(); Boolean validado=cpf.validacpf(txtCPF.getText()); //Pega o texto do campo txtCPF e faz a verificação if(validado){ JOptionPane.showMessageDialog(null, "CPF Válido."); } else{ JOptionPane.showMessageDialog(null, "CPF Inválido. Digite outro."); }

Jefferson,

Se você deseja que a sua base de dados não aceite um CPF já cadastrado, então você cria uma restrição, a nível de banco de dados, para que este não possa ser inserido novamente caso exista qualquer tentativa. O banco reportará uma exceção e você pode identificá-la e tratá-la da melhor forma.

Abraço.

Jonimca, qual esse site da BrasilUtils ? acho que ele me será muito útil tbm…

Abraços 8)

o site por enquanto é: https://brazilutils.dev.java.net/

Mas estamos desenvolvendo o novo!!Aguardem… 8)

Valew cara… 8)

Legal, nova versão :smiley: quando vai sair?
Eu já uso o BrazilUtils para verificar IE, CPF e CNPJ no meu projeto.

se for fazer no Banco de dados, crie uma constraint, não invente de criar chave composta ou coisas assim.

se for fazer na camada de aplicação, basta fazer uma consulta nesse cpf : se ja existe, aborta a inclusão.

[quote=peczenyj]se for fazer no Banco de dados, crie uma constraint, não invente de criar chave composta ou coisas assim.
[/quote]

Caro amigo, você poderia me informar onde encontro material sobre constraint, pois eu não sabia da existência dele. Pergunta: Não basta por uma chave primária no banco?

na realidade o ideal é uma constraint, como o peczenyj falou

UNIQUE constraint

La vai uma dica… pra deixar sua tela um pouquinho mais rapida… procure usar javascript pra fazer a validação do cpf… assim ele faz no proprio cliente e nao no servidor economiza requesições… então depois caso o cpf seja valido entao vc verifica se ele ja existe na base… assim vc so tera 2 procedimentos no servidor… verificar se o cpf ja existe e caso não exista gravalo…

Ok, mas ninguém respondeu o que é uma constraint.

Meus Amigos vocês são demais, era justamente isso que eu precisava!!
Muitoo Obrigado valeu mesmo!!!
Puts não sabia que era tão bom e fácil fazer tais perguntas!!
E perceber que o pessoal estava assim pronto para ajudar!!!

Obrigado!!!

Bom Senhores consegui resolvê o problema de validação do cpf, agora estou com outro probleminha

Tenho um método chamado verificacampos, para verificar os campos não prenchidos, no TxtNomeCliente ele funciona direitinho, mais quando chega no cpf ele mostra a mensagem mais também, quando eu preencho com os dados do cpf ele continua mostrando a mensagem, Se tiver alguém possa me ajudar!!! desde já agradeço.

Disculpe a minha ignorancia, mais valeu assim mesmo!!

Aqui é o ection do botão onde eu chamo o método verifica campos

private void BtnGravarActionPerformed(java.awt.event.ActionEvent evt) {
if (evt.getSource()==BtnGravar){
if(verificaCampos()){

            Gravar();
      }
    }

}      

Método verifica campos, se Cpf não tiver dados eu peço para preencher

private boolean verificaCampos() {

    if (TxtNomeCliente.getText().equals("")){
        JOptionPane.showMessageDialog(null,"O campo NOME deve ser preenchido!");
        TabCliente.requestFocus();
        PanelEndereco.requestFocus();
        TxtNomeCliente.requestFocus();
        return false;
    }

    if (!FormatCpf.getText().equals("")){
        JOptionPane.showMessageDialog(null,"O campo CPF deve ser preenchido!");
        TabCliente.requestFocus();
        PanelEndereco.requestFocus();
        FormatCpf.requestFocus();
        
        return false;
    }
    else return true;
    
}

quando eu não preencho o campo o método funciona direitinho, mais se eu coloco os dados no campo cpf ele também, retorna a mensagem acima"O campo CPF deve ser preenchido!"
desculpe,

Traduzindo:

 if (!FormatCpf.getText().equals("")){

se o texto do cpf não for igual a “”

Oque você quer é se realmente ele for igual então tire o ! que significa negação

E sobre convenções em atributos e métodos sempre começe o nome com letra minuscula e as proximas iniciais em maiuscula.

[quote=Mark_Ameba]Traduzindo:

 if (!FormatCpf.getText().equals("")){

se o texto do cpf não for igual a “”

Oque você quer é se realmente ele for igual então tire o ! que significa negação

E sobre convenções em atributos e métodos sempre começe o nome com letra minuscula e as proximas iniciais em maiuscula.[/quote]

Pô cara obrigado!

Mais já tirei “!” e o método não funciona, funciona somente no primeiro cmpo que é txtNomeCliente mais sem o ! ele acaba gravando no banco o Cpf “sem números, dados” e é justamente isso que eu não quero permitir

Concordo que vai ficar mais rápido pondo o computador do cliente para calcular, mas o que acontece se a máquina estiver desabilitada para rodar scripts?

Mark_Ameba,
o nosso site estará no ar logo, mas ainda baseado no release antigo(0.1.1).Ainda estamos terminando de definir os requisitos para a versão final do 0.2. Há vários códigos prontos que alguns me enviam, mas falta definir-mos um esquema para testar e melhorar o escopo. :smiley: