Transações
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
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
Curtidas 0
Respostas
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
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