Januar 19, 2021, 06:11:47

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


Access-Objekt per VBA importieren

Begonnen von mad, Januar 09, 2021, 07:42:53

⏪ vorheriges - nächstes ⏩

mad

Hallo Zusammen,

habe immer wieder das Thema das ich optimierte/geänderte/neue Objekte aus meiner Test-DB in meine aktuelle DB übernehme.
Bisher mache ich das immer mit der Standard-Funktion "externe Daten" importieren. Quasi per Hand. In Zukunft würde ich das gerne durch einen Botton in meiner "aktuellen DB" per VBA-Code erledigen wollen.

Mein Ansatz wäre das die zu importierenden Objekte (Abfrage, Formulare, Berichte, Makros und Module, KEINE Tabellen) immer in einer DB mit dem selben Namen (z.B. "importDB") diese liegt immer im gleichen Verzeichnis, aber nicht im selben wie die "aktuelle DB". Die "importDB" würde ich wie bisher per Hand mit den zu importierenden Objekten befüllen. Wenn beim import der Objekt-Name in der "aktuellen DB" bereits vorhanden ist soll dieses Objekt überschrieben bzw. zuerst gelöscht und dann importiert werden. Neue Objekte sollen nur importiert werden.

So könnte das lästige löschen der alten Objekte und das umbenennen (...1) der neuen Objekte entfallen.

Ist das möglich, gäbe es dazu ein Beispiel?


Gruss
mad

ebs17

Für Objektimporte kannst Du Dir die Methoden TransferDatabase und LoadFromText ansehen. Die erstgenannte ist die Codeensprechung der händischen Methode, also mit nötiger vorangehender Prüfung.

Der eigentlich sinnvolle Weg ist aber, gleich das ganze Frontend durch das weiterentwickelte geprüfte Frontend zu ersetzen. Man bräuchte dann nur im Frontend einen eigenen kleinen Mechanismus, um an der neuen Wirkungsstätte die Tabellen des Backends neu zu verknüpfen, bestmöglich automatisiert.

In manchen Verwendungen wird von Haus aus bei jedem Programmstart eine Kopie vom zentral abgelegten Master gezogen und verwendet, Stichwort FrontendUpdater.
Mit freundlichem Glück Auf!

Eberhard

mad

Januar 09, 2021, 11:23:10 #2 Letzte Bearbeitung: Januar 09, 2021, 11:29:12 von mad Grund: Anhang vergessen
Hallo,

für das verknüpfen der Tabellen (backend) zu den Anwendungen im Frontend habe ich bereits einen Code.
Allerdings habe ich den nicht selbst erstellt, drum fehlt mir da etwas der Durchblick.

Function init()
Dim pfad As String
Dim dbx As DAO.Database
Dim rs As DAO.Recordset
Dim t As DAO.TableDef
Dim sBEPath As String
On Error GoTo init_err

    Set rs = CurrentDb.OpenRecordset("sys")
   
    If rs.EOF Then
        MsgBox "Kein Datensatz in der Tabelle 'sys'", vbCritical, "Hoppla"
        rs.AddNew
        rs!dbnam = "dummy"
        rs.Update
    End If
   
    Do While Not rs.EOF
   
        sBEPath = rs!dbnam
        If InStr(1, sBEPath, "\") = 0 Then
            pfad = Application.CurrentProject.Path & "\" & sBEPath
        Else
            pfad = sBEPath
        End If
       
        Set dbx = DBEngine.Workspaces(0).OpenDatabase(pfad)
   
        For Each t In dbx.TableDefs()
            If InStr(1, t.Name, "MSys") = 0 Then tabcheck t.Name, pfad
        Next

        rs.MoveNext
   
    Loop
    rs.Close

init_exit:
    Set dbx = Nothing
    On Error GoTo 0
    Exit Function
   
init_err:
    If Err.Number = 3024 Or Err.Number = 3044 Or Err.Number = 3043 Then
        pfad = dateioeffnen(Application.CurrentProject.Path, "BackEnd Datenbank öffnen")
        If pfad <> "" Then
            db_aendern (pfad)
        Else
            Application.Quit
        End If
    ElseIf Err.Number = 3059 Then
        Application.Quit
    ElseIf Err.Number = 94 Then
        MsgBox "Kein Dateiname im Feld 'sys.dbname'", vbCritical, "Hoppla"
        rs.Edit
        rs!dbnam = "dummy"
        rs.Update
    ElseIf Err.Number = 3078 Then
        MsgBox "Keine Tabelle 'sys' vorhanden", vbCritical, "Hoppla"
        CurrentDb.Execute "SELECT 'dummy' AS dbnam INTO sys;"
    Else
        MsgBox "Fehler: " & Err.Number & " - " & Err.Description
        Stop
    End If
    Resume
   
End Function

Sub tabcheck(tabnam As String, quelle As String)
Dim rs As DAO.Recordset
On Error GoTo tabcheck_err
   
    Set rs = CurrentDb.OpenRecordset(tabnam)
    rs.Close
   
tabcheck_exit:
    On Error GoTo 0
    Exit Sub
   
tabcheck_err:
    If Err.Number = 3078 Then
        DoCmd.TransferDatabase acLink, "Microsoft Access", _
         quelle, acTable, tabnam, tabnam
    ElseIf Err.Number = 3024 Or Err.Number = 3044 Or Err.Number = 3043 Then
        CurrentDb.Execute "DROP TABLE [" & tabnam & "];"
    Else
        MsgBox "Fehler: " & Err.Number & " - " & Err.Description
        Stop
    End If
    Resume
End Sub

Sub db_aendern(p As String)
Dim t As DAO.TableDef
Dim rs As DAO.Recordset

    For Each t In CurrentDb.TableDefs()
        If t.Connect <> "" Then
            CurrentDb.Execute "DROP TABLE [" & t.Name & "];"
        End If
    Next
    Set rs = CurrentDb.OpenRecordset("sys")
    rs.MoveFirst
    rs.Edit
    rs!dbnam = p
    rs.Update
    rs.Close
End Sub

Function dateioeffnen(datnam As String, titel As String) As String

    With Application.filedialog(1)
        .AllowMultiSelect = False
        .Title = titel
        .InitialFileName = datnam
       
        If .Show = -1 Then
            dateioeffnen = .SelectedItems(1)
        Else
            dateioeffnen = ""
        End If
    End With

End Function

Aber vielleicht könnte man diesen entsprechend abändern?
Vielleicht wäre das auf dem Anhang hilfreich?
Nur weis ich nicht wo und wie!

Gruss
mad

mad

Hallo,

habe mal den Hinweis,
ZitatFür Objektimporte kannst Du Dir die Methoden TransferDatabase....
aufgegriffen.
https://docs.microsoft.com/de-de/office/vba/api/access.docmd.transferdatabase

Dazu habe ich mal einen ersten Test-Code erstellt, beschränkt erstmal auf "acReport" u. "acForm":
Private Sub btnImport_Click()
DoCmd.TransferDatabase acImport, "Microsoft Access", _
    "C:\Users\Sieglinde_Manfred\Desktop\exportDB.accdb", acReport, "Alle Ausgeschiedenen", _
    "Alle Ausgeschiedenen"
DoCmd.TransferDatabase acImport, "Microsoft Access", _
    "C:\Users\Sieglinde_Manfred\Desktop\exportDB.accdb", acForm, "Buchungskonten", _
    "Buchungskonten"
End Sub
Jetzt importiert er die beiden angegebenen Objekte "Alle Ausgeschiedenen" und "Buchungskonten" aus der "exportDB.accdb" mit dem selben Namen in die "importDB.accdb".

Jetzt wär meine erste Frage: ist es möglich für z.B. das Objekt "Alle Ausgeschiedenen" eine Wildcard zu setzen, so daß alle Berichte (acReport) die in "exportDB.accdb" vorhanden sind kopiert werden. Allerdings müsste dann für die Ziel-DB "importDB.accdb" auch sowas wie ein Wildcard verwendet werden, denn ein vorgegebener Name funktioniert dann ja nicht.

Zum Thema "LoadFromText" habe ich noch nichts gefunden.

Hätte zu dem Thema "Wildcard" jemand einen Tipp für mich?


Gruss
mad

PS.: Vorerst mache es mit den Vorschlag:
ZitatDer eigentlich sinnvolle Weg ist aber, gleich das ganze Frontend durch das weiterentwickelte geprüfte Frontend zu ersetzen. Man bräuchte dann nur im Frontend einen eigenen kleinen Mechanismus, um an der neuen Wirkungsstätte die Tabellen des Backends neu zu verknüpfen, bestmöglich automatisiert.


PhilS

Zitat von: ebs17 am Januar 09, 2021, 10:06:48Der eigentlich sinnvolle Weg ist aber, gleich das ganze Frontend durch das weiterentwickelte geprüfte Frontend zu ersetzen.
Das ist definitiv der sinnvollere Weg!
Wenn du nur die geänderten Objekte importierst, wirst du früher oder später kleine Änderungen an Nebenschauplätzen vergessen und dann verlieren.
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!

ebs17

ZitatHätte zu dem Thema "Wildcard" jemand einen Tipp für mich?
Solche wären zu verwenden mit Mustersuchen in Abfragen oder auf Texte. Für die Anwendung auf Auflistungen, in denen Deine Formulare und Berichte vorkommen, unbrauchbar.
Aber offensichtlich möchtest Du viele Frösche selber küssen, ehe Du Deinen Prinzen findest ...
Mit freundlichem Glück Auf!

Eberhard

mad