Benutzer mit den meisten Antworten
Zugriff auf ferne Datenbanken

Frage
-
Hallo
ich muss mehrere hundert kleine DBs vom Typ .accdb nachträglich anpassen. Dazu gehört jeweils eine kleine Tabelle erstellen, 2 neue Berichte einfügen und 1 Bericht austauschen aus einer QuelldB vom Typ .accdb. Das würde ich gern automatisiert erledigen.
Allerdings hänge ich momentan fest beim Übergeben der Berichte.
Dim lokalDB As Database, remoteDB As Database Set lokalDB = CurrentDb 'Typ ACCDB Set remoteDB = DBEngine.Workspaces(0).OpenDatabase _ ("G:\Daten\WIPMV\Workspace\ZUP\Ziehung_20173\20173-ZUP-063\Schablone_EFN_Backend.accdb") MsgBox remoteDB.Name On Error Resume Next DoCmd.SetWarnings False
'funktioniert remoteDB.Execute "drop table ListeA_transponiert" DoCmd.CopyObject remoteDB.Name, "Abfrage1", acQuery, "Abfrage1" remoteDB.Execute "Abfrage1" On Error GoTo 0 'funktioniert DoCmd.CopyObject lokalDB.Name, "UXxxxx", acReport, "U2" 'Fehler 2501: Aktion Copyobject wurde abgebrochen DoCmd.CopyObject remoteDB.Name, "UXxxxx", acReport, "U2" 'endet mit Fehler 'Fehler 2507: Format ist kein installiertes DB-Format oder unterst?tzt den gew?hlten Vorgang nicht DoCmd.TransferDatabase acExport, , lokalDB.Name, acReport, "U2", "U2Test" DoCmd.TransferDatabase acExport, , remoteDB.Name, acReport, "U2", "U2Test" DoCmd.SetWarnings True
Die Abfrage kopieren verläuft problemlos.
Die Variante für die Berichte mit DoCmd.CopyObject funktioniert, kopiere ich in die lokale DB. Jedoch nicht, wenn ich in die ferne DB kopiere.
Die Variante DoCmd.TransferDatabase funktioniert in beiden Fällen nicht, wobei ich nicht sicher bin, ob ein Export in die selbe DB auch funktionieren muss.
Danke vorab für Eure Unterstützung. Ich kann erst am Montag reinschauen und reagieren.
Tom
Antworten
-
Ich habe die Erfahrung gemacht, dass solche Fehler auftauchen können, wenn man das DoCmd.CopyObject zu schnell mehrmals hintereinander ausführt, besonders wenn die Ziel-Datenbank auf einem Netzwerklaufwerk liegt. Deshalb schalte ich nach jedem DoCmd.CopyObject eine kurze Pause ein:
Public Declare PtrSafe Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long) DoCmd.CopyObject remoteDB.Name, "Abfrage1", acQuery, "Abfrage1" Call Sleep(100) ' eine Zehntelssekunde warten DoCmd.CopyObject remoteDB.Name, "UXxxxx", acReport, "U2" Call Sleep(100) ' eine Zehntelssekunde warten
Und, für DoCmd.CopyDB ist es nicht notwendig, dass die Zieldatenbank offen ist (Set remoteDB…). Ich würde die Zieldatenbank geschlossen halten und das CopyObject durchführen und erst danach die Aktionen auf der remoteDB durchführen.
Matthias Kläy, Kläy Computing AG
- Bearbeitet mklaey Sonntag, 14. Juli 2019 09:08 Zusatz
- Als Antwort markiert Tom Krist der zweite Montag, 15. Juli 2019 09:10
-
Punkt 1, Löschen eines Berichts in der Remote-DB geht etwa so:
Dim Target As Access.Application Set Target = GetObject("D:\KccTemp\TestRemoteDelete.accdb") Target.visible = False Call Target.DoCmd.DeleteObject(acReport, "rpt_ToDelete") Target.Quit acQuitSaveAll
Analog kannst du mit Target.DoCmd.OpenReport etc. auch einen Bericht in der Remote-DB öffnen. Vielleicht kannst du mit diesem Hinweis auch Punkt 2 lösen.
Matthias Kläy, Kläy Computing AG
- Als Antwort markiert Tom Krist der zweite Montag, 15. Juli 2019 11:22
Alle Antworten
-
Ich habe die Erfahrung gemacht, dass solche Fehler auftauchen können, wenn man das DoCmd.CopyObject zu schnell mehrmals hintereinander ausführt, besonders wenn die Ziel-Datenbank auf einem Netzwerklaufwerk liegt. Deshalb schalte ich nach jedem DoCmd.CopyObject eine kurze Pause ein:
Public Declare PtrSafe Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long) DoCmd.CopyObject remoteDB.Name, "Abfrage1", acQuery, "Abfrage1" Call Sleep(100) ' eine Zehntelssekunde warten DoCmd.CopyObject remoteDB.Name, "UXxxxx", acReport, "U2" Call Sleep(100) ' eine Zehntelssekunde warten
Und, für DoCmd.CopyDB ist es nicht notwendig, dass die Zieldatenbank offen ist (Set remoteDB…). Ich würde die Zieldatenbank geschlossen halten und das CopyObject durchführen und erst danach die Aktionen auf der remoteDB durchführen.
Matthias Kläy, Kläy Computing AG
- Bearbeitet mklaey Sonntag, 14. Juli 2019 09:08 Zusatz
- Als Antwort markiert Tom Krist der zweite Montag, 15. Juli 2019 09:10
-
Hallo Matthias,
ich staune, aber es funktioniert mit der Zeitverzögerung!
Besten Dank für den Tipp!
2 Sachen bleiben
1. Ein Bericht existiert bereits in der fernen DB. So kommt dann die Meldung: "Objekt existiert, soll überschrieben werden?", standardmäßig auf NEIN gesetzt. So muss ich wohl immer aktiv mit JA bestätigen, oder? Die Meldung ausschalten bringt wohl nichts, denn dann würde der neue Bericht ja umbenannt in Bericht1, was nicht zielführend wäre.
2. Die ferne DB soll nun mit den Änderungen einen Bericht als PDF ausgeben. Diese Funktionalität ist an eine Ereignis-Sub eines Formulars gekoppelt, dummerweise ist diese Private. Also kann ich diese nicht ausführen, wenn ich die DB mittels
Set oDB = GetObject(remoteDB)
öffne. Muss ich die Prozedur wohl händisch anstoßen.
Währenddessen soll der aufrufende Prozess warten, solange, bis die remoteDB geschlossen wird. Da fehlt mir jetzt aber das Kriterium, von dem ich ableiten kann, dass die remoteDB geschlossen wurde. Die WinAPI FindWindows fällt wohl aus, da beide Access-Fenster gleich lauten.
Andere Idee übers = Shell("msaccess.exe " & vDB, vbMaximizedFocus)
Aber mit welcher WinAPI-Funktion kann ich s auswerten?
Gruß Tom
-
Punkt 1, Löschen eines Berichts in der Remote-DB geht etwa so:
Dim Target As Access.Application Set Target = GetObject("D:\KccTemp\TestRemoteDelete.accdb") Target.visible = False Call Target.DoCmd.DeleteObject(acReport, "rpt_ToDelete") Target.Quit acQuitSaveAll
Analog kannst du mit Target.DoCmd.OpenReport etc. auch einen Bericht in der Remote-DB öffnen. Vielleicht kannst du mit diesem Hinweis auch Punkt 2 lösen.
Matthias Kläy, Kläy Computing AG
- Als Antwort markiert Tom Krist der zweite Montag, 15. Juli 2019 11:22
-
Das war auch schon mal mein Gedanke: man müsste das DoCMD-Objekt einfach an eine andere Instanz hängen können.
Du hast recht, auch Punkt 2 müsste sich darüber lösen lassen, bsw die Ausgabe als PDF in ein Makro legen und das dann mittels DoCMD aufrufen ...
Nochmals besten Dank
Gruß Tom