Newsgroup: it.comp.appl.access
Titolo: Transazioni multiple in sub

Ciao a tutti stavo sperimentando le transazioni e chiedo se possibile
e come lanciare più transazioni all'interno della stessa Sub ed in
caso di errore sulla singola transazioni fare il rollback della
stessa. Es.
Public Sub AGGIORNA()
On Error GoTo Aggiorna_Err
With DBEngine.Workspaces(0)
.BeginTrans
CurrentDb.Execute "QryInsert1"
.CommitTrans
.BeginTrans
CurrentDb.Execute "QryInsert2"
.CommitTrans
.BeginTrans
CurrentDb.Execute "QryInsert3"
.CommitTrans
Aggiorna_Exit:
DBEngine.Rollback
Aggiorna_Err:
    MsgBox Error$
End With
End Sub
Grazie


Access non ammette transazioni
Lavora in maniera asincrona e potresti trovarti in mezzo alla seconda prima di cominciare la prima
-- 
-- 
MAssimiliano Amendola
www.accessgroup.it
Cisa - Conferenza Italiana Sviluppatori Access

Lavora in maniera asincrona e potresti trovarti in mezzo alla seconda prima di cominciare la prima
Forse volevi dire "non ammette transazioni nidificate" ?
Non č del tutto vero.
Cut & paste dall'aiuto in linea (Access 2003):
Dopo aver utilizzato il metodo CommitTrans, non č possibile annullare le modifiche apportate durante la transazione a
meno che questa non sia nidificata in un'altra transazione che č stata annullata. Se si nidificano le transazioni, č
necessario risolvere la transazione corrente prima di poter risolvere una transazione a un livello di nidificazione piů
alto.
Se si desidera disporre di transazioni contemporanee con ambiti sovrapposti e non nidificati, per contenere tali
transazioni č possibile creare altri oggetti Workspace.
(omissis)
Se si accede a origini dati ODBC mediante il modulo di gestione di database Microsoft Jet, non č possibile nidificare
transazioni.
Oppure mi sono perso qualcosa per strada ?
Vincenzo Turturro
Certificato Eucip Core Level
ITA 0000-002299 del 14/05/2007
---------------------------------------------
il sito comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------
risorse Access:
http://www.accessgroup.it
---------------------------------------------
Il sito comune di it.comp.as400
http://www.faq400.com
---------------------------------------------

End Sub
Puoi eseguire ogni singola query in transazioni separate senza bisogno di 
aprire una transazione esplicita per ognuna, basta mettere l'opzione 
dbFailOnError e in caso di errore viene eseguito automaticamente il rollback
es.
----
Public Sub AGGIORNA()
On Error GoTo Aggiorna_Err
CurrentDb.Execute "QryInsert1", dbFailOnError
CurrentDb.Execute "QryInsert2", dbFailOnError
CurrentDb.Execute "QryInsert3", dbFailOnError
Aggiorna_Exit:
Exit Sub
Aggiorna_Err:
    MsgBox Error$
    Resume Aggiorna_Exit
End Sub
----
la cosa cambia se vuoi eseguire le tre query in un'unica transazione e nel 
caso di errore di una di esse fare il rolback di tutto.
Es.
----
Public Sub AGGIORNA()
On Error GoTo Aggiorna_Err
With DBEngine.Workspaces(0)
.BeginTrans
.Databases(0).Execute "QryInsert1", dbFailOnError
.Databases(0).Execute "QryInsert2", dbFailOnError
.Databases(0).Execute "QryInsert3", dbFailOnError
.CommitTrans
End With
Aggiorna_Exit:
Exit Sub
Aggiorna_Err:
    MsgBox Err.Description
    DBEngine.Workspaces(0).Rollback
    Resume Aggiorna_Exit
End Sub
----
Ciao
--
Giorgio Rancati
[Office Access MVP] 

 - Mostra testo tra virgolette -
Grazie infinite!
Una domanda che differenza c'è tra utilizzo di RunSQL ed Execute
all'interno di una transazione? Questo perchè leggendo numerevoli post
sul ng mi si è creata una gran confusione.

sul ng mi si è creata una gran confusione.
Il metodo RunSql è un metodo di Access.
Il metodo Execute è di JET.
La differenza principale è che il metodo RunSql interagisce con l'utente, 
ovvero chiede conferma prima di modificare/variare i records e cosa fare in 
caso di errore.
I messaggi si possono disabilitare eseguendo il metodo SetWarnings
es
----
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO ......"
DoCmd.SetWarnings True
----
ma in questo caso un eventuale errore di chiave duplicata non viene 
notificato.
Questo è uno dei motivo per cui non uso mai il metodo RunSQL.
per quanto riguarda la transazione, la risposta è già nelle righe scritte 
sopra, è l'utente a decidere se fare il rollback in caso di errore, al 
contrario se viene usato il metodo DoCmd.SetWarnings False, la transazione 
viene committata automaticamente con i records che è stato possibile 
scrivere.


 ha scritto nel messaggionews:cf137046-8cda-4ae4...@b1g2000hsg.googlegroups.com...

Grazie Giorgio