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
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)
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
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
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
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

