Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

Datumsvergleich Access 2000





Frage

Hallo habe folgendes Problem: ich möchte ein Makro beim öffnen eines formulars starten , welches mir ein weiteres formular öffnet. und dies zu einem ganz bestimmten zeitpunkt. zb: am 07.03 jeden jahres soll sich das makro öffnen. habe versucht es in das kriterium des makros reinzuschreiben und zwar wie folgt: Datum$()=03-07-2006 hat aber nicht funktioniert. kennt ihr eine lösung?

Antwort 1 von ChatAlligator

Öffne das "Microsoft Access Klassenobjekt" der entsprechenden Form. Darein schreibst Du folgendes Modul:

Private Sub Form_Load()
Dim t As Date
t = Now()
If t >= CDate("3.7.2006") And t < CDate("3.7.2006") + 1 Then _
DoCmd.OpenForm "ZuÖffnendesFormular", , , stLinkCriteria
End Sub

Im Klartext:
Prozedur beim Laden (öffnen) der Form
deklariere Variable t als Datum-/Zeitwert
lade aktuelles Datum (inclusive Zeit) in Variable t
wenn t mindestens dem 3.7.2006 0:00 ist _
und t vor 4.7.2006 0:00 liegt, dann lade (öffne) Form "ZuÖffnendesFormular"
Ende der Prozedur

Über Prozesse/Funktionen (Module/Klassenobjekte) lässt sich vieles einfacher regeln, als über Makros

Gruß CA

Antwort 2 von ChatAlligator

P.S.:

Denke immer daran, dass Zeit-/Datumswerte reelle Zahlen sind
Vor dem Komma stehen tage seit 1.1.1900
Hinter dem Komma steht die Zeit als Dezimalbruch des Tages
Vergleicht man einen solchen Wert mit einem "=", so vergleicht man ihn nur mit einem Bruchteil einer Sekunde (nicht mit einem ganzen Tag), wodurch die Bedingung nur schwehr zu erfüllen ist (auch prozeduren benötigen eine gewisse Zeit)

Antwort 3 von ChatAlligator

Alternativ kann auch
If t >= CDate("3.7.2006") And t < CDate("3.7.2006") + 1 Then _

ersetzt werden durch
If Day(t) = Day(CDate("3.7.2006")) And Month(t) = Month(CDate("3.7.2006")) Then _

weil hier
And Year(t) = Year(CDate("3.7.2006"))
fehlt, wird das Jahr nicht berücksichtigt und somit jedes Jahr ausgeführt

Antwort 4 von skypig

Hallo
danke für die rasche Antwort!

nur habe ich das problem das es nicht funktioniert.
beschreibe dir kurz meine arbeitsschritte:

1, Eigenschaften des Formulars öffnen

2, Beim Laden auf "..." klicken und Code-Generator auswählen

3, Klassenmodul einfügen

der code sieht folgendermaßen aus:
Option Compare Database

Private Sub Form_Load()
Dim t As Date
t = Now()
If Day(t) = Day(CDate("4.7.2006")) And Month(t) = Month(CDate("4.7.2006")) Then _
DoCmd.OpenForm "f_Urlaub neu", , , stLinkCriteria
End Sub

4,Speichern unter "Datumsvergleich"

Da ich ein Neuling bin:
muss ich dieses Modul irgendwie in den Code vom Formular einbinden?
Habe auch versucht das Modul "Datumsvergleich" durch den Ausdruckgenerator bereich Funktion aufzurufen, wird zwar angezeigt kann aber nicht ausgewählt werden

Hast du ein Idee ChatAlligator?
danke
mfg skypig

Antwort 5 von ChatAlligator

Öffne das Formular in der Entwurfsansicht.

Am Kopf des Formularfensters findest Du ein waagerechtes Lineal, links daneben (also über den 2 Flächen am des Kopfes des senkrechten Lineals) findest Du ein kleines graues Quadrat.
Mit Rechtsklick auf das Quadrat kannst Du die Eigenschaften des Formulars wählen -> im grauen Quadrat erscheint ein winziges schwarzes Quadrat
(wähernd ein freier Bereich im Formular nur den Detailbereich anwählt).
In den Eigenschaften den Karteireiter "Ereignis" wählen und in die Zeile "Bei Laden" anklicken. Rechts in der Zeile werden 2 kleine Schaltflächen angezeigt. Klicke auf das linke davon, damit "[Ereignisprozedur]" in der Zeile erscheint.
Wäre die Prozedur "Form_Load" noch nicht vorhanden, würde sie damit neu angelegt. Auf jeden Fall ist sie somit mit dem Ereignis verknüpft.

An sonsten sehe ich keinen Fehler in deiner Prozedur (vorausgesetzt zwischen "THEN" und "_" steht ein Leerzeichen. Sie müsste somit jeden 4.Juli die andere Form öffnen, wenn sie selbst geöffnet wird.
(" _" bedeutet übrigens: Zeile wird in nächster Zeile fortgesetzt - damit entfällt hier das "END IF" in der folgenden Zeile)

kleiner Tip:
Vermeide es, in einem Formnamen (oedr anderes Objekt) ein Leerzeichen einzubauen, sonst muss beim Aufruf einer Eigenschaft/Methode dieses Objekts der Name in eckige Klammern gesetzt werden, damit das Programm sieht, dass es ein zusammengesetzter Name ist und nicht ein nicht vorhandenes Objekt gefolgt von Parameter

Gruß CA