Fórum Transações Delphi X firebird #373803
19/08/2009
0
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
Curtir tópico
+ 0Post mais votado
20/08/2009
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
Gostei + 1
Mais Posts
19/08/2009
Dicasecodigosdelphi
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
20/08/2009
Keron
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
20/08/2009
Keron
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
Clique aqui para fazer login e interagir na Comunidade :)