Fórum Transações Delphi X firebird #373803

19/08/2009

0

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

Responder

Post mais votado

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



Emerson Nascimento

Emerson Nascimento
Responder

Gostei + 1

Mais Posts

19/08/2009

Dicasecodigosdelphi

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



Responder

Gostei + 0

20/08/2009

Keron

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.


Responder

Gostei + 0

20/08/2009

Keron

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar