gesplitste database. VBA module

Status
Niet open voor verdere reacties.

allard1977

Gebruiker
Lid geworden
7 feb 2011
Berichten
215
Hoi,

Ik heb een gesplitste database met een module in de front-end die reconnect met de back-end elke keer als je database opstart nu wil ik eigenlijk de backend met wachtwoord versleutelen. hoe kan ik mijn module gewoon laten werken?

Groetjes
 
Wat is je probleem precies? Ik heb net een testje gedaan met een versleutelde backend, en hij werkt perfect. En de Frontend is echt van voor tot achter helemaal dichtgescript :).
 
Bij het opstarten wordt de volgende module in werking gesteld.
Code:
Option Compare Database
Option Explicit


Function fRefreshLinks() As Boolean
Dim strMsg As String, collTbls As Collection
Dim i As Integer, strDBPath As String, strTbl As String
Dim dbCurr As Database, dbLink As Database
Dim tdfLocal As TableDef
Dim varRet As Variant
Dim strNewPath As String

Const cERR_USERCANCEL = vbObjectError + 1000
Const cERR_NOREMOTETABLE = vbObjectError + 2000

    On Local Error GoTo fRefreshLinks_Err

    If MsgBox("Are you sure you want to reconnect all Access tables?", _
            vbQuestion + vbYesNo, "Please confirm...") = vbNo Then Err.Raise cERR_USERCANCEL

    'First get all linked tables in a collection
    Set collTbls = fGetLinkedTables

    'now link all of them
    Set dbCurr = CurrentDb

    'strMsg = "Do you wish to specify a different path for the Access Tables?"
    
    'If MsgBox(strMsg, vbQuestion + vbYesNo, "Alternate data source...") = vbYes Then
        'strNewPath = fGetMDBName("Please select a new datasource")
    'Else
        'strNewPath = vbNullString
    'End If

    For i = collTbls.Count To 1 Step -1
        strDBPath = fParsePath(collTbls(i))
        strTbl = fParseTable(collTbls(i))
        varRet = SysCmd(acSysCmdSetStatus, "Now linking '" & strTbl & "'....")
        If Left$(strDBPath, 4) = "ODBC" Then
            'ODBC Tables
            'ODBC Tables handled separately
           ' Set tdfLocal = dbCurr.TableDefs(strTbl)
           ' With tdfLocal
           '     .Connect = pcCONNECT
           '     .RefreshLink
           '     collTbls.Remove (strTbl)
           ' End With
        Else
            If strNewPath <> vbNullString Then
                'Try this first
                strDBPath = strNewPath
            Else
                If Len(Dir(strDBPath)) = 0 Then
                    'File Doesn't Exist, call GetOpenFileName
                    strDBPath = fGetMDBName("'" & strDBPath & "' not found.")
                    If strDBPath = vbNullString Then
                        'user pressed cancel
                        Err.Raise cERR_USERCANCEL
                    End If
                End If
            End If

            'backend database exists
            'putting it here since we could have
            'tables from multiple sources
            Set dbLink = DBEngine(0).OpenDatabase(strDBPath)

            'check to see if the table is present in dbLink
            strTbl = fParseTable(collTbls(i))
            If fIsRemoteTable(dbLink, strTbl) Then
                'everything's ok, reconnect
                Set tdfLocal = dbCurr.TableDefs(strTbl)
                With tdfLocal
                    .Connect = ";Database=" & strDBPath
                    .RefreshLink
                    collTbls.Remove (.Name)
                End With
            Else
                Err.Raise cERR_NOREMOTETABLE
            End If
        End If
    Next
    fRefreshLinks = True
    varRet = SysCmd(acSysCmdClearStatus)
    MsgBox "All Access tables were successfully reconnected.", _
            vbInformation + vbOKOnly, _
            "Success"

fRefreshLinks_End:
    Set collTbls = Nothing
    Set tdfLocal = Nothing
    Set dbLink = Nothing
    Set dbCurr = Nothing
    Exit Function
fRefreshLinks_Err:
    fRefreshLinks = False
    Select Case Err
        Case 3059:

        Case cERR_USERCANCEL:
            MsgBox "No Database was specified, couldn't link tables.", _
                    vbCritical + vbOKOnly, _
                    "Error in refreshing links."
            Resume fRefreshLinks_End
        Case cERR_NOREMOTETABLE:
            MsgBox "Table '" & strTbl & "' was not found in the database" & _
                    vbCrLf & dbLink.Name & ". Couldn't refresh links", _
                    vbCritical + vbOKOnly, _
                    "Error in refreshing links."
            Resume fRefreshLinks_End
        Case Else:
            strMsg = "Error Information..." & vbCrLf & vbCrLf
            strMsg = strMsg & "Function: fRefreshLinks" & vbCrLf
            strMsg = strMsg & "Description: " & Err.Description & vbCrLf
            strMsg = strMsg & "Error #: " & Format$(Err.Number) & vbCrLf
            MsgBox strMsg, vbOKOnly + vbCritical, "Error"
            Resume fRefreshLinks_End
    End Select
End Function

Function fIsRemoteTable(dbRemote As Database, strTbl As String) As Boolean
Dim tdf As TableDef
    On Error Resume Next
    Set tdf = dbRemote.TableDefs(strTbl)
    fIsRemoteTable = (Err = 0)
    Set tdf = Nothing
End Function

Function fGetMDBName(strIn As String) As String
'Calls GetOpenFileName dialog
Dim strFilter As String

    strFilter = ahtAddFilterItem(strFilter, _
                    "Access Database(*.accdb;*.accde;*.accdr) ", _
                    "*.accdb; *.accde; *.accdr")
    strFilter = ahtAddFilterItem(strFilter, _
                    "All Files (*.*)", _
                    "*.*")

    fGetMDBName = ahtCommonFileOpenSave(Filter:=strFilter, _
                                OpenFile:=True, _
                                DialogTitle:=strIn, _
                                Flags:=ahtOFN_HIDEREADONLY)
End Function

Function fGetLinkedTables() As Collection
'Returns all linked tables
    Dim collTables As New Collection
    Dim tdf As TableDef, db As Database
    
    
    Set db = CurrentDb
        db.TableDefs.Refresh
    For Each tdf In db.TableDefs
        With tdf
            If Len(.Connect) > 0 Then
                If Left$(.Connect, 4) = "ODBC" Then
                '    collTables.Add Item:=.Name & ";" & .Connect, KEY:=.Name
                'ODBC Reconnect handled separately
                Else
                    collTables.Add Item:=.Name & .Connect, Key:=.Name
                End If
            End If
        End With
    Next
    Set fGetLinkedTables = collTables
    Set collTables = Nothing
    Set tdf = Nothing
    Set db = Nothing
End Function

Function fParsePath(strIn As String) As String
    If Left$(strIn, 4) <> "ODBC" Then
        fParsePath = Right(strIn, Len(strIn) _
                        - (InStr(1, strIn, "DATABASE=") + 8))
    Else
        fParsePath = strIn
    End If
End Function

Function fParseTable(strIn As String) As String
    fParseTable = Left$(strIn, InStr(1, strIn, ";") - 1)
End Function

Maar mijn backend is versleuteld met een paswoord. met deze code kan ik dus niet naar referenties zoeken van de tabelen. waar en welke code moet ik er inzetten om toch een link te maken met de backend via frontend.

De code is niet van me zelf.


dankje alvast.
 
Laatst bewerkt:
Zoals ik al zei: mijn test be is (nu) ook versleuteld met een wachtwoord, en geen centje pijn. Wel gebruik ik een andere techniek:
Code:
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, strFields As String
Dim intErrorCount As Integer
Dim tmp As Variant
Set db = CurrentDb
Dim fld As DAO.Field

    '-----------------------------------------------------------------------------------------------------
    'Door alle tabellen in de TableDefs Collectie lussen.
    '-----------------------------------------------------------------------------------------------------
    strBackEnd = CurrentProject.Path & "\Backend\"
    For Each tdf In db.TableDefs
        If Left$(tdf.Connect, 10) = ";DATABASE=" Then       'Tabel is een gelinkte tabel.
            If Left(tdf.Name, 1) = "~" Then
                strFields = ""
            Else
                strCon = Nz(tdf.Connect, "")                    'Lees de Connection String uit.
                '-----------------------------------------------------------------------------------------
                'Gebruik de SPLIT opdracht om de back-end database naam te splitsen.
                '-----------------------------------------------------------------------------------------
                tmp = Split(strCon, "\")
                '-----------------------------------------------------------------------------------------
                'Checken of we een Access database te pakken hebben
                '-----------------------------------------------------------------------------------------
                If InStr(1, tmp(UBound(tmp)), "mdb") > 0 Or InStr(1, tmp(UBound(tmp)), "accdb") > 0 Then
                    '-------------------------------------------------------------------------------------
                    'De nieuwe Connection String opbouwen en verversen.
                    '-------------------------------------------------------------------------------------
                    Set tdf = db.TableDefs(tdf.Name)
                    '-------------------------------------------------------------------------------------
                    ''tdf.Connect = ";DATABASE=" & BackendPad & tmp(UBound(tmp))
                    tdf.Connect = ";DATABASE=" & strBackEnd & tmp(UBound(tmp))
                    tdf.RefreshLink
                Else
                    '-------------------------------------------------------------------------------------
                    'Als er een foutje is: de foutmelding toevoegen aan de foutmeldingsboodschap.
                    '-------------------------------------------------------------------------------------
                    intErrorCount = intErrorCount + 1
                    strMsg = strMsg & "Niet gelukt om de back-end database naam uit te lezen." & vbNewLine
                    strMsg = strMsg & "Tabel Naam: " & tdf.Name & vbNewLine
                    strMsg = strMsg & "Connect = " & strCon & vbNewLine
                End If
            End If
        End If
    Next tdf

'---------------------------------------------------------------------------------------------------------
'En alles netjes opruimen
'---------------------------------------------------------------------------------------------------------
ExitHere:
    On Error Resume Next
    If intErrorCount > 0 Then
        strMsg = "Er waren " & intErrorCount & " problemen met het verversen van de tabel links: """ _
        & vbNewLine & strMsg & "In Procedure RefreshTableLinks"""
        RefreshTableLinks = strMsg
        Debug.Print strMsg
    End If
    Set tdf = Nothing
    Set db = Nothing
    Exit Function
    
ErrHandle:
    On Error Resume Next
    intErrorCount = intErrorCount + 1
    strMsg = strMsg & "Error " & Err.Number & " " & Err.Description
    strMsg = strMsg & vbNewLine & "Tabel Naam: " & tdf.Name & vbNewLine
    strMsg = strMsg & "Connect = " & strCon & vbNewLine
    Resume ExitHere

End Function
 
Dat is een makkelijker code. hoef je geen vragen meer beantwoorden maar als je backend verplaatst of veranderd van naam gaat hij niet mee.!

En toch geeft hij bij mij aan invalid password. maar kan helemaal niks meer met mijn fornt-end. als ik een ander formulier wil maken zegt hij het ook?
 
Laatst bewerkt:
Ik heb de BE in een vaste map t.o.v. de FE staan, en bij mij werkt het prima. De routine wordt aangeroepen vanuit de AutoExec macro, dus draait automatisch bij het starten van de db. Al heb ik de hele handel (om begrijpelijke redenen) de laatste tijd niet meer verplaatst. Hij vraagt bij mij ook niet om een wachtwoord, dat krijg ik alleen als ik de BE wil openen. Wél heb ik, om e.e.a. te testen, opnieuw moeten importeren. Dus ik heb eerst alle koppelingen weggegooid, en daarna opnieuw gekoppeld.
 
Ah ja nu zie ik het ook. Gaat goed maar nu even kijken als het voor mij werkt verder. Mijn database wordt wel verplaatst. Naar klanten toe.
 
Zo alles is opgelost. Bij de eerste keer opstarten wordt er gevraagd om de backend locatie op te geven. Klein stukje van de code die ik door gestuurd heb. Daarna krijg je het formulier niet meer en komt er een ander opstart form waar uw code achter zit werkt uitstekend
Dank u wel.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan