Como evitar duplicidade de registros?

05/11/2009

Quais comandos necessarios para por em um cadastro de clientes, na hora de inserir os dados não cadastrar dois nomes iguais? utilizo o simple dataset do dbexpress. Grato!!!

Connection

Respostas

05/11/2009

Pjrm1470

Use uma query para buscar o nome que será inserido antes de dar o insert.
| SELECT NOME
|   FROM SUATABLE
|  WHERE NOME = :NOME

Passe o nome para o parametro. Abra a query e verifique se há o nome. se houver, não grava, se houver grava. (depende da sua logica)

| QueryVerifica.Close;
| QueryVerifica.Parameters[0].Value := Nome;
| QueryVerifica.Open;
| if (QueryVerifica.RecordCount > 0) then //se for maior que zero o nome existe
|   ...//então grava
| else //caso contrario num grava

Existe outras maneiras de se verificar, tem gente que verifica se o Field é nulo (particulamente não gosto, pois não se sabe se tem mais de um registro se num vir nulo).

Qualquer coisa, tamo ae.
Att,
Plínio.
Responder Citar

06/11/2009

Jorge Abreu

Particularmente eu prefiro criar um função booleana que verifique se o registro existe na tabela, muito antes de colocar a tabela em modo de inserção, se o registro for encontrado, eu coloco o registro todo nas caixas de textos e em modo de edição, se não for encontrado, ai sim eu coloco a tabela em modo de inserção, aproveitando o valor que foi digitado, é mais prático para o usuário, pois assim voce não precisa acionar novamente o botão de inclusão em caso de não encontrar o registro e saberá se o registro existir no momento em que ele for mostrado todo na tela, permitindo assim uma checagem maior do registro, eis o código:   Declare a função ou no bloco private ou no public da classe e vamos criar uma variável Box do tipo String também em private ou public, assim:  
    TForm1 = class(TForm)
    ....
    ...
    private
        { Private declarations }
        Box: String;
        function CheckRecord: Boolean;
        ,,,,
    public
        { Public declarations }
        ....
    end;
 
  function TForm1.CheckRecord: Boolean;
  begin
      Box := InputBox('Digite o nome do Cliente','Checando o registro','');
      if (Box = ' ') or (Box = '') then begin
          ShowMessage('Campo em branco ou operação cancelada');
          Result := False;
     end else
         with IBDatasetCliente do begin
             Close;
             SelectSQL.Clear;
             SelectSQL.Add('Select * from Cliente Where nomecliente like :nome');
             ParamByName('nome').Value := '%' + Box + '%';
             Open;
             if Eof then
                Result := False
             else
                Result := True;
     end;
end;
  No botão de inclusão voce pode colocar esse código:  
  procedure TForm1.btnIncluirClick(Sender: TObject);
  begin
       if CheckRecord then
          IBDataSetCliente.Edit
       else if (Box <>'') or (Box <>' ') then begin
          IBDataSetCliente.Append;
          IBDataSetCliente.FieldByName('NomeCliente').Value := Box;
       end;
  end;
  Voce deve estar me perguntando o porque usei a função InputBox dentro da função Boolean CheckRecord, o InputBox é um função que coloca uma caixa de texto com um componente TEdit para voce digitar um valor, isto pois se voce estiver utilizando DBEdit que são ligado a dados, é recomendável que não se faça qualquer digitação de pesquisa neles, pois voce corre o risco de gravar dados indesejados na tabela, faça num TEdit a parte, como fiz com o InputBox,   Um abraço 
Responder Citar