Desativar IBTransaction sem desativar IBQuery

Delphi

19/12/2012

Olá pessoal, eu estava com problemas de deadlock em um sistema comercial que desenvolvi. Através das pesquisas que fiz, me indicaram sempre desativar o IBTransaction após gravar os dados no BD. Porém, isto gera um efeito colateral, isto está fechando também as IBQuery(s). E quando eu abro novamente, ele volta pro primeiro registro e não no que estava. Alguem tem alguma solução mais simplificada pra resolver isto sem ter que ficar refazendo a pesquisa depois de reativar a IBQuery?

Código usado pra salvar:

DataModule1.IBQCliente.Post;
DataModule1.IBQCliente.ApplyUpdates;
DataModule1.IBTransaction1.Active:=true;
DataModule1.IBQCliente.Transaction.CommitRetaining;
DataModule1.IBTransaction1.Active:=false;
DataModule1.IBQCliente.Active:=true;

O ideal seria manter a IBQuery aberta já que eu usei o CommitRetaining...
Daniel Pessoa

Daniel Pessoa

Curtidas 0

Respostas

Claudia Nogueira

Claudia Nogueira

19/12/2012

O Commit fecha tudo que está ligado a ele.
Depois de abrir a query você tem que posicionar no registro que estava antes, então você tem que marcar a posição.

Exemplo:
Var
bmPosicao : TBookmark;
begin
bmPosicao := DataModule1.IBQCliente.GetBookmark;
DataModule1.IBQCliente.Post;
DataModule1.IBQCliente.ApplyUpdates;
DataModule1.IBTransaction1.Active:=true;
DataModule1.IBQCliente.Transaction.CommitRetaining;
DataModule1.IBQCliente.Close;
DataModule1.IBQCliente.Open;
    try
      DataModule1.IBQCliente.GotoBookmark(bmPosicao);
    except
      DataModule1.IBQCliente.First;
    end;
DataModule1.IBQCliente.FreeBookmark(bmPosicao);
end;
GOSTEI 0
Daniel Pessoa

Daniel Pessoa

19/12/2012

É isto que eu estava fazendo, mas queria saber se não havia um jeito mais fácil. Porque pelo que pesquisa o Commit fecha, mas o CommitRetaining deveria deixar o registro aberto.
GOSTEI 0
POSTAR