Transações

Delphi

28/11/2003

Pessoal, estou apanhando pra aprender esses esquemas de transações, alguém tem um exemplo para que eu possa seguir?

Estou com dificuldade pra saber quando eu dou o startcommit/commit, enfim

Toda vez que eu vou gravar algum registro eu coloco:

ClientDataSet.post;
ClientDataSet.ApplyUpdates(0);
Transaction.Commit;

Pois bem!!!!!!

Onde posso colocar o bendito do StartTrasaction????

Eu estou fazendo assim quanto insiro um novo registro:

Transaction.StartTrasaction;
ClientDataSet.Insert;

É Claro que esta errado isso não ta funcionando!!! E como eu faço esse esquema?

Alguém me ajuda por favor?

Agradeço

Fábio Gomes


Fabio.palm

Fabio.palm

Curtidas 0

Respostas

Biscalquini

Biscalquini

28/11/2003

procedure TDataModule.Grava(Tabela: TDataSet);
Var TR: TTransactionDesc;
begin
If Tabela.State in [dsInsert, dsEdit] Then
Begin
If (Tabela as TClientDataSet).ChangeCount>0 Then
(Tabela as TClientDataSet).ApplyUpdates(0);
End
Else
(Tabela as TClientDataSet).ApplyUpdates(0);
Try
If not SQLConnection.InTransaction Then
Begin
QueryGenerator.Open;
TR.TransactionID:= QueryGenerator.FieldByName(´TRANSACAO´).Value;
QueryGenerator.Close;
TR.IsolationLevel:=xilREADCOMMITTED;
SQLConnection.StartTransaction(TR);
Try
SQLConnection.Commit(TR);
Except
SQLConnection.Rollback(TR);
MessageBox(0,´Erro ao gravar no banco de dados!´,´Erro crítico!´,MB_OK+MB_ICONERROR);
End;
End;
Except on E: Exception do
Begin
ShowMessage(´Erro ao gravar no banco de dados! ´+E.Message);
Abort;
End;
End;
End;

Coloque isto no seu data module. Funciona da seguinte forma:

- QueryGenerator: Soma 1 em um generator no seu Firebird e depois retorna o valor dele, assim sua transação nunca terá o mesmo ID. o código é: ´SELECT CAST(GEN_ID(TRANSACAO_GENERATOR,1) AS INTEGER) AS TRANSACAO FROM RDB$DATABASE´

- Depois ele começa a transação e se der algum erro ele exibe na tela.

É bem simples de usar:

No AfterPost do ClientDataSet coloque: DataModule.Grava(DataSet);

Vc pode colocar o mesmo no AfterDelete, e mais, pode usar sempre a mesma coisa para todos os ClientDataSet, é só definir no na aba de events do Object Inspector. Ex: No After Post do outro ClientDataSet coloque: ClientDataSet1AfterPost, o código é o mesmo para todos os ClientDataSet

Qualquer dúvida ICQ 89085074

espero ter ajudado


GOSTEI 0
POSTAR