CONTROLE DE TRANSACAO NO VB6

LECCRJ 03/12/2013 12:18:04
#431705
Prezados,
Preciso de ajuda no controle de transação no vb6 utilizando ADO.
O caso é o seguinte:
Tenho uma rotina que chama varias outras rotina e por sua vez chamam varias outros e por sua vez chamam varias outras que por sua vez fazem alguma ação no base de dados (insert, update ou deletes). Ex.:
private sub importacao()
on erro goto trataerro
...
db.begintrans

call atualizaalgumacoisa [ô]essa rotina chama varias outras, que chamam varias outras

db.committrans

exit sub
trataerro:
db.rollbacktrans
end sub

A pergunta é, como fazer que o commit não seja executado se houver algum erra dentro das rotina chamadas pela rotina [ô]atualizaalgumacoisa[ô]?

Pensei em alterar a rotina ATUALIZAALGUMACOISA para uma função booleana e só dá o commit se retornar true. O problema é que ela chama muitas outras rotina (não função) que podem dar erro. To pensando em precisar alterar o menos possivel o código pra resolver isso.

Alguma sugestão?

Desde já agradeço.
NILSONTRES 03/12/2013 12:54:43
#431707
Basicamente assim:
inicia a transação
chama uma função principal que chama todas as outras, nessas outras se der erro já da o rollback la e retorna false, essa func principal pode ser boolean
se retornar true
commit



LECCRJ 03/12/2013 13:42:56
#431710
Obrigado Nilson,

Tbm ja tinha pensado solução que você propos, o problema é que vou precisar alterar muito o código. Mas acho que vai ser esse o jeito mesmo.

Mesmo assim muito obrigado.
NILSONTRES 04/12/2013 00:04:02
#431725
Se tiver trabalho, mesmo assim vale a pena, uma sequencia de transações mal feitas pode ser fatal.
Tive sérios problemas em um sistema até descobrir que era isso.
RO.DRIGOSG 17/01/2014 17:46:40
#433241
LECCRJ,

Pelo que eu entendi, a solução é simples, basta adicionar em cada uma dessas funções que fazem algumas coisinhas um tratamento de erro e adicionar o Err.Raise, ex:

Na sua Sub principal, você coloca o rollbacktrans assim como você está fazendo e na outras sub[ô]s(Algumas Coisinha) você colocao Raise.

Private Sub sGeraBase()

Dim pobjPageSetup As tPageSetup

On Error GoTo TraTaErro

........ [ô]Processos

Exit Sub
TraTaErro:
Err.Raise Err.Number, Err, Err.Description

End Sub


O Raise simplesmente vai retornar o erro para a sub que chamou ela e assim por diante. Então se você pretende chamar 10 sub[ô]s e na 7º sub ocorreu o erro, o erro será retornado para a primeira sub em cascata. Da 7° para 6°, da 6° para 5° e assim por diante até chegar na sua sub principal, no caso a
sub importacao


Obs.: Lembrando que para isso a mesma conexão que você usa na primeira sub, tem que ser usada nas demais sub[ô]s ou function[ô]s.
FILMAN 17/01/2014 21:33:53
#433244
Uma ideia é não fazer tratativa de erro em nenhum método interno da SUB IMPORTACAO dessa maneira sempre vai retornar no tratamento de erro da sua rotina principal assim o RollBack será executado.


tente false isso!
Faça seu login para responder