Hallo Forum,
ich habe eine Feiertagsfunktion in meine Datenbank gebastelt, welche super funktioniert. Bei Änderungen am Datum wird die Funktion aufgerufen und prüft ob Feiertag. Jetzt mein Problem.
Ich möchte gern, daß die Änderung am Datum zurückgenommen wird, wenn bestimmte Feiertage eintreten. Ich kenne den Befehl undo, weiß aber nicht, wie ich diesen in meine Funktion integrieren kann.
Hier mal ein Teil der Funktion, welche auf den 01.01. prüft.
If Bereitstellungsdatum = DateSerial(lngJahr, 1, 1) Then MsgBox "Neujahr ist ein Feiertag, bitte Datum ändern": Exit Function
Jetzt wäre es super, wenn er die Änderung gleich zurücknimmt. Wie kann ich das einbauen?
Danke für Eure Hilfe.
Rene
Hallo René,
Spendiere der Function einen Rückgabeparameter (Boolean) und
führe die Prüfung im Ereignis "BeforeUpdate" des Datumsfeldes aus.
Private Sub Datumsfeld_BeforeUpdate(Cancel As Integer)
If DeineFunction = False Then
Me.Datumsfeld.Undo
Cancel = True
End if
End Sub
gruss ekkehard
Hallo,
entschuldige das ich mich erst jetzt melde, aber hatte keine Zeit für meine Datenbank:( Die Idee hatte ich auch schon, aber ich will nur auf bestimmte Feiertage reagieren, Dein Code gilt aber grundsätzlich für alle Feiertage. Hilft leider nicht.
Trotzdem Danke.
Rene
Hallo,
erstelle eine Kalendertabelle die alle Tage (z. B. von 10 Jahren) enthält, in der die relevanten Feiertage angehakt werden
Hallo Rene,
ZitatDein Code gilt aber grundsätzlich für alle Feiertage
Nöö, mein Code reagiert auf
deine Function. Welche Feiertage die
als prüfungswürdig bzw./und/oder gültig betrachtet weiss weder ich
noch mein Code.
gruss ekkehard
Hallo Ekkehard,
nun ich möchte zum Beispiel für den 01.01. die Änderung gleich zurücknehmen, wenn ich aber Deinen Code nutze greift dieser alle Feiertage ab. Aber genau das möchte ich nicht. Wie kann ich das begrenzen, oder verstehe ich Deinen Vorschlag falsch?
Danke.
Rene
Hallo Rene,
Ja, sorry, da ist natürlich ein Fehler in meinem Code; - der Parameter
(das Datum) wird ja nicht übergeben (schäm).
Die Zeile muss so aussehen
If DeineFunction(Me.Datumsfeld) = False Then
Wenn deine Function wirklich ein Datum als Parameter erwartet, wovon
ich ausgegangen bin, und du meinen Code so getestet hättest, hätte dir
der Compiler meinen Fehler aber eigentlich um die Ohren hauen müssen. ???
gruss ekkehard
P.S. Der Code lässt sich i.Ü. auch noch auf zwei Zeilen reduzieren.
Private Sub Datumsfeld_BeforeUpdate(Cancel As Integer)
Cancel = DeineFunction(Me.Datumsfeld)
'Hier musst du aufpassen welchen Wert deine Function für un-/gültig
'zurück gibt. Evtl. musst du es hier mit "Not" umkehren.
Me.Datumsfeld.Undo
End Sub
gruss ekkehard
Hallo Ekkehard,
danke das du dich so bemühst:) Ich habe eine Lösung gefunden, welche funktioniert aber technisch gesehen eher schlecht ist. Ich habe die Funktion erweitert und lasse ein fiktives Datum in meinem Datumsfeld erstellen. Dieses greife ich dann im "after update" Ereignis meines Datumsfeldes ab und mache es mit undo wieder rückgängig. Das klapp super.
Funktion sieht so aus:
If Bereitstellungsdatum = DateSerial(lngJahr, 1, 1) Then MsgBox "Neujahr ist ein Feiertag, bitte Datum ändern"
If Bereitstellungsdatum = DateSerial(lngJahr, 1, 1) Then Forms!AuftragsübersichtLogistik!Bereitstellungsdatum = "01.02.2000": Exit Function
das after update Ereignis:
Private Sub Bereitstellungsdatum_AfterUpdate()
Call IstFeiertag(ByVal Bereitstellungsdatum)
If Me.Bereitstellungsdatum = "01.02.2000" Then
Me.Undo
End If
Bei Deinem Code habe ich immer noch nicht verstanden, wie ich mich auf ein bestimmtes Datum beziehen kann.
Seh da echt nicht durch.
Sorry.
Rene
Hallo Rene,
Gut, dann noch mal im Ganzen, und noch mal korrigiert (ich D***).
Unter der Voraussetzung, dass "Bereitstellungsdatum" das Feld im
Formular ist, dass geprüft wird.
Private Sub Bereitstellungsdatum_BeforeUpdate()
If IstFeiertag(Me.Bereitstellungsdatum) = True Then
Cancel = True
Me.Bereitstellungsdatum.Undo
End If
End Sub
Public Function IstFeiertag(ByVal BDatum As Date) As Boolean
'der Rückgabewert ist hier erstmal False
.
.
If BDatum = DateSerial(lngJahr, 1, 1) Then
MsgBox "Neujahr ist ein Feiertag, bitte Datum ändern"
IstFeiertag = True
'hier wird der Wert für den Cancel-Parameter beim BeforeUpdate zurück gegeben
'ist das Datum kein Feiertag passiert hier weiter nichts, und es wird autom. False zurück gegeben
Exit Function
End If
.
.
End Function
Ich hoffe, dass du es jetzt verstehen kannst. Bei Fragen, tu es.
gruss ekkehard
Guten Morgen,
glaube wir reden aneinander vorbei. Es geht mir nicht um die Nichtfeiertage, denn daß ist klar. Es geht mir um bestimmte Feiertage, in welchen ich die Undo-Funktion nutzen möchte. Z.B möchte ich diese für den 06.01. nutzen, da wir hier nicht arbeiten, also keine Datumsänderung stattfinden darf. Am 24.12. aber arbeiten wir, d.h. hier darf das Datum geändert werden. Ich muss also in den Feiertagen gewisse Unterschiede bei der Bewertung machen und exakt das ist mein Problem.
Wie bereits beschrieben, habe ich eine Lösung gefunden, aber die ist halt nicht sehr elegant.
Vieleicht fällt jemanden noch etwas ein, ansonsten lass ich es erstmal so laufen.
Danke
Rene
Hallo,
In #3 hatte ich eine Kalendertabelle vorgeschlagen, hast Du mal darüber nachgedacht?
Das würde Dein Problem lösen, vollautomatisch und ohne Programmierung.
Hallo MzKIMu,
ja das hatte ich gesehen, aber ich hoffte es anders lösen zu können. Wie bereits geschrieben habe ich ja eine Lösung, wenn auch nicht optimal.
Ich hoffe es gibt vieleicht noch einen Vorschlag.
Danke trotzdem
Rene
Hallo,
Du wirst keinen besseren Vorschlag finden, als die Kalendertabelle. Eine Kalendertabelle ist auch keine Idee von mir, das ist in einer Datenbank Gang und Gäbe. Es ist mit ziemlicher Sicherheit auch die schnellste Methode und mit dem wenigsten Aufwand.
Was stört Dich an einer solchen Kalendertabelle ?
Das ist eine einmalige Sache und 20 Jahre sind gerade mal ca. 7.300 Datensätze, das sind Kinkerlitzchen für Access.
Hallo Rene,
Abgesehen davon, dass du dich vielleicht mit Klaus' Vorschlag
auseinander setzen solltest,
glaube wir reden aneinander vorbeiIch glaube nicht, du vielleicht, denn
ZitatEs geht mir um bestimmte Feiertage
diese legst du doch fest in der Funktion (erweitertes Beispiel)
.
.
If BDatum = DateSerial(lngJahr, 1, 1) _
Or BDatum = DateSerial(lngJahr, 1, 6) _
'usw _
Then
MsgBox "Das eingegebene Datum ist ein Feiertag, bitte Datum ändern"
IstFeiertag = True
.
.gruss ekkehard
P.S. Nachteil einer solchen Funktion gegenüber einer Kalendertabelle, - Ostern und andere variable Feiertage.
Hallo an Alle
danke für Eure Hilfe. Ich lasse es erstmal wie es ist. Wie gesagt funktioniert ohne Probleme. Übrigens beinhaltet meine Funktion wirklich alle Feiertage, auch die Beweglichen. Also grundsätzlich bin ich zufrieden.
Behalte Eure Vorschläge im Speicher, vieleicht werde ich irgendwann nochmal was ändern.
Viele liebe Grüsse
Rene
So als Gedanken:
Feiertage muss man nicht in einer Funktion mit jedem Aufruf neu berechnen, man kann sie auch einmalig berechnen und in einer Tabelle hinterlegen, so dass man statt Berechnen in der Tabelle nachschlägt. Papierkalender an der Wand oder auf dem Tisch beweisen, dass solche fixierten Berechnungen sehr wohl brauchbar sind. Eine solche Feiertagtstabelle ist für sich auch nicht so umfangreich wie eine Kalendertabelle. Das Nachschlagen (DLookup, DCount) darin wird kaum länger dauern als die Neuberechnung per Funktion bei einem Wert (bei Einzelwert unspürbar). Bei Massendatenaktionen dürfte die Tabelle dann ihre Vorteile ausspielen.
Zitataber ich will nur auf bestimmte Feiertage reagieren
Über zusätzliche Auswahlspalten in der Feiertagstabelle bzw. per richtiger Datenmodellierung (m:n-Beziehung zu einer Falltabelle) könntest Du verschiedene Fälle (alle, bestimmte jene, bestimmte andere) verwalten und beim Nachschlagen unmittelbar berücksichtigen.
Daneben könnte man berücksichtigen, dass Regionen/Bundesländer unterschiedliche Feiertage haben.
Eine Feiertagstabelle ließe sich dann auch über eine Abfrage verknüpfen mit einer Kalendertabelle für weitere Anforderungen.