none
Zugriff auf ferne Datenbanken RRS feed

  • 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

    Samstag, 13. Juli 2019 08:53

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


    Sonntag, 14. Juli 2019 08:39
  • 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

    Montag, 15. Juli 2019 10:12

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


    Sonntag, 14. Juli 2019 08:39
  • 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 über

    s = Shell("msaccess.exe " & vDB, vbMaximizedFocus)

    Aber mit welcher WinAPI-Funktion kann ich s auswerten?

    Gruß Tom



    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

    Montag, 15. Juli 2019 10:12
  • 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

    Montag, 15. Juli 2019 11:29
  • BTW, wie setzt man eigentlich eine globale Variable in einer fernen DB?

    Ich habe versucht

    Target.Modulname.Variablenname="Wert"
    wobei Variablenname als Public deklariert wurde.

    Leider Fehler.

    Montag, 15. Juli 2019 14:44