Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

VBA warten lassen bis Aktionen abgearbeitet sind

Begonnen von joschi50, Juli 29, 2023, 13:24:52

⏪ vorheriges - nächstes ⏩

joschi50

Die folgende Funktion ruft einige Ereignise auf:
Function export()
DoCmd.SetWarnings False
Call importlöschen   'löscht Einträge in 2 Tabellen einer externen Datenbank
CurrentDb.Execute "exportre"    'kopiert Einträge in eine Tabelle einer externen DB
CurrentDb.Execute "exportrea"  'kopiert Einträge in eine Tabelle einer externen DB
CurrentDb.Execute "exportreok" 'löscht Eintrage aus Tabelle in CurrentDB
Call importrename ' benennt die externe DB mit Zeitstempel um
Call datenaustausch ' Erzeugt ein Email mit Anhang der externen DB
DoCmd.SetWarnings True
End Function

Gibt es eine Möglichkeit sicherzustellen, dass alle Schritte vollständig abgearbeitet werden, bevor der nächste Schritt erfolgt ?
Access ist da teilweise schneller als mir lieb ist.
Auch Wolkenkratzer haben mal als Keller angefangen.

Beaker s.a.

Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MzKlMu

Hallo,
Hinweise zum Code:
Im Zusammenhang mit Execute sind die beiden Zeilen mit SetWarnings überflüssig.
Mit CurrentDb.Execute werden keine Warnmeldungen ausgegeben. Nur Fehlermeldungen (ist was anderes als Warnungen).
Die Fehlermeldungen müssen aber extra eingeschaltet werden, was man unbedingt machen sollte.
Das sieht dann so aus:
CurrentDb.Execute "exportre", DbFailOnError
Gruß Klaus

joschi50

ok danke, der Aufruf für Fehlermeldungen ist drin aber die Suche nach "Transaktion" hat mich nicht wirklich weiter gebracht.
Auch Wolkenkratzer haben mal als Keller angefangen.

markusxy

Zitat von: joschi50 am Juli 29, 2023, 13:24:52dass alle Schritte vollständig abgearbeitet werden, bevor der nächste Schritt erfolgt ?

Grundsätzlich arbeitet Access ja nicht asynchron.
Bei welchem Schritt gibt es denn ein Problem?
Und nicht nur den Aufruf einer Prozedur/Funktion zeigen sondern auch den Code dazu.


joschi50

Markus, ich habe jetzt erstmal eine MSGBOX nach Ausführung der Aktionsabfragen eingebaut. So kann ich sicher sein, dass diese abgearbeitet sind bevor die Datei umbenannt wird.
Der ausführende Code funktioniert ansonsten problemlos.
In der aktuellen Anwendung habe ich das Problem noch nicht da die Menge der Datensätze die kopiert und gelöscht werden sehr klein sind.
Es ist einfach eine Sicherheit die ich einbauen wollte.

Eine Frage hätte ich noch, hängt indirekt mit dem Thema zusammen.
Kann man die Zieldatei in den Eigenschaften der Aktionsabfrage (z.B. Anfügeabfrage) zur Laufzeit per VBA ändern ?
Auch Wolkenkratzer haben mal als Keller angefangen.

MzKlMu

Hallo,
zu Transaktion:
https://codekabinett.com/rdumps.php?Lang=1&targetDoc=access-transaktion-verwenden

ZitatKann man die Zieldatei in den Eigenschaften der Aktionsabfrage (z.B. Anfügeabfrage) zur Laufzeit per VBA ändern ?
Ja, das geht.
Gruß Klaus

markusxy

Zitat von: joschi50 am Juli 29, 2023, 15:15:58In der aktuellen Anwendung habe ich das Problem noch nicht da die Menge der Datensätze die kopiert und gelöscht werden sehr klein sind.

Die Menge spielt doch keine Rolle. Auch eine Transaktion ändert da nichts. Der Vorteil der Transaktion, ist dass man bei Problemen alle Datenbank-Änderungen gemeinsam rückgängig machen kann - ansonsten hat das keine Bedeutung - vor allem nicht in diesem Kontext.
Man sollte aber unbedingt mit Transaktionen umgehen können und es verstehen wenn man mit Datenbanken arbeitet.
So lange eine Abfrage nicht asynchron ausgeführt wird, wartet VBA mit der Fortsetzung immer bis der gesamte Vorgang abgeschlossen ist.

Zitat von: joschi50 am Juli 29, 2023, 15:15:58Kann man die Zieldatei in den Eigenschaften der Aktionsabfrage (z.B. Anfügeabfrage) zur Laufzeit per VBA ändern ?

Was willst du denn konkret ändern?

ebs17

ZitatEs ist einfach eine Sicherheit die ich einbauen wollte.
Vielleicht solltest Du auch den Workflow überdenken. Löschen + Neuanlegen sind geeignet, Aufblähungen zu verursachen. Ohne Komprimieren wachsen Deine Datenbanken und verlangsamen einfach durch vorhandene Größe.

Der Verzicht auf unnötige Schritte verringert auch Gedanken auf ein Abwarten dieser.
Für die externe DB könnte man ein Template mit leeren Tabellen einsetzen oder die DB-Kopie voll per Code erzeugen (wenn man wüsste, was sonst noch da zu finden ist).
Mit freundlichem Glück Auf!

Eberhard

joschi50

Hallo Eberhard,
die externe Datenbank enthölt nur 2 Tabellen mit wenigen Einträgen. Bevor ich neue Einträge anfüge, leere ich die beiden Tabellen.
DB hat nur ca. 400KB

Zur Frage mit den Eigenschaften der Aktionsabfragen: Ich möchte den Pfad der Zieldatei ändern.

Zum Hintergrund:
Ich arbeite mit einer selbstgestrickten Fakturierung auch von unterwegs (Wohnmobil).
Ein Mitarbeiter zu Hause soll die Aufträge eigentlich nur ausdrucken, Etiketten erzeugen und die Ware verpacken.
Die Rechnungen etc. schreibe ich von unterwegs.
Er erhält dann lediglich eine DB mit den neuesten Aufträgen, importiert sie in die Hauptanwendung und kann mit der Arbeit beginnen.
Wenn ich wieder zuhause bin, überschreibe ich die Hauptanwendung mit meiner Version und damit ist alles wieder auf aktuellem Stand.
Die Hauptanwendung befindet sich zu Hause auf einem Netzlaufwerk. Den Pfad zur Hauptanwendung möchte ich gerne in den Stammdaten hinterlegen damit bei einer anderen Situation (Laufwerkswechsel) der Import ebenfalls funktioniert.
Auch Wolkenkratzer haben mal als Keller angefangen.

ebs17

Dim ZDB As DAO.Database
Dim ZielDB As String
Dim QuellDB As String

ZielDB = irgendwas
Set ZDB = DBEngine.CreateDatabase(ZielDB, dbLangGeneral)
QuellDB = CurrentDb.Name

ZDB.Execute "SELECT * INTO Tabelle1 FROM [" & QuellDB & "].Tabelle1", dbFailOnError
ZDB.Execute "SELECT * INTO Tabelle2 FROM [" & QuellDB & "].Tabelle2", dbFailOnError
ZDB.Close
CurrentDb.Execute "loeschabfrage", dbFailOnError
Dieser Code erstellt ein neues DB-File. Pfad und Name inkl. Zeitstempel kannst Du sinnvoll vorbelegen.
Anschließend werden per Tabellenerstellungsabfrage die Tabellen kopiert. Danach ein reduziertes Löschen + Mailerstellung.
Mit freundlichem Glück Auf!

Eberhard

itwebmaster

Zitat von: joschi50 am Juli 29, 2023, 13:24:52Gibt es eine Möglichkeit sicherzustellen, dass alle Schritte vollständig abgearbeitet werden, bevor der nächste Schritt erfolgt ?
bei mir funktioniert DoEvents nach dem Befehl