Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Feiertagsfunktion

Begonnen von ReneB, April 30, 2019, 10:40:01

⏪ vorheriges - nächstes ⏩

ReneB

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

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ReneB

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

MzKlMu

Hallo,
erstelle eine Kalendertabelle die alle Tage (z. B. von 10 Jahren) enthält, in der die relevanten Feiertage angehakt werden
Gruß Klaus

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ReneB

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

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ReneB

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

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ReneB

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


MzKlMu

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.
Gruß Klaus

ReneB

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

MzKlMu

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.
Gruß Klaus

Beaker s.a.

Hallo Rene,
Abgesehen davon, dass du dich vielleicht mit Klaus' Vorschlag
auseinander setzen solltest,
glaube wir reden aneinander vorbei
Ich 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.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ReneB

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