vbacode uit een andere database gebruiken

Status
Niet open voor verdere reacties.

JelleKoen

Gebruiker
Lid geworden
30 okt 2012
Berichten
58
Dag Access-gebruikers,
Voor een bedrijf onderhoud ik een 15tal databases die op verschillende manieren gekoppeld zijn.
Onlangs heb ik autorisatiecode geschreven en die vervolgens tegen mijn zin in alle 15 frontends gekopieerd heb. Nu ik een kleine wijziging wil aanbrengen, moet ik alle frontends weer bij langs. Bah, dus.
Is er een mogelijkheid om de code te plaatsen in een 'centrale codedatabase' die dan op een eenvoudige manier op te halen is.
Is een klassemodule dan de oplossing of is er een simpeler manier?
Graag jullie suggesties op oplossingen.
GrJ
 
Hoe simpel. Tja, waarom stel ik zo'n vraag dan ook niet eerder op dit geweldige forum.
Dank je wel!
Nu nog even de late binding code maken, of heb je die ook paraat?
 
Ik gebruik Access niet dus heb helemaal niets aan de praat ;)
 
Gaat je vast lukken :)
 
@Octafish: waarom altijd die hatelijke commentaar?
 
Ook dit was niet ingewikkeld. In plaats van tabellen uit de BackEnd te koppelen met acLink en acTable, wordt het acLink met acModule.
Code:
DoCmd.TransferDatabase acLink, "Microsoft Access", strBE, acModule, strCodeNaam, strCodeNaam, , True
Omdat in die 15 databases soms naar vier verschillende BackEnds wordt gekoppeld, heb ik de tabellen met hun verwijzingen per database in een eigen tabel '_mijnTabellen' opgenomen en die laat is met een do until.eof doorlopen om de koppeling met bovenstaande code te maken. Nu dus ook simpelweg de moduleverwijzingen in de tabel '_mijnTabellen' opnemen. Ik heb de code hierna vermeld. Suggesties welkom.
Zo tevreden :thumb:
Code:
Sub prcBackEndKoppel()
    'Saint-Privat-de-Champclos, 26 april 2016
    'routine om de BackEnd-tabellen te koppelen
    Dim tdf             As TableDef
    Dim rst             As DAO.Recordset
    Dim strTabelNaam    As String
    Dim strBE           As String
    
    On Error GoTo prc_err
    autoexec
    strSQL = "SELECT * FROM _tblMijnTabellen"
    Set rst = CurrentDb().OpenRecordset(strSQL)
    With rst
        Do Until .EOF
            strBE = ""
            strBE = rst!tbl_strBE
            
            If InStr(glbProjectNaam, "TEST") Then
                strBE = fncSlash(glbMapBE) & "TEST\" & strBE
            Else
                strBE = fncSlash(glbMapBE) & strBE
            End If
            'Debug.Print strBE
            strTabelNaam = rst!tbl_strTabel
            Select Case strTabelNaam
                Case Left(strTabelNaam, 5) = "mySys"
                    GoTo volgende
                Case "Switchboard Items", "_MijnTabellen"
                    GoTo volgende
                Case Else
                    CurrentDb().TableDefs.Delete strTabelNaam
                    DoCmd.TransferDatabase acLink, "Microsoft Access", strBE, acTable, strTabelNaam, strTabelNaam, , True
                End Select
                'Nu aanvullen met ophalen van de code uit de backend
volgende:
            .MoveNext
        Loop
    End With
    
prc_exit:
    Exit Sub
    
prc_err:
    If Err.Number = 3011 Then 'De tabel staat niet in de BackEnd
        Resume Next
    Else
        msgFout
        Resume prc_exit
        Resume
    End If
End Sub
 
Noella komt uit België, dus dan zijn de teentjes wellicht wat langer. Sterker nog: ze voelt het al als ik (blijkbaar) op de tenen van iemand anders ga staan :d.
 
Heb mijn eigen firma, dus zie elke ochtend de chef in de spiegel, al kan die ook wel eens moeilijk doen.

Trouwens, vroeger kon je van een access bestand een .mda add-in maken om in je andere applicaties te gebruiken. Ik weet niet of je dat met de huidige versie ook nog steeds kan, maar lijkt me gemakkelijker dan de modules te linken.
 
Die optie staat niet meer in het menu, dus ik vermoed dat dat niet meer kan. Maar wellicht ergens verborgen :).
 
Suggesties welkom.
Je code kan wat korter denk ik:
Code:
            Select Case strTabelNaam
                Case Left(strTabelNaam, 5) = "mySys"
                Case "Switchboard Items", "_MijnTabellen"
                Case Else
                    CurrentDb().TableDefs.Delete strTabelNaam
                    DoCmd.TransferDatabase acLink, "Microsoft Access", strBE, acTable, strTabelNaam, strTabelNaam, , True
            End Select
            .MoveNex
Eventueel de selectie al in je query zetten, dan hoef je geen Select Case te gebruiken.
 
Dag meelezers,

Ik ben jullie nog even verschuldigd hoe ik het uiteindelijk heb opgelost.

De acLink in TransferDatabase
Code:
DoCmd.TransferDatabase acLink, "Microsoft Access", strBE, acModule, strCodeNaam, strCodeNaam, , True
werkt alleen voor tabellen en niet voor modules. Een tussenoplossing door ipv acLink te vervangen door acImport vond ik niet bevredigend omdat ik er dan te weinig controle op had. Bovendien wordt er een kopie van de module gemaakt (module1) als die module in gebruik is.

Ik heb nu een in een centrale database alle modules staan en een tabel waarin ik aangeef welke modules in welke database geupload moeten worden.
bijv tblUpdateNow met de velden 'upd_database (string)', 'upd_module (string)', 'upd_JaNee (boolean)'
Met deze tabel doorloop ik alle True-waarden in de module
Code:
Sub prcModuleEport( _
    strDatabase As String, _
    strModule As String _
    )
    Dim objObject       As Object
    
    autoexec 'stelt o.m. de globale variabelen in
    
    If InStr(glbProjectNaam, "TEST") Then
        strDatabase = fncSlash(glbMapBE) & "TEST\" & strDatabase
    Else
        strDatabase = fncSlash(glbMapBE) & strDatabase
    End If
'    Debug.Print strDatabase
    Set objObject = CurrentProject.AllModules(strModule)
    DoCmd.TransferDatabase acExport, "Microsoft Access", strDatabase, acModule, objObject.Name, strModule, , False
End Sub
De oude module wordt overschreven. Overigens de docmd.transferdatabase werkt niet als de module niet als object wordt meegegeven.

Hopelijk heb ik hiermee ook enkele andere meelezers kunnen helpen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan