Laufende VBA-Prozedur anhalten

Moderator: ModerationP

Laufende VBA-Prozedur anhalten

Beitragvon Gast111 » 23. Mai 2020, 12:35

Hallo Forum,

in meiner Access-Datenbank läuft eine Prozedur ziemlich lange (Stunden oder Tage). Das ist ok, weil jede Menge Daten in unendlich vielen :razz: Konstellationen durchgecheckt werden müssen.

Kennt jemand eine Möglichkeit, den Prozess mittels Esc-Taste (zweimal gedrückt oder festgehalten) anzuhalten oder zu abzubrechen? Was müsste man in die Prozedur einbauen?

Ich würde mich freuen, wenn jemand ein Code-Beispiel angeben könnte.

Danke und Gruß!
Gast111
 

Re: Laufende VBA-Prozedur anhalten

Beitragvon Beaker s.a. » 23. Mai 2020, 12:40

Was müsste man in die Prozedur einbauen?

Zu Beginn ein
Code: Alles auswählen
DoEvents

Funzt allerdings nicht während eine Abfrage läuft, erst wieder danach.
Ereignisorientierte Programmierung:
Alles, was geschieht, geschieht.
Alles, was während seines Geschehens etwas anderes geschehen
läßt, läßt etwas anderes geschehen.
Alles, was sich selbst im Zuge seines Geschehens erneut geschehen
läßt, geschieht erneut.
Beaker s.a.
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 891
Registriert: 14. Jul 2012, 21:56
Wohnort: Bremen

Re: Laufende VBA-Prozedur anhalten

Beitragvon knobbi38 » 23. Mai 2020, 12:45

Hallo,

du brauchst nur an entscheidenden Stellen in deinem Sourcecode eine boolsche Variable abfragen, ob abgebrochen werden soll und falls ja, die laufenden Aktionen sauber beenden.

Das setzen der Variablen kann innerhalb eine Form_KeyPressed oder Button_Click Events Prozedur erfolgen.

Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2044
Registriert: 02. Jul 2015, 14:23

Re: Laufende VBA-Prozedur anhalten

Beitragvon j05 » 23. Mai 2020, 14:23

Hallo,
mit STRG+UNTBR/PAUSE bin ich bisher immer ganz gut gefahren einen laufenden Code zu stoppen.
mfg j05 :wink:
Benutzeravatar
j05
Moderator
 
Beiträge: 18211
Registriert: 23. Apr 2005, 18:10
Wohnort: ~~~~~

Re: Laufende VBA-Prozedur anhalten

Beitragvon knobbi38 » 23. Mai 2020, 17:06

@j05:
Nicht jedes System hat diese Taste, so daß diese Tastenkombination nicht möglich ist.

Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2044
Registriert: 02. Jul 2015, 14:23

Re: Laufende VBA-Prozedur anhalten

Beitragvon Gast » 23. Mai 2020, 17:48

ziemlich lange (Stunden oder Tage). Das ist ok ...

Man muss aber nicht einen Zustand als gegeben unveränderlich ansehen. Bei einer Laufzeit von mehreren Tagen hat man sicherlich irgendwo in die falsche Kiste gegriffen.
Gast
 

Re: Laufende VBA-Prozedur anhalten

Beitragvon Gast111 » 23. Mai 2020, 20:09

Oops! Soviele Antworten hätte ich aber nicht erwartet!

"Falsche Kiste": Sicher nicht. Muss so sein. Das Ding läuft x Mio Mal durch eine Prozedur, die eine Masse an Daten unter verschiedenen Konstellationen erzeugt. Bin ganz stolz drauf, dass das klappt. Ist ein kleines Projekt zu Forschungszwecken.

"STRG+UNTBR/PAUSE": klappt bei mir nicht.

"Button_Click Events Prozedur": Während die Prozedur läuft, nimmt Access überhaupt keine Aktion mehr an. Jeder Mausklick bleicht den Bildschirm aus.

DoEvents hab ich schon mal irgendwo gelesen, werd mich nochmal schlau machen. Also: Man schreibt in den Code das "DoEvents" rein, und dann?

Danke für Eure Ideen!
Gast111
 

Re: Laufende VBA-Prozedur anhalten

Beitragvon knobbi38 » 23. Mai 2020, 21:22

Hallo,

du mußt Access auch die Change geben, die Messagequeue abarbeiten zu können und das wird mit DoEvents erreicht, wobei die aktuelle Verarbeitung unterbrochen wird, um ausstehende Messages zu verabeiten.

Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2044
Registriert: 02. Jul 2015, 14:23

Re: Laufende VBA-Prozedur anhalten

Beitragvon Bitsqueezer » 24. Mai 2020, 01:52

Hallo,

meistens wird mit VBA in einer Datenbank rumprogrammiert für Dinge, die mit SQL viel schneller zu erledigen wären. Daher darf gezweifelt werden, ob Deine Prozedur wirklich so notwendig ist. Wenn Du mal Details erzählst, könnte man Dir vielleicht helfen. Dabei mußt Du keine "Forschungsgeheimnisse" erzählen, sondern nur mal erklären, was Du da so grob machst.

"DoEvents" sollte natürlich mit Vorsicht eingesetzt werden. Ansonsten kann die CPU-Zeit drastisch nach oben gehen. In einer Schleife mit sehr vielen Durchgängen sollte man einen eigenen Zähler verwenden und "DoEvents" dann z.B. nur bei jedem 100. Mal aufrufen (muß man halt probieren).

Abfragen kann man auch asynchron laufenlassen, wenn man ADO verwendet. Da gibt es dann sogar eigene Events.

Für das Anzeigen eines Fortschrittsbalkens in einem Formular kann man übrigens auch die "Repaint"-Methode des Formulares verwenden.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7477
Registriert: 21. Jun 2007, 12:17

Re: Laufende VBA-Prozedur anhalten

Beitragvon j05 » 24. Mai 2020, 15:50

Ulrich hat geschrieben:Nicht jedes System hat diese Taste, so daß diese Tastenkombination nicht möglich ist.
Sorry ist mir noch nicht untergekommen :oops:
mfg j05 :wink:
Benutzeravatar
j05
Moderator
 
Beiträge: 18211
Registriert: 23. Apr 2005, 18:10
Wohnort: ~~~~~

Re: Laufende VBA-Prozedur anhalten

Beitragvon Gast » 24. Mai 2020, 19:31

Hallo Christian,

also, wenn ich Dich richtig verstehe, ist es so, dass ich in den Prozecurablauf einfach reinschreibe "DoEvents", und schon "hört" Access, ob eine Taste gedrückt wurde, und springt also aus dem Queue raus, indem die Priorität der CPU auf "Tastendruck" gestellt wird, Fragezeichen. Ich verstehe es noch nicht ganz, werde aber noch ein wenig dazu lesen. Dann ists ok.

Na ja, so geheim ist es nicht, was ich da mache. Ist ziemlich speziell, und interessiert eigentlich nur die Kollegen Schriftsachverständigen. Ich habe Schriftmerkmale in einer fraglichen Schrift erfasst. Dann gibt es zwei Vergleichsschreiber, und ich soll feststellen, ob eher der eine oder eher der andere Urheber der fraglichen Schrift ist. Dazu zähle ich die fraglichen Merkmale in den Schriften der beiden Vergleichsschreiber aus und wende das Bayes-Theorem an, an dessen Ende die relative Wahrscheinlichkeit für die Urheberschaft des jeweiligen Schreibers in Prozent steht.

Ein Problem dabei ist, dass man eigentlich nicht weiß, wieviele und welche Schriftmerkmale man auszuzählen hat. Aktuell habe ich 22 relevante Merkmale. Die Menge an möglichen Konfigurationen ist 2^22-1, ungefähr 4 Millionen. Also: Ich nehme Merkmal 1 und zähle aus, wie oft kommt es bei Schreiber 1 und Schreiber 2 vor, und rechne dann die Wahrscheinlichkeiten aus. Dann Merkmal 2, etc. bis Merkmal 22; sind schon mal 22 Konfigurationen. Dann das Gleiche mit Merkmal 1 und Merkmal 2, MM1 und MM3, MM1 und MM4, usw. als Zweier-Sets, dann Dreier-Sets bis zum (einzigen) 22er-Set. So entsteht die Riesenmenge an Daten, die letztlich in einer Tabelle abgelegt und anschließend ausgewertet werden. Wir werden sehen, was dabei rauskommt. Augenblicklich läuft der Rechner noch voraussichtlich bis morgen Abend. Kann sein, dass nichts Verwertbares rauskommt. Dann war's den Versuch wert. Hat jedenfalls Spaß gemacht.

Und wieder was dazugelernt (DoEvent).

Danke!
Gast
 

Re: Laufende VBA-Prozedur anhalten

Beitragvon Bitsqueezer » 24. Mai 2020, 21:53

Hallo,

nein, "DoEvents" sorgt nur dafür, daß Access auch mal Windows zwischendurch die Kontrolle gibt, so daß, mal einfach gesagt, Windows nicht denkt, daß Access abgestürzt ist.

Nebenbei können während dieser Zeit auch Tastatureingaben oder Mauseingaben erfolgen oder Bildschirmdisplays aktualisiert werden etc.

Du mußt also außerdem auch die Tastenvorschau im Formular aktivieren und einer der Tastaturevents programmieren, damit Du auf ESC oder irgendeine Taste auch irgendwie reagieren kannst.

Was die Berechnung angeht: Bei einer Datenbank geht es vor allem um zeilenweise Verarbeitung. Du kannst jederzeit Berechnungsergebnisse als Zwischenergebnis in einer temporären oder permanenten Tabelle speichern und wieder als Grundlage für weitere Berechnungen verwenden. Gerade bei großen Datenmengen kannst Du mit SQL so sehr viel schneller arbeiten als VBA mit irgendwelchen Schleifen könnte.

Wenn es um rekursive Verarbeitung geht, also die Berechnungsergebnisse wieder für weitere Berechnungen der gleichen Art zu verwenden, dann wärst Du allerdings besser mit z.B. SQL Server bedient, der sowas problemlos in SQL kann, dafür ist Access ungeeignet.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7477
Registriert: 21. Jun 2007, 12:17

Re: Laufende VBA-Prozedur anhalten

Beitragvon Beaker s.a. » 25. Mai 2020, 12:13

@Gast111
Wegen der langen Laufzeit hätte ich mal eine, nein zwei Fragen.
Werden in deiner Prozedur auch mehrere Millionen DS neu angelegt?
Ist es so, dass die Geschwindigkeit der Verarbeitung im Fortschritt immer
langsamer wird? Will sagen, die ersten paar 100K DS gehen noch relativ
zügig und dann wird es immer zäher?
Wenn das so ist, liegt es an den gesetzten Indices. Ich hoffe, dass ich die
Beschreibung, die ich dazu vor 10 Jahren mal bekommen habe jetzt richtig
wiedergebe, die Profis können das sicher besser

Die JET aktualisiert bei jedem neuen Datensatz die Indexliste, sortiert
also jeden DS neu ein. Dies dauert bei zunehmender Anzahl DS immer
länger.

Da hilft es die Indices vor dem Berechnung/Schreiben zu löschen (zwischen-
speichern) und erst am Ende wieder einzufügen. Dann reduziert man die
Indizierung auf einen einzigen Durchlauf.
Bei mir hat das damals die Laufzeit eines sequentiellen Imports von ca. 24Std.
auf 30Min. reduziert. Code könnte ich liefern, falls das wirklich das Problem
sein sollte.
gruss ekkehard
Ereignisorientierte Programmierung:
Alles, was geschieht, geschieht.
Alles, was während seines Geschehens etwas anderes geschehen
läßt, läßt etwas anderes geschehen.
Alles, was sich selbst im Zuge seines Geschehens erneut geschehen
läßt, geschieht erneut.
Beaker s.a.
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 891
Registriert: 14. Jul 2012, 21:56
Wohnort: Bremen

Re: Laufende VBA-Prozedur anhalten

Beitragvon Gast111 » 25. Mai 2020, 16:40

Hallo Eckehard,
danke für den Tipp mit den Indices. Hier arbeite ich - eben aus Tempogründen - in VBA bei der Berechnung komplett mit Arrays. Erst ganz am Schluss, wenn der Ziel-Array das Ergebnis trägt, schreibe ich ihn auf eine Tabelle.

und Christian,
Rechenergebnisse: siehe oben.
Ich hab zwar eine kleinen (ausgeliehene) Rekursion drin, aber damit bin ich nicht so geübt. SQL-Server wäre für mich Neuland.

Da Du Server erwähnst: Rudimentär kann ich mit meiner Datenbank schon arbeiten, ist halt noch im Protostadium. Geplant ist, den Prototyp in Fachkreisen anzubieten. Dazu müssten Code-Teile auf irgendeinen Server (Cloud) ausgelagert werden. Außerdem müssten Daten, die ich nicht preisgeben möchte, außerhalb ihrer Verwendung verschlüsselt transportiert und abgelegt werden. Ich stelle mir beides ziemlich kompliziert vor, habe jedenfalls keine Ahnung davon, so dass ich davon ausgehe, dass nur ein paar Routinen, die bereits erprobt sind, bleiben können, während der Rest um- oder neugeschrieben werden muss. Irgendwie hab ich dafür noch keine Lösung und auch noch keinen Ansprechpartner, der sowas machen oder zumindest managen könnte. Wie geht man an sowas ran? Twago kenne ich, aber da weiß man halt nie ... .

Zunächst mal Danke Euch allen für die themenbezogenen Tipps. War hilfreich, Problem gelöst.

Gruß,
R. Obert
Gast111
 

Re: Laufende VBA-Prozedur anhalten

Beitragvon KlausMz » 25. Mai 2020, 16:55

Hallo,
Hier arbeite ich - eben aus Tempogründen - in VBA bei der Berechnung komplett mit Arrays.
Dir ist aber schon bewusst, dass das im Regelfall in einer Datenbank die langsamste Methode ist?
Gruß
Klaus . . . . . Feedback wäre wünschenswert.
Ich möchte bitte keine unaufgeforderten PN. Fragen bitte im Forum.
Benutzeravatar
KlausMz
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 39522
Registriert: 06. Okt 2003, 15:09
Wohnort: Irgendwo in der Pfalz

Nächste

Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast