unendliche Termin-Wiederholung?

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
Zauberweib
User
Beiträge: 13
Registriert: Montag 2. Januar 2023, 12:17
Wohnort: Franken
Kontaktdaten:

Ich hab mir als Lernprojekt ein Terminkalender-Programm ausgesucht, da sowas zum Einen nützlich ist und sich zum anderen immer wieder erweitern/verbessern lässt - ich also lange Freude am Lernen damit haben kann :-)

Sogar wiederkehrende Termine habe ich inzwischen eingebaut (ganz simpel gestrickt, vorerst). Die Frage, die dabei bei mir auftaucht: Wie wird das von Profiprogrammen realisiert?? Bei mir hab ichs halt gelöst mit x Wiederholungen. Bei Thunderbird bin ich mal spaßeshalber zwanzig Jahre in die Zukunft gegangen und alle bis dahin eingepflegten (wiederkehrende) Termine sind da.

Wie machen die das? Ich kann mir nicht vorstellen, dass die Termine bis zum Jahr 9999 tatsächlich in der zugrundeliegenden Datenbank festgschrieben sind, oder? Das es mehr ein "tät mich mal intressieren" als ein echtes Problem ist, hab ich die Frage mal bei Offtopic gestellt.

Weiß das wer?
Ambitionierte Anfängerin, die sich bei jedem Erfolgserlebnis ein Loch in Bauch freut :)
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das kommt durchaus vor, dass man das so macht. Also, die Termine in die DB zu schreiben. Denn das hat Vorteile bei der Beantwortung der Frage "Welche Termine habe ich in folgendem Zeitraum", weil die dann eine reine DB-Abfrage sind. Auch bei so Dingen wie individueller Termin-Absage hilft das, weil man dann einen Termin canceln kann. Natuerlich wird gleichzeitig ein rekurrierendes Termin-Objekt verwaltet, so das man auch neue Termine generieren kann, bzw. die ganze Serie canceln.

Und das geht auch gerne einher mit einem maximalen Datum, bis zu dem das moeglich ist. ZB 3 Monate habe ich schon erlebt.

Prinzipiell kann man das auch anders machen, und bei jeder Abfrage immer alle gerade aktiven Termin-Objekte durchrechnen. Bei ueblichen Terminanzahlen ist das an sich auch keine grosse Sache, aber ploetzlich hat man es weit schwerer, darueber dann wieder Verknuepfungen fahren zu lassen.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1016
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Vielleicht so:

Code: Alles auswählen

from __future__ import annotations
from datetime import date as Date


class DayEvent:
    def __init__(self, since: Date, until: Date | None = None):
        self.since = since
        self.until = until

    def __bool__(self) -> bool:
        return self.valid(Date.today())

    def valid(self, today: Date) -> bool:
        # wenn self.until None ist, ergibt die Prüfung False
        # und today > self.until wird nicht verglichen
        if today < self.since or self.until and today > self.until:
            return False

        return today == self.since.replace(year=today.year)


ev1 = DayEvent(Date.today())
ev2 = DayEvent(Date(2025, 1, 1))
ev3 = DayEvent(Date(2023, 1, 25), Date(2025, 1, 25))

if ev1:
    print("Ereignis 1")

if ev2:
    print("Ereignis 2")

if ev3:
    print("Ereignis 3")
Wenn es kein Ende gibt, dann einen Platzhalter dafür setzen. Ich verwende z.B. None.
Bei None wird dann nicht verglichen, ob das aktuelle Datum größer als das Enddatum ist.
Würde auch nicht funktionieren, da man None nicht mit einem Datum vergleichen kann (TypeError).

Wie du das organisierst, hängt von deinem Code ab.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Zauberweib
User
Beiträge: 13
Registriert: Montag 2. Januar 2023, 12:17
Wohnort: Franken
Kontaktdaten:

Hm, DeadEye, ich glaub, da haben wir uns falsch verstanden, mir gings nicht um einen Termin von...bis, sondern welche, die z.B. jeden ersten Mittwoch des Monats, oder alle sechs Wochen, etc. stattfinden. In Thunderbird hab ich z.B. mal nachgeguggt, da sind diese Termine auch in zehn Jahren bereits gesetzt. Und das ist jetzt eine reine Neugierfrage: Wie machen die das? Steht da wirklich in der Datei/Datenbank, dass von jetzt an jeden ersten Mittwoch im Monat der Termin xy stattfindet - und das auch noch im Jahr 9999 - was aber doch die Datenbank ewig aufblähen würde. Also: Wie machen die das? _Das_ war die Frage.

Trotzdem vielen Dank fürs Kopfzerbrechen :-)
Ambitionierte Anfängerin, die sich bei jedem Erfolgserlebnis ein Loch in Bauch freut :)
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Es wird wohl auf die Fähigkeiten der Software ankommen. So lässt sich die Frage, wie viele wiederkehrende Termine schon stattgefunden haben und wie viele noch anstehen, grundsätzlich durch Berechnung beantworten. Auch für das Anzeigen im Kalender können "auf Zuruf" die nötigen Termine erzeugt werden. Die Voraussetzung, dass bei direkten SQL-Abfragen (z. B. durch externe Tools) auch "echte" Einträge bei wiederkehrenden Terminen generiert werden, muss ja nicht zwingend gegeben sein.
Benutzeravatar
grubenfox
User
Beiträge: 422
Registriert: Freitag 2. Dezember 2022, 15:49

und hier noch die Zusatzfrage mit der das ganze noch interessanter wird: der Termin ""alle sechs wochen"... im Monat xy muss ich den leider auf Dienstag verschieben und im Dezember fällt er aus, da kann er geloscht werden... Wenn man so einen wiederkehrenden Termin bearbeiten möchte wird man ja gefragt ob man die ganze Serie bearbeiten möchte oder nur den einzelnen Termin.

Diese Frage "wie machen die das" stelle ich mir auch schon seit einigen Jahren.

Wobei mir eben der Gedanke zu verschobenen Termin der Gedanke kam, dass das eigentliche Datumsfeld beim verschieben nicht verändert wird, es intern aber noch ein Feld "Offset" gibt in dem die Verschiebung gespeichert wird. Und das Feld ist jetzt gedanklich in ein Dictionary wandert: für die Termine, die sich schön an die Vorgaben der Serie halten, steht nichts im Dict., die können einfach berechnet werden. Aber mit eventuellen einzelnen Abweichungen vom Standard füllt sich dann ein Dict.

Neben den wiederkehrenden Terminen gibt es ja auch noch wiederkehrende Aufgaben. Bei denen kann man noch ganz individuell einen Haken bei "ist fertig" oder "ist zu 63% erledigt" setzen. Spätestens hier hat man dann einige Wiederkehrer die sich vom Rest der Gruppe unterscheiden...
Benutzeravatar
DeaD_EyE
User
Beiträge: 1016
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Zauberweib hat geschrieben: Donnerstag 26. Januar 2023, 18:02 Und das ist jetzt eine reine Neugierfrage: Wie machen die das? Steht da wirklich in der Datei/Datenbank, dass von jetzt an jeden ersten Mittwoch im Monat der Termin xy stattfindet - und das auch noch im Jahr 9999 - was aber doch die Datenbank ewig aufblähen würde. Also: Wie machen die das? _Das_ war die Frage.
Da ist nicht so einfach, da sich jeder alles Mögliche ausdenken könnte.
Das Beispiel zeigt eine mögliche Implementierung nur für ganztägige Ereignisse, die sich jährlich am selben Tag wiederholen.
Das Ende wird von until vorgegeben. Wenn es kein Ende gibt, müsste man bis zum Jahr 9999 warten, damit es zu einem Fehler kommt.

Für sich wiederholende Ereignisse werden die Zeitpunkte nicht im Voraus berechnet und gespeichert, sondern mit Regeln wird vorgegeben, wie ob beim aktuellen Datum das Ereignis vorkommt.
Schau dir das mal an: https://github.com/dbader/schedule

Damit könntest du jetzt schon Scheduler bauen, ohne alle Interna der Bibliothek zu kennen.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

Ich habe so etwas in der einmal umgesetzt. Dabei wurden Terminsequenzen immer errechnet und einmalige Termine unabhängig gespeichert.

Ich brauche alle Termine für 28.01.2023 0 Uhr - 28.01.2023 24 Uhr:
- Suche alle Termine aus den Sequenzen (errechnet)
- Suche alle Einzeltermine für den Zeitraum
- Ist ein Einzeltermin ein Verschiebetermin für eine Serquenz, ignoriere den Termin aus der Sequenz.

Termin aus Sequenz veschieben:
- An der entsprechenden Stelle wird ein "Verschiebetermin" gesetzt, damit der Eintrag der Sequenz ignoriert wird.
- Der verschobene Termin wird als EInzeltermin angelegt.

Vergangene Termine werden mit dem Vergehen des Zeitraums zu einem Einzeltermin, falls sie noch keiner sind.

Funktionierte damals ganz gut. Wird dann im Detail ein bisschen fummelig, wenn man z.B. die Terminsequenz hinterher anpasst.
Zauberweib
User
Beiträge: 13
Registriert: Montag 2. Januar 2023, 12:17
Wohnort: Franken
Kontaktdaten:

Ich bin heute über einen Screenshot des qt-calendar-widgets gestoßen, da war die "Anzeige von-bis" mit 1900-3000 vorbelegt. (Andere Auswahl wohl möglich). Das wäre auf jeden Fall schon mal deutlich weniger als 9999 aber halt auch noch jede Menge. Andererseits... wenn ich mir so überlege, wie behäbig und aufgebläht mein dienstliches Outlook sich zumeist benimmt... who knows... ;-)

Für mein kleines privates Terminkalender-Projekt hab ich einen Zeitraum von ca. einem Jahr vorgegeben, wobei beim letzten Termin eine zusätzliche Warnung ausgegeben wird und ich dann den Termin - so er noch aktuell ist und so beibehalten werden soll - halt einfach neu eintrage. Für mich momentan absolut praktikabel - was nicht bedeutet, dass ich irgendwann hierfür nicht ne Lösung für Fortgeschrittene finden werde ;-)

Das mit den einmaligen Änderungen stell ich mir noch relativ einfach vor - vorausgesetzt, dass alle Termine vorab tatsächlich festgeschrieben wurden. Dann soll das Programm den bestimmten Termin raussuchen und a durch b ersetzen. Mal völlig vereinfacht gesagt. Schwieriger gestaltet sich da mE die Änderung der kompletten Serie. Da wärs eher sinnvoll zu sagen "Such mir alle Einträge mit dem Ereignis xy raus und zwar ab Datum soundso". Diese werden dann alle gelöscht und das Ereignis xy mit neuem Datum/Reihe neu eingetragen. Mal so als Ablauf-Idee. Dass die Umsetzung des Programms in der Praxis vermutlich nicht ganz so "einfach" ist, ist auch klar. Naja, mir zumindest ;-) Aber genau das ist ja das Spannende an der Sache. Wenns dann irgendwann tatsächlich so funktioniert, wie man sich das vorgestellt hat ;-)

@DeaD_EyE Danke für den schedule-Link - das sieht ja genial aus... glaub, da will ich ein bisschen rumexperimentieren. Vielen Dank!
Ambitionierte Anfängerin, die sich bei jedem Erfolgserlebnis ein Loch in Bauch freut :)
Antworten