Newsgroup: it.comp.appl.access
Titolo: Transazioni (BeginTrans)

Buongiorno a tutti,
sto provando ad utilizzare le transazioni per la prima volta, cercando un
po' di aiuti sul web e sulla guida di VBA.
All'apertura dell'applicativo riallego le tabelle collegate, elencate nella
tabella "TabCollegate" presente sul FE, dove memorizzo il nome ed il
percorso delle tabelle sui vari BE (ho seguito un ottimo consiglio di
Alessandro Baraldi), eseguendo il codice tramite la macro "Autoexec".
Poichè i BE sono posizionati su altri PC, questa procedura mi crea un
inconveniente se per qualche motivo la rete non funziona, cioè mi cancella
il collegamento della prima tabella ma poi non riesce a ricrearlo, quindi ho
pensato di blindare il tutto usando una transazione.
Dopo aver aggiunto il controllo BeginTrans però la funzione mi restituisce
il seguente errore 3624: "Impossibile leggere il record. Attualmente
bloccato da un altro utente."
Quando poi chiudo l'applicativo mi compare un altro messaggio: "Database già
aperto in modo esclusivo dall'utente 'Admin' sulla macchina 'NomePC'.
Rintentare l'operazione quando il database è disponibile."
Tutto ciò non si è mai verificato prima di inserire il codice che avvia la
transazione.
Di seguito allego il codice usato, evidenziando le parti aggiunte.
Function TabelleCollegate2()
On Error GoTo Err_TabelleCollegate2
    Dim WKP1 As DAO.Workspace ' istruzione aggiunta
    Dim DBS1 As DAO.Database
    Dim RST1 As DAO.Recordset
    Dim FLD1 As DAO.Field
    Dim FLD2 As DAO.Field
    Dim N As Integer
    Set WKP1 = DBEngine.Workspaces(0) ' istruzione aggiunta
    Set DBS1 = CurrentDb
    Set RST1 = DBS1.OpenRecordset("TabCollegate")
    Set FLD1 = RST1.Fields("ColNome")
    Set FLD2 = RST1.Fields("ColPercorso")
    RST1.MoveFirst
    WKP1.BeginTrans ' istruzione aggiunta
    Do While Not RST1.EOF
        DBS1.TableDefs.Delete FLD1.Value
        DoCmd.TransferDatabase acLink, "Microsoft Access", FLD2.Value, acTable,
FLD1.Value, FLD1.Value
        RST1.MoveNext
    Loop
    WKP1.CommitTrans ' istruzione aggiunta
Exit_TabelleCollegate2:
    Set FLD2 = Nothing
    Set FLD1 = Nothing
    Set RST1 = Nothing
    Set DBS1 = Nothing
    Set WKP1 = Nothing ' istruzione aggiunta
    Exit Function
Err_TabelleCollegate2:
    MiaMsgBox "Si è verificato il seguente errore:@N° " & Err.Number & " - " &
Err.Description & "@"
    Resume Exit_TabelleCollegate2
End Function
In tutti gli esempi che ho trovato non c'è mai un riferimento ad accessi
esclusivi o cose simili, ed ora non so come continuare senza dover
rinunciare.
Ringrazio quanti proveranno a darmi una mano.
Saluti
Franco
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 pensato di blindare il tutto usando una transazione.
Io faccio cancellare prima tutte le tabelle collegate poi eseguo il codice
per i nuovi collegamenti.
Se la rete non è attiva ho errore nella seconda parte (eventualmente
recuperabile) poi però quando ripeto il collegamento (a rete funzionante)
tutto procede regolarmente. Non uso TransferDatabase.
Ti invio un esempio del mio codice se vuoi darci un'occhiata.
=============================================
Private Sub TableLink_Click()
Dim LocalDB As Database, RemoteDB As Database, WSP As Workspace
Dim TableListTable As String, ExternalDatabasePassword As String
Dim NewLinkedTable As TableDef, i As TableDef
Dim RemoteDatabaseFileName As String, RS As DAO.Recordset
RemoteDatabaseFileName = "\\p102\C\Paragon\Paragon_T.AI8"
TableListTable = "t_DefaultLinks"
ExternalDatabasePassword = ""
Set WSP = DBEngine.Workspaces(0)
Set LocalDB = CurrentDb
Set RemoteDB = OpenDatabase(RemoteDatabaseFileName, False, False, _
               ";PWD=" & ExternalDatabasePassword)
Set RS = LocalDB.OpenRecordset(TableListTable, dbOpenDynaset)
' Elimina tutte le tabelle correntemente collegate
For Each i In LocalDB.TableDefs
    If i.Connect <> "" Then
        DoCmd.DeleteObject acTable, i.Name
    End If
Next
' Collega tutte le tablelle elencate nel campo [TableName]
' della tabella t_DefaultLinks
WSP.BeginTrans
Do Until RS.EOF
    Set NewLinkedTable = LocalDB.CreateTableDef(RS![TableName])
    NewLinkedTable.Connect = ";DATABASE=" & RemoteDatabaseFileName
    NewLinkedTable.SourceTableName = RS![TableName]
    LocalDB.TableDefs.Append NewLinkedTable
    RS.MoveNext
Loop
WSP.CommitTrans
End Sub
====================================================
Bruno 


Grazie Bruno, ho adattato il tuo esempio al mio programma e funziona
regolarmente.
