Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

Anfügeanfrage zeitgesteuert in Access 2003





Frage

Ich möchte gerne eine Anfügeanfrage am letzten Tag jedes Monates, egal welcher Wochentag, um 16:00 Uhr ausführen. Ist das möglich, und wenn ja, kann mir da vielleicht jemand helfen wie man das programmiert in Access 2003?

Antwort 1 von erik

Hallo Reiti,

der letzte Tag eines Monats ist zugleich der erste Tag des Folgemonats minus 1. Mit der DateSerial()-Funktion kannst du auf diese Weise den letzten Tag des aktuellen Monats ermitteln:

datLetzterTag = DateSerial(Year(), Month() + 1, 0) 


Das funktioniert auch problemlos mit Schaltjahren und auch mit Jahresenden, z.B. ist der 31.12.2007 identisch mit dem 0.13.2007. Mit der TimeSerial()-Funktion kannst du die passende Uhrzeit noch hinzuaddieren:

datUhrzeit = TimeSerial(16, 0, 0)


Um festzustellen, wann der Zeitpunkt gekommen ist, kannst du entweder das Timer-Ereignis eines (ggfs. unsichtbaren) Formulars benutzen, das im Sekundentakt eine geeignete Prüfung der aktuellen Uhrzeit durchführt. Falls du kein Formular willst, dann geht das auch über ein reguläres Modul, wobei du dort den fehlenden Timer durch eine Schleife ersetzen musst. Dabei solltest du die dabei auftretende Prozessorlast vermeiden, indem du die Sleep-Prozedur aus der Windows-API verwendest, die legt dir Access für die angegebene Zeitspanne schlafen.

Deklarationszeile im Kopf des Moduls:
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


Folgendes Beispiel lässt die Anwendung 5 Sekunden schlafen:
Sleep 5000


Damit Access dann auch noch auf deine Benutzereingaben reagiert, solltest du bei jedem Schleifendurchlauf noch die DoEvents-Anweisung ausführen.

Prinzipiell sollte das alles ungefähr so aussehen:

Do Until blnExternesAbbruchKriterium = True
	If Now() = DateSerial(Year(), Month()+1, 0) + TimeSerial(16, 0, 0) Then
		AbfrageAusführen
	End If
	Sleep 1000
	DoEvents
Loop


Die Variable blnExternesabbruchKriterium repräsentiert eine von vielen Möglichkeiten, mittels eines äußeren Eingriffs die Schleife auch mal wieder zu beenden. Endlosschleifen sollten vermieden werden. :-)

Dann gäbe es noch eine weitere offene Frage. Willst du den Code ausschließlich zum geeigneten Zeitpunkt ausführen oder sollen evtl. verpasste Zeitpunkte nachträglich aufgearbeitet werden? Im ersten Fall reicht ein Zeitvergleich wie oben im Beispielcode. Im zweiten Fall müssten du zum einen den Vergleichsoperator >= heranziehen und auch zusätzlich in einer Tabelle festhalten, welche Monate bereits erfolgreich abgearbeitet wurden, um mehrfache Verarbeitungen zu verhindern.

Gruß
erik

Antwort 2 von Reiti

Hallo Erik, ich bin verblüfft über so viel Hilfsbereitschaft. Vielen vielen Dank schon mal im Voraus. Ich werde morgen sofort ausprobieren ob es klappt. Ja, ich möchte, das die Abfrage sozusagen selbsständig arbeitet. Ich muss jetzt nur noch herausfinden wo ich den Code einarbeite damit er ausgeführt wird. Soooooooo viel Ahnung wie Du hätte ich auch gerne, hab ich aber leider nicht. Also, "learing by doing" ist angesagt....
Wie gesagt, trotzdem schon mal herzlichen Dank....