Newsgroup: it.comp.appl.access
Titolo: Transazioni e sottomaschere, quasi una soluzione.

Dato che mi era stato chiesto, ecco una soluzione per annullare
completamente le modifiche in una maschera contenente delle sottomaschere.
Il database di prova prevedeva due tabelle tblTest e tblDettagliTest legate
con integrita' referenziale da una relazione uno a molti.
L'inserimento/modifica dei dati avviene con una maschera con sottomaschera,
questo e' il codice della maschera principale. Nella maschera principale ci
sono due pulsanti, Ok e Annulla che dovrebbero comportarsi come ci si
aspetta : uno conferma tutte le modifiche fatte alla base di dati, l'altro
le rigetta tutte. Entrambe le maschere hanno i pulsanti di spostamento
attivati.
La soluzione completa non sono ancora riuscito a realizzarla per problemi a
linkchildfields/linkmasterfields. Piuttosto che niente, meglio piuttosto...
Spero che a qualcuno venga un'idea. La sottomaschera non e' quindi collegata
alla maschera principale.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Soluzione per MDB che usa DAO (ADO renderebbe la maschera read-only):
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim wrkTest As DAO.Workspace
Dim dbsCurrent As DAO.Database
Dim rstMaster As DAO.Recordset
Dim rstDetail As DAO.Recordset
Private Sub btnAnnulla_Click()
    wrkTest.Rollback
    DoCmd.Close
End Sub
Private Sub btnOk_Click()
    wrkTest.CommitTrans
    DoCmd.Close
End Sub
Private Sub Form_Close()
    Set rstMaster = Nothing
    Set rstDetail = Nothing
    Set dbsCurrent = Nothing
    Set wrkTest = Nothing
End Sub
Private Sub Form_Open(Cancel As Integer)
    ' Creo un nuovo workspace per non fare il rollback di altre maschere!
    Set wrkTest = DBEngine.CreateWorkspace("", "", "", dbUseJet)
    Set dbsCurrent = wrkTest.OpenDatabase(CurrentDb.Name, False, False,
CurrentDb.Connect)
    Set rstMaster = dbsCurrent.OpenRecordset( _
                    "SELECT * FROM tblTest", _
                    dbOpenDynaset)
    Set Me.Recordset = rstMaster
    Set rstDetail = dbsCurrent.OpenRecordset( _
                    "SELECT * FROM tblDettagliTest", _
                    dbOpenDynaset)
    Set Me.SDettagliTest.Form.Recordset = rstDetail
    ' In DAO mi viene concesso di settare queste proprieta',
    '   ma la sottomaschera viene aggiornata anche se la transazione
    '   viene messa in rollback.
    'Me.SDettagliTest.LinkMasterFields = "IdTest"
    'Me.SDettagliTest.LinkChildFields = "IdTest"
    wrkTest.BeginTrans
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Soluzione per .ADP che usa ADO
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim cnn As New ADODB.Connection
Dim rstMaster As New ADODB.Recordset
Dim rstDetail As New ADODB.Recordset
Private Sub btnAnnulla_Click()
    ' Gestisco eventuali modifiche in sospeso
    rstMaster.CancelBatch
    rstDetail.CancelBatch
    ' Annullo modifiche gia' fatte
    cnn.RollbackTrans
    DoCmd.Close
End Sub
Private Sub btnOk_Click()
    'Gestisco modifiche in sospeso.
    rstMaster.UpdateBatch
    rstDetail.UpdateBatch
    ' Confermo le modifiche gia' fatte.
    cnn.CommitTrans
    DoCmd.Close
End Sub
Private Sub Form_Close()
    rstMaster.Close
    rstDetail.Close
    cnn.Close
    Set rstMaster = Nothing
    Set rstDetail = Nothing
    Set cnn = Nothing
End Sub
Private Sub Form_Open(Cancel As Integer)
    ' Apre una connessione.
    cnn.CursorLocation = adUseClient
    cnn.Open Application.CurrentProject.Connection.ConnectionString
    ' Apre la tabella Test.
    rstMaster.Open "tblTest", _
                    cnn, _
                    adOpenStatic, _
                    adLockBatchOptimistic, _
                    adCmdTable
    Set Me.Recordset = rstMaster
    ' Apre la tabella Detail.
    rstDetail.Open "tblDettagliTest", _
                    cnn, _
                    adOpenStatic, _
                    adLockBatchOptimistic, _
                    adCmdTable
    Set Me.SDettagliTest.Form.Recordset = rstDetail
    ' Ecco il problema, qui parte un errore : "Server OLE non registrato"!
    'Me.SDettagliTest.LinkMasterFields = "IdTest"
    'Me.SDettagliTest.LinkChildFields = "IdTest"
    ' Inizia la transazione
    cnn.BeginTrans
End Sub

 ha scritto nel messaggio
news:P8uI6.7074$UW4.6...@news.infostrada.it...

Luca,
quando mi sono "intrufolato" nella tua richiesta ho avuto l'impressione di
averti un po' scocciato: invece mi hai preparato un piccolo capolavoro!
Grazie infinite!
Ciao,
Alberto

 Alberto
Anzi! Dopo che ho visto che c'era un altro interessato ho fatto una piccola
ricerca in dejanews e ho scoperto che altri si erano posti lo stesso
problema, cosi' ci ho lavorato un po' su...
Peccato solo per i linkchildfields, gestire quelli a mano e' un po' scomodo
:-(
Ciao, Luca