Array
(
)

Registro Duplicado

Slipkorn
   - 27 mar 2006

Bom dia,

Estou com um problema... gostaria de verificar sem um derminado nome já foi cadastrado, já pesquisei bastante... cheguei ao seguinte código:

if (dm.IBDataSetDepto.Locate(´NOME_DEPTO´,DBEdit2.Text,[])= true)
then
begin
MessageBox(Self.Handle, PChar(´Registro já cadastrado´), ´Cadastro cancelado´, MB_OK +
MB_ICONWARNING);

end;

O problema é que estou usando IBDataSet com dbedit, e mesmo antes do Post já avisa que foi cadastrado mesmo que não tenha sido anteriormente... segue o código completo do btnSalvar

procedure TFrmCadDepartamento.btnSalvarClick(Sender: TObject);
var
result:Integer;

begin

if (controle = ´i´) and (validaCampos=true) then
if MessageBox(handle,´Confirmar inclusão do Deparmento?´, ´Confirmação´,MB_YESNO+MB_ICONQUESTION) = idNo
then
DM.IBTrDepto.Rollback
else
result:=IDYES;

if (controle = ´a´) and (validaCampos=true)then
if MessageBox(handle,´Confirmar alteração do Deparmento?´, ´Confirmação´,MB_YESNO+MB_ICONQUESTION) = idYes
then
DM.IBTrDepto.Rollback
else
result:=IDYES;


if (result=idYES) then
begin
try
dm.IBDataSetDepto.Post;
dm.IBTrDepto.Commit;
except on EIBInterBaseError do
begin MessageDlg(´Registro duplicado.´,mtError,[mbNo],0);
DBEdit2.SetFocus;
end;
end;
end;

end;


Rjun
   - 27 mar 2006

Quando você executa o comando LOCATE você está movendo o ponteiro da sua tabela. Nesse momento é feito o post na sua tabela.


Rjun
   - 27 mar 2006

Continuando...

por isso o locate retorna que o nome digitado existe, pois ele salvou o nome que você informou. Para você fazer isso você deve abrir mão de compoentes DataAware ou ter um dataset auxiliar.


Martins
   - 27 mar 2006

Uma outra opção já q vc está usando IB seria construir uma trigger no before insert para disparar um exception caso o nome já exista na tabela.