Questo sito utilizza cookie, anche di terze parti, per migliorare la tua esperienza e offrire servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina o cliccando qualunque suo elemento acconsenti all’uso dei cookie

Nel post di oggi voglio occuparmi di Access e affrontare un problema piuttosto noioso che si verifica quando si sceglie di dividere un database in modo da avere, in due file distinti, il front end e il back end con le tabelle.

Purtroppo Access, nel front end memorizza il percorso assoluto del database back end che contiene le tabelle coi dati, il che implica che, se si spostano i due database in un nuovo computer o in una diversa posizione dello stesso computer, il front end non è più in grado di trovare le tabelle coi dati, a meno di non intervenire manualmente.

Ma, se dovete inviare il database ad un altro utente che non è in grado di fare questa modifica…. O a diversi utenti, la via dell’aggiornamento manuale non è percorribile.

Non esiste una versa e propria soluzione al problema, ma possibili workaround. Uno di questi è stato proposto da Courtney Owen alla pagina https://blogs.office.com/2012/08/03/automatically-relink-microsoft-access-tables/

Ripropongo qui il suo metodo e il suo codice con una minima variante (indispensabile per il corretto funzionamento).

Premetto che questo metodo presuppone che front end e back end si trovino nella stessa cartella: in questo modo, via codice, si può leggere il precorso del file front end e sostituirlo a quello originale presente nella striga di connessione che permette di collegare le tabelle del back end.

Vediamo come fare.

Per cominciare, è necessario creare un modulo di codice e inserire al suo interno la seguente funzione pubblica (ma mia mini-modifica è evidenziata in grassetto):

Public Function RefreshTableLinks() As String
    On Error GoTo ErrHandle

    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim strCon As String
    Dim strBackEnd As String
    Dim strMsg As String
    Dim intErrorCount As Integer

    Set db = CurrentDb

    'Loop through the TableDefs Collection.
    For Each tdf In db.TableDefs
        'MsgBox tdf.Connect
        'Verify the table is a linked table.
        If Left$(tdf.Connect, 10) = ";DATABASE=" Then
            'Get the existing Connection String.
            strCon = Nz(tdf.Connect, "")
            'Get the name of the back-end database using String Functions.

            strBackEnd = Right$(strCon, (Len(strCon) - (InStrRev(strCon, "\") - 1)))
          
            'Verify we have a value for the back-end
            If Len(strBackEnd & "\") > 0 Then
                'Set a reference to the TableDef Object.
                Set tdf = db.TableDefs(tdf.Name)
                'Build the new Connection Property Value.
                tdf.Connect = ";DATABASE=" & CurrentProject.Path & strBackEnd
                'Refresh the table link.
                tdf.RefreshLink
            Else
                'There was a problem getting the name of the back-end.
                'Add the information to the message to notify the user.
                intErrorCount = intErrorCount + 1
                strMsg = strMsg & "Error getting back-end database name." & vbNewLine
                strMsg = strMsg & "Table Name: " & tdf.Name & vbNewLine
                strMsg = strMsg & "Connect = " & strCon & vbNewLine
            End If
        End If
    Next tdf

ExitHere:
    On Error Resume Next
    If intErrorCount > 0 Then
        strMsg = "There were errors refreshing the table links: """ _
               & vbNewLine & strMsg & "In Procedure RefreshTableLinks"""
        RefreshTableLinks = strMsg
    End If
    Set tdf = Nothing
    Set db = Nothing
    Exit Function

ErrHandle:
    intErrorCount = intErrorCount + 1
    strMsg = strMsg & "Error " & Err.Number & " " & Err.Description
    strMsg = strMsg & vbNewLine & "Table Name: " & tdf.Name & vbNewLine
    strMsg = strMsg & "Connect = " & strCon & vbNewLine
    Resume ExitHere

End Function

Dovete richiamare questa funzione sul caricamento della maschera principale del database o, perché sia eseguita come primo elemento all’apertura del file, nella macro AutoExec, ossia una macro esterna a cui viene assegnato proprio il nome AutoExec.

La macro deve contenere la azione EseguiCodice che richiama, appunto, la funzione appena creata.

 

Joomla templates by a4joomla