Travar e destravar registro no firebird

Firebird

17/11/2008

Estou desenvolvendo uma aplicação com Firebird 2.0, Delphi 7 e DBExpress. Uso o driver UIB FireBird15 para conexão com o banco de dados. Tenho um DataModule(Name = DM) com um SQLConnection(name = SQLConnection1) e uma TSQLQuery(Name = Q_Max) para consultas auxiliares.
No formulário de cadastro os componente DBEdit´s estão ligados a um ClientDataSet (name = cdsCad) que esta ligado a um
DataSetProvider(name = dspCad) que esta ligado a um TSQLQuery(name = Q_Cad) que esta ligada ao SQLConnection. A Q_Cad tem a instrução ´select VENDAID, ID, DESCRICAO from T00_VENDAS where vendaid = :P_VendaID´.
Faço a busca normalmente, carrego o registro normalmente com um duplo clique no DBGrid.
A questão é:

1) Quero bloquear o registro quando o usuário clicar em editar, o que esta acontecendo sem problemas seguindo um exemplo aqui do próprio fórum.
Vejam a seguir a rotina completa do botão editar:
procedure TFormDBExpress.fraCadastrobtnEditarClick(Sender: TObject);
var
strsql : string;
begin
try
if cdsCad.IsEmpty then
begin
Application.MessageBox(´Selecione um registro para editar! Ação cancelada!´, ´DBExpress´, MB_ICONWARNING);
Exit;
end;
dbcmbClienteID.Enabled := True;
strsql := ´ SELECT * FROM T00_VENDAS WHERE VENDAID = ´ + IntToStr(cdsCadVENDAID.AsInteger) + ´ with lock´;
DM.Q_Max.Close;
DM.Q_Max.SQL.Text:= strsql;
DM.Q_Max.Open;
cdsCad.Edit;
prBotoes;
except
strsql := stringreplace(strsql,´with lock´,´´,[rfReplaceAll]);
DM.Q_Max.Close;
DM.Q_Max.SQL.Text:= strsql;
DM.Q_Max.Open;
Application.Messagebox(´Registro está sendo utilizado por outro usuário!´,´DBExpress´, MB_ICONEXCLAMATION);
end;
end;

Código do botão gravar:
procedure TFormDBExpress.fraCadastrobtnGravarClick(Sender: TObject);
begin
if cdsCad.UpdateStatus = usInserted then
begin
DM.Q_Max.Close;
DM.Q_Max.SQL.Text:= ´select max(vendaid) from t00_vendas´;
DM.Q_Max.Open;
cdsCadVENDAID.AsInteger := DM.Q_Max.FieldByName(´MAX´).AsInteger + 1;
end;
cdsCad.ApplyUpdates(0);
dbcmbClienteID.Enabled := False;
prBotoes;
end;
Até aqui tudo bem. Executo a aplicação e edito um registro e o registro fica bloqueado.
O problema é quando executo a aplicação novamente e tento editar o mesmo registro para mostrar a mensagem ´Registro está sendo utilizado por outro usuário!´. O sistema trava e fica o botão editar clicado, só quando cancelo a edição da tela anterior e saio do sistema é que a edição do registro da desta tela é realizada!
Onde estou errando? Só falta isso para ficar perfeito!
Depois de resolvido isso, como faço para destravar o registro?
Desde já agradeço. Um abraço.


Developer1978

Developer1978

Curtidas 0
POSTAR