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
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.
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
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.
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.
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 ...
Trotzdem Danke
mad