Recordset-Laufzeit während Abfrageausführung

Hallo,

in einer Abfrage greife ich auf eine VBA-Funktion zurück, um mir für jeden Datensatz einen Wert berechnen zu lassen.
In der Funktion arbeite ich mit einem DAO-Recordset, da für die Berechnung Werte aus einer bestehenden Tabelle herangezogen werden.

Zur Erstellung des Recordset könnte ich z.B

Set rst = CurrentDB.OpenRecordset("Tabelle1")

benutzen.

Oben erzeugtes Recordset würde durch den mehrmaligen Codeaufruf durch die Abfrage für jeden Datensatz neu erzeugt, was zu einer erheblichen Ablaufverzögerung führt.
Um diese zu vermeiden habe ich rst als öffentliche Variable außerhalb der Prozeduren deklariert und erzeuge jetzt das Recordset nur beim ersten Aufruf der Funktion durch:

If rst Is Nothing Then Set rst = ...

Das Problem ist dabei nur, dass nach Abschluss aller Berechnungen je Datensatz der Abfrage das Recordset bestehen bleibt und nicht wieder zurückgesetzt wird.
Damit habe ich Schwierigkeiten bei der Tabellenbearbeitung (Entwurfsansicht gesperrt) und bei nachträglichen Aktualisierungen der Quelltabelle die nicht automatisch zu einer Aktualisierung des Recordset führen. Das heißt bei Neuaufruf der Abfrage wird u.U. mit den alten Werten der Quelltabelle gerechnet und die Abfrage liefert falsche Ergebnisse.

Wie schaffe ich es nun, dass das Recordset nur während des Ausführens der Abfrage bestehen bleibt, nicht ständig neu erzeugt wird aber nach Darstellung des Abfrageergebnisses wieder zurückgesetzt wird (rst.close, set rst = nothing)?

Ich brauche also etwas ähnliches wie ein „Abfrage-Fertig“-Ereignis oder auch „Abfrage-Schließen“-Ereignis.
Dachte auch schon an einen Timer o.ä., welcher nach gewisser Inaktivität der Funktion das Recordset zurücksetzt.

Hat jemand Ideen?
Wie kann man das realisieren?

Vielen Dank für jeden Hinweis!
Nette Grüße, tester

Hallo.

Wie kann man das realisieren?

Ganz einfach wäre die Sache, wenn Du die Abfrage nicht als Abfrage, sondern als dynamische SQL aus einer Sub oder Function generörest.

Schema

Public Sub GuckMaDa()
Dim peng As DAO.Recordset
Dim bumm As String
'...
Set peng=CurrentDb.OpenRecordset("kikeriki",dbOpenDynaset)
bumm="SELECT rums,bums FROM wumm "+ \_
 "WHERE tatü=tata AND **pfn\_Funktion(palimpalim)**= ...
CurrentDb.Execute bumm
'...
peng.Close
Set peng=Nothing
End Sub
'...
Public Function pfn\_Funktion(ByVal palimpalim As ...) As ...
Dim WuppDich As DAO.Recordset
Set WuppDich=CurrentDb.OpenRecordset(....
...
WuppDich.Close
Set WuppDich=Nothing
pfn\_Funktion=WasAuchImmer
End Function

Gruß Eillicht zu Vensre

Hallo tester,

Hat jemand Ideen? Wie kann man das realisieren?

also ich würde die Berechnung direkt in eine Abfrage (ggf. Aktualisierungsabfrage) einbauen, ohne jetzt den Grund deiner Vorgehensweise zu kennen.

In VBA wäre alternativ auch die Nutzung von DLOOKUP sinnvoll.

Beispiel:
Wert001 = Dlookup(„WERT1“,„MeineTabelle“,ggf. Bedingung)
Wert002 = Dlookup(„WERT2“,„MeineTabelle“,ggf. Bedingung)
Wert003 = Wert001 + Wert002

Grüße aus Raben Steinfeld (bei Schwerin)
Wolfgang
(Netwolf)

Hallo.
Danke für den Vorschlag.

Ganz einfach wäre die Sache, wenn Du die Abfrage nicht als
Abfrage, sondern als dynamische SQL aus einer Sub oder
Function generörest.

'…
bumm="SELECT rums,bums FROM wumm "+ _
"WHERE tatü=tata AND pfn_Funktion(palimpalim)= …
CurrentDb.Execute bumm

Leider scheitert es hieran.

  1. möchte ich die Funktion als Abfragewert und nicht als Auswahlkriterium nutzen.
  2. Lassen sich über „CurrentDB.Execute“ nur Aktionsabfragen und keine Auswahlabfragen durchführen.
  3. möchte ich auf die Abfrage mit den berechneten Werten auch in weiteren darauf aufbauenden Abfragen zurückgreifen. Ein geeignetes Objekt würde aber durch die Erzeugung per Code fehlen.

Trotzdem vielen Dank.
Gruß, tester