Estou usando a seguinte SP no FireBird 1.5
CREATE PROCEDURE PROC_INS_USUARIO (
nome_usu varchar(70),
senha_usu varchar(50))
as
BEGIN
INSERT INTO USUARIO (USU_NOME, USU_SENHA)
VALUES (:NOME_USU, :SENHA_USU);
END
no datamodule estou usando
SQLConnection -> SQLDataSet -> DataSetProvider -> ClientDataSet -> DataSource
SQLStoredProc <ligado a procedure> PROC_INS_USUARIO
código referente a ´SQLStoredProc´ do botão salvar (insert ou update dos dados no banco)
procedure TFrmUsuarios.BtnSalvarClick(Sender: TObject);
begin
if not validaCampos then
Exit;
case strOper of
´I´:
begin
//Verifica se já existe um registro com o mesmo valor
with DmConsulta.CDSConsulta do
begin
Close;
CommandText:= ´SELECT count(1) FROM USUARIO WHERE USU_NOME = ´ + QuotedStr(AnsiUpperCase(EditNomeUsuario.Text));
Open;
if Fields[0].AsInteger <> 0 then
begin
MessageDlg(´Usuário já cadastrado no sistema!´ + #13 + ´Informe outro nome.´, mtInformation, [mbOk], 0);
EditNomeUsuario.SetFocus;
Exit;
end else
end;
with DmProcesso.SQLSProc_USUARIO_INS do
begin
Close;
ParamByName(´NOME_USU´).AsString := EditNomeUsuario.Text;
ParamByName(´SENHA_USU´).AsString := EditSenhaUsuario.Text;
try
ExecProc;
except
on E : Exception do
begin
MessageDlg(E.Message, mtError, [mbOk], 0);
Abort;
end;
end;
end;
end;
´A´:
begin
//Verifica se houve mudança no campo
if Trim(EditNomeUsuario.Text) <> DmConsulta.CDSConsulta.FieldByName(´USU_NOME´).AsString then
begin
//Verifica se já existe um registro com o mesmo valor
with DmConsulta.CDSConsulta do
begin
Close;
CommandText:= ´SELECT count(1) FROM USUARIO WHERE USU_NOME = ´ + QuotedStr(AnsiUpperCase(EditNomeUsuario.Text));
Open;
if Fields[0].AsInteger <> 0 then
begin
MessageDlg(´Usuário já cadastrado no sistema!´ + #13 + ´Informe outro nome.´, mtInformation, [mbOk], 0);
EditNomeUsuario.SetFocus;
Exit;
end else
end;
end else
if ConfirmaSenha(Senha) then
if Senha <> DmConsulta.CDSConsulta.FieldByName(´USU_SENHA´).AsString then
begin
MessageDlg(´Senha não confere.´ + 13 + ´Repita a operação e tente novamente!´, mtInformation, [mbOk], 0);
Exit;
end else
with DmProcesso.SQLSProc_USUARIO_UPD do
begin
Close;
ParamByName(´COD_USU´).AsInteger := DSConsulta.DataSet.FieldByName(´USU_COD´).AsInteger;
ParamByName(´NOME_USU´).AsString := EditNomeUsuario.Text;
ParamByName(´SENHA_USU´).AsString := EditSenhaUsuario.Text;
try
ExecProc;
except
on E : Exception do
begin
MessageDlg(E.Message, mtError, [mbOk], 0);
Abort;
end;
end;
end;
end;
end;
strOper := ´C´;
if DSConsulta.DataSet.Active then
DmConsulta.CDSConsulta.Refresh;
DSConsulta.DataSet.Close;
limpaCampos;
habilitaBotoes(strOper);
habilitaCampos(False);
end;
O que estar acontecendo agora é que quando não dar erro de ´deadlock´ salva os dados repetidos no banco (quando salvos no mesmo momento) , mas se um usuario salvar algo e em alguns segundos um outro usuario tentar a mesma informação ai o sistema ja consegue detectar que ja existe um cadadtrado, quando não cadastra a mesma informação repetidamente.
O que poderá estar faltando? estou quase lá!!!