Transações Delphi X firebird

Delphi

19/08/2009

Boa Tarde, Senhores!!!

Estou há algum tempo procurando a melhor forma de trabalhar com controle de transações no delphi com firebird, já pesquisei muito material, sei como´startar´, ´comitar´ e ´rollback´, mas até agora não vi exemplos práticos de como utilizar isto num projeto. Vou ser mais específico:

Devo controlar as transações por acesso ao banco (uma transação por aplicativo rodando) ou controlar as transações por tipo de cadastro(produto, fornecedor, pedido, etc)?


Obs. No meu projeto atual o usuário consegue inserir um novo tipo de produto na inclusão de um pedido, po exemplo.


Makarioszen

Makarioszen

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

20/08/2009

no caso de gravação de um único registro não há necessidade de abrir uma transação, pois se uma não estiver aberta, o próprio SGBDR abre uma implícitamente e a fecha (commit ou rollback) após tentar gravar o registro.

uma transação explícita só é necessária no caso de manipular mais de 1 registro e, caso ocorra algum erro, nada deva ser gravado. por exemplo:
se você tem um procedimento para geração de notas fiscais que, ao confirmar a geração da nota:
- grave a nota em si
- gere os títulos no financeiro
- manipule o estoque
- grava os registros contábeis
- manipula os livros fiscais

nesse caso você deve abrir a transação antes de iniciar a primeira tarefa e tenta ´comitar´ ao finalizar a última. caso alguma levante alguma exceção, você dá um rollback e cancela todas as alterações.

try
  StartTransaction;
  
  NotaID := gravaNota; // grava a nota e obtem o ID
  geraTitulos( NotaID ); // gera os títulos no financeiro
  manEstoqueNF( NotaID ); // efetiva a manutenção no estoque
  contGerNF(NotaID ); // grava os registros contábeis
  livrosGerNF( NotaID ); // manipula os livros fiscais

  Commit; // tenta gravar os dados
except
  Rollback; // caso haja erro em alguma das rotinas, cancela tudo
end



GOSTEI 1

Mais Respostas

Dicasecodigosdelphi

Dicasecodigosdelphi

19/08/2009

Boa Tarde, Senhores!!! Estou há algum tempo procurando a melhor forma de trabalhar com controle de transações no delphi com firebird, já pesquisei muito material, sei como´startar´, ´comitar´ e ´rollback´, mas até agora não vi exemplos práticos de como utilizar isto num projeto. Vou ser mais específico: Devo controlar as transações por acesso ao banco (uma transação por aplicativo rodando) ou controlar as transações por tipo de cadastro(produto, fornecedor, pedido, etc)? Obs. No meu projeto atual o usuário consegue inserir um novo tipo de produto na inclusão de um pedido, po exemplo.



 Boa noite, voce deve iniciar uma transação para cada cadastro tipo inclui um produto starta transação faz o applyupdate e commit, é mais garantido pois se der problema ele retornara apenas o trecho entre o start e commit. No caso de "produto na inclusão de um pedido" start transação para produto commit da um refresh depois carrega o produto para o pedido que ja te outra transação startada e no final do pedido comita o pedido



GOSTEI 0
Keron

Keron

19/08/2009

Um pequeno exemplo prático de transação
if not IBTransacao.InTransaction then
      IBTransacao.StartTransaction;

   SPCadastroParametros.Params[0].Value:=vb_numero;
   SPCadastroParametros.Params[1].Value:=vb_numconta;
   SPCadastroParametros.Params[2].Value:=vb_tipo;
   SPCadastroParametros.ExecProc;

IBTransacao.Commit;



A cada cadastro como falou nosso colega acima, lembrando de deixar a transação aberta o menor tempo possível.


GOSTEI 0
Keron

Keron

19/08/2009

Um pequeno exemplo prático de transação
if not IBTransacao.InTransaction then
      IBTransacao.StartTransaction;

   SPCadastroParametros.Params[0].Value:=vb_numero;
   SPCadastroParametros.Params[1].Value:=vb_numconta;
   SPCadastroParametros.Params[2].Value:=vb_tipo;
   SPCadastroParametros.ExecProc;

IBTransacao.Commit;



A cada cadastro como falou nosso colega acima, lembrando de deixar a transação aberta o menor tempo possível.


GOSTEI 0
POSTAR