Array
(
)

Cliente / Servidor [DBExpress Firebird ] Delphi 7

Daniellqueiroz
   - 13 jan 2006

Galera, estou tendo o seguinte erro quando tento incluir um novo
cadastro na minha aplicação : ´DBEXPRESS ERROR: DUPLICATE TRANSACTION
ID´. Segue abaixo o meu código:

Pesquisei muito pela net, em busca de bons tutoriais sobre o
DBexpress, mas nunca encontro nada, nem mesmo em inglês, se alguém
souber onde encontrar uma boa apostila, por favor me avisem.

unit UFuncoes;

var
Transacao : TTransactionDesc;

implementation

// Cadastrar novo

procedure NewReg(aux: TClientDataSet);
begin
try
Transacao.TransactionID := 1;
Transacao.IsolationLevel := xilREPEATABLEREAD;
DM.SQLConnection1.StartTransaction(Transacao);
aux.Insert;
aux.FieldByName(´CODIGO´).AsInteger := MaxInt;
except
on Exc:Exception do
begin
ShowMessage(´Ocorreu um erro na tentativa de inclusão do
registro: ´ + Exc.Message);
DM.SQLConnection1.Rollback(Transacao);
end;
end;

end;

/ Confirmar o Registro atual

procedure ConfirmReg(aux: TClientDataSet);
var
r: integer;
begin
try
Transacao.TransactionID := 1;
Transacao.IsolationLevel := xilREPEATABLEREAD;
DM.SQLConnection1.StartTransaction(Transacao);
aux.ApplyUpdates(0);
r := aux.RecNo;
DM.TVendedores.Close;
DM.TVendedores.Open;
aux.Refresh;
aux.RecNo := r;
except
on Exc:Exception do
begin
ShowMessage(´Ocorreu um erro na tentativa de inclusão do
registro: ´ + Exc.Message);
DM.SQLConnection1.Rollback(Transacao);
end;
end;

end;

// Deletar o registro atual

procedure DelReg(aux: TClientDataSet);
begin
try
Transacao.TransactionID := 1;
Transacao.IsolationLevel := xilREPEATABLEREAD;
DM.SQLConnection1.StartTransaction(Transacao);
if aux.RecordCount = 0 then
MessageDlg(´Tabela Vazia!´,mtWarning,[mbOK],0)
else
if MessageDlg(´Deseja realmente apagar este registro?´,
mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
aux.Delete;
aux.ApplyUpdates(0);
DM.SQLConnection1.Commit(Transacao);
end;
except
on Exc:Exception do
begin
ShowMessage(´Ocorreu um erro na tentativa de exclusão do
registro: ´ + Exc.Message);
DM.SQLConnection1.Rollback(Transacao);
end;
end;

end;


// Edita o registro atual

procedure EditReg(aux: TClientDataSet);
begin
try
Transacao.TransactionID := 1;
Transacao.IsolationLevel := xilREPEATABLEREAD;
DM.SQLConnection1.StartTransaction(Transacao);
aux.Edit;
DM.SQLConnection1.Commit(Transacao);
except
on Exc:Exception do
begin
ShowMessage(´Ocorreu um erro na tentativa de alteração do
registro: ´ + Exc.Message);
DM.SQLConnection1.Rollback(Transacao);
end;
end;

end;

Abraços!


Thomaz_prg
   - 13 jan 2006

Apostilas não sei, mas eu uso a propriedade Tag do SQLConnection para definir o ID da transação. Tipo, criei uma função (PegaIDTrans:Integer) que incrementa o ID e me retorna o valor e após o COmmit, ou Rollback, decremento a transação. Isso resolveria este problema.


Renatacoimbra
   - 14 jan 2006

Procure um Artigo sobre Transações Por Eugenio Reis aqui: http://www.delphibr.com.br/index.php

...


Daniellqueiroz
   - 16 jan 2006

Valeu pelas dicas galera, mas só consegui resolver o problema comprando um livro. [BORLAND DELPHI 6 Guia do Desenvolvedor] Agora as coisas estão bem melhores, qualquer bronca em relação a esse assunto, é só perguntar que daqui a pouco tempo já vou estar pronto p/ ajudar tb.

Abraços!


Thomaz_prg
   - 16 jan 2006

Amigo já que seu problema se resolveu e não foi usando nenhuma das respostas acima, se possível, poste a solução para que outros que tenham o mesmo problema possam ser auxiliados.


Daniellqueiroz
   - 17 jan 2006

Como o nosso amigo thomaz_prg pediu, eu estou postando como consegui resolver o problema. Primeiro eu aprendi que não é necessário que eu tenha o controle das transações, pois o isso é muito bem gerenciado pelo Delphi. E tb aprendi que eu só vou precisar tomar o controle dessas transações em momentos bem especificos, como por exemplo, em formulários master/detail.

Dai, ficou bem simples o código, como vcs podem ver:

// Cadastrar novo

procedure NewReg(aux: TClientDataSet);
begin
try
aux.Append;
except
on Exc:Exception do
MessageDlg(´Ocorreu um erro na tentativa de inclusão do registro: ´+ Exc.Message,mtError,[mbOK],0)
end;

end;

procedure CancelReg(aux: TClientDataSet);
begin
try
aux.cancel;
except
on Exc:Exception do
MessageDlg(´Ocorreu um erro na tentativa de cancelamento do registro: ´+ Exc.Message,mtError,[mbOK],0)
end;
end;

procedure ConfirmReg(aux: TClientDataSet);
begin
try
aux.Post;
aux.ApplyUpdates(0); // Grava os dados no servidor
aux.Close;
aux.Open; // Atualiza os dados p/ visualização
except
on Exc:Exception do
MessageDlg(´Ocorreu um erro na tentativa de confirmação do registro: ´+ Exc.Message,mtError,[mbOK],0)
end;

end;


// Deletar o registro atual

procedure DelReg(aux: TClientDataSet);
begin
try
if aux.RecordCount = 0 then
MessageDlg(´Tabela Vazia!´,mtWarning,[mbOK],0)
else
if MessageDlg(´Deseja realmente apagar este registro?´, mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
aux.Delete;
aux.ApplyUpdates(0);
end;
except
on Exc:Exception do
MessageDlg(´Ocorreu um erro na tentativa de exclusão do registro: ´+ Exc.Message,mtError,[mbOK],0)
end;
end;


// Edita o registro atual

procedure EditReg(aux: TClientDataSet);
begin
try
aux.Edit;
aux.ApplyUpdates(0);
except
on Exc:Exception do
MessageDlg(´Ocorreu um erro na tentativa de edição do registro: ´+ Exc.Message,mtError,[mbOK],0)
end;
end;


Uma forma bem simples, e que resolveu o problema. Pelo menos aqui, está tudo funcionando corretamente.

Obrigado a todos pela força!!