Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: ReneB am April 30, 2019, 10:40:01

Titel: Feiertagsfunktion
Beitrag von: ReneB am April 30, 2019, 10:40:01
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
Titel: Re: Feiertagsfunktion
Beitrag von: Beaker s.a. am April 30, 2019, 19:25:19
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
Titel: Re: Feiertagsfunktion
Beitrag von: ReneB am Mai 08, 2019, 12:09:49
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
Titel: Re: Feiertagsfunktion
Beitrag von: MzKlMu am Mai 08, 2019, 12:24:50
Hallo,
erstelle eine Kalendertabelle die alle Tage (z. B. von 10 Jahren) enthält, in der die relevanten Feiertage angehakt werden
Titel: Re: Feiertagsfunktion
Beitrag von: Beaker s.a. am Mai 08, 2019, 18:11:12
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
Titel: Re: Feiertagsfunktion
Beitrag von: ReneB am Mai 09, 2019, 07:33:54
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
Titel: Re: Feiertagsfunktion
Beitrag von: Beaker s.a. am Mai 09, 2019, 16:34:28
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
Titel: Re: Feiertagsfunktion
Beitrag von: ReneB am Mai 10, 2019, 06:49:48
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
Titel: Re: Feiertagsfunktion
Beitrag von: Beaker s.a. am Mai 10, 2019, 20:49:51
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
Titel: Re: Feiertagsfunktion
Beitrag von: ReneB am Mai 13, 2019, 07:52:47
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

Titel: Re: Feiertagsfunktion
Beitrag von: MzKlMu am Mai 13, 2019, 09:34:33
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.
Titel: Re: Feiertagsfunktion
Beitrag von: ReneB am Mai 13, 2019, 10:07:23
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
Titel: Re: Feiertagsfunktion
Beitrag von: MzKlMu am Mai 13, 2019, 11:02:21
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.
Titel: Re: Feiertagsfunktion
Beitrag von: Beaker s.a. am Mai 13, 2019, 15:46:51
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.
Titel: Re: Feiertagsfunktion
Beitrag von: ReneB am Mai 16, 2019, 11:03:55
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
Titel: Re: Feiertagsfunktion
Beitrag von: ebs17 am Mai 16, 2019, 12:14:07
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.