Validando Duplicidade de CPF no cadastro

Tenho o seguinte código abaixo para validar a existência do mesmo CPF no cadastro, esta funcionando em parte , como fazer para que não deixar passar quando existir.

sc_lookup(rs,“Select count(*) from tb_candidatos where cpf={cpf}”);
if(!empty({rs[0][0]})){
sc_error_message(“Este CPF já foi cadastrado.”);
}

Obrigado

Gilmar Monteiro

Voce pode definir como chaves únicas, ate mesmo mais de um campo se preferir.

Abraços

estou tentando tanto na atualização como na inserção, criticar a duplicidade

na OnBeforeInsert está OK

na OnAfterUpdate e na OnBeforeUpdate ele indica que está sendo duplicado o valor que está na tela (caso eu esteja atualizando), ou seja, se eu estiver alterando algo em um campo qualquer, ele diz que o CPF que está nesta tela ja existe.

sc_lookup(DS,“Select count(*) from adm_os where numero_boleto={numero_boleto}”);
if(!empty({DS[0][0]})){
sc_error_message(“O CPF {cpf} JÁ FOI CADASTRADO !!!”);
}

Como fazer a critica ignorando o CPF que está na tela e buscando no BD algum identico a esse ?

Usei o exemplo http://www.scriptcase.com.br/site/baseknowledge/baseknowledge.php?id_topico=191 mais o mesmo so serve para Inclusão… Futuras alterações não…

inclua o cpf com chave, no menu do formulário tem esse item que você informa a verificação da existência do registro,se aquele campo for chave unica.

Até pensei isso meu brother… mais o campo CPF pode ser NULL na inclusão… na alteração que o pessoal vai adicionando o mesmo… ou seja, ja tenho varios CPF “zerados” no BD, se eu tentar gravar outro, sendo chave unica, ele dá como Erro ao alterar a base de dados - chave unica existente (pois ja existe CPF vazios no meu BD)… um abração meu brother… e se souber de mais algo, favor retornar… RESUMINDO…seria um campo que não pode duplicar se ja possuir um valor identico (exceto NULL)…

na onvalidate faça um sc_lookup pelo campo em questão, se já existir na base, e o id da tabela retornado pelo sc_lookup for igual ao id do campo buferizado (em tela) vc deixa passar pois esta fazendo um update, no próprio registro, se for diferente, vc estará tentando incluir uma chave já existente para outro registro,então vc executa a sc_error_message,que a gravação não será efetivada.

Ae galera, critica, tem que ser no onvalidate.

na OnBeforeInsert está OK - Nesse evento, ja passou da validação e esta preparado para inserir.
OnAfterUpdate - Ja atualizou …

Basta colocar seu codigo no onvalidate.

sc_lookup(DS,“Select count(*) from adm_os where numero_boleto={numero_boleto}”);
if(!empty({DS[0][0]})){
sc_error_message(“O CPF {cpf} JÁ FOI CADASTRADO !!!”);
}

se for atualização e o registro existir não vai dar o erro aqui, e é justamente isso que o Eduardo não quer?

O resto da resposta era para o Gilmar, ja que ele quer parar o processo ao existir duplicidade, foi mal a confusão:

No onValidate:

sc_lookup(rs,“Select count(*) from tb_candidatos where cpf={cpf}”);
if(isset({rs[0][0]}) && !empty({rs[0][0]})){
sc_error_message(“Este CPF já foi cadastrado.”);
}

Lembrar de testar o isset ou se por algum motivo/pau/erro nao vier do banco, o recordset vai estar vazio e dara erro de undefined offset.

o de Eduardo seria interessante usar a macro sc_changed para saber se o campo foi alterado. Pois na atualização, se ninguem mexeu, não é para verificar ele mesmo, não é? Se nao vai achar ele mesmo no banco :-p Ou ja to cansado e misturando tudo :-p

também é uma saída, mas se houve a alteração, de qualquer forma terá que verificar se o CPF não existe para outro registro.

Dúvida.
Fiz deste jeito em OnValidate, funcionou.

sc_lookup(DS,“Select count(*) from ccb_fornecedor where forn_cnpj={cnpj}”);
if(!empty({DS[0][0]})){
sc_error_message(“O CNPJ

{cnpj} já está cadastrado.”);
}

Agora se o cnpj não existe, como faço para chamar a cad_fornecedor.php ?
Coloquei else sc_redir(Cad_fornecedor.php) – mas deu erro.

Resolvido: coloquei sc_redir(Cad_fornecedor.php) no OnValidateSuccess – agora está OK.

Esta maneira foi a primeira que eu usei (veja os primeiros topicos). Caso voce esteja atualizando alguma coisa no mesmo registro, ele indica que o CNPJ ja existe (sendo que o CNPJ é dele mesmo). O negocio é como o Harold falou…

sc_lookup(DS,“Select count(*) from ccb_fornecedor where forn_cnpj={cnpj} AND id <> {id}”);
if(!empty({DS[0][0]})){
sc_error_message(“O CNPJ

{cnpj} já está cadastrado.”);
}

Ai funciona blz…