ToDo-List mit wiederkehrenden Terminen

PetraSteiner

Fleissiger Benutzer
Beiträge
60
Hallo,
ich sollte als Projektarbeit einen ToDo-Liste programmieren.
Es gibt nur reine Aufgaben ohne Unteraufgaben. Ich brauche 3 Arten von Aufgaben: Mit Fälligkeitsdatum, Ohne und wiederkehrende Termine. (Täglich, wöchentlich, monatlich, quartal usw.).
Aktuell habe ich an folgende Tabelle gedacht:
Tasks:
ID, UserID, Name, Beschreibung, Fälligkeitsdatum, Erledigt (Status), erstellt (Am Datum)

Die ID als Primärschlüssel. Die UserID ist für Indifikation des Users (Das jeder seine Daten erhält)
Name und Beschreibung für die Aufgabe. Beim Fälligkeitsdatum kommt das Datum rein oder es ist leer. Erledigt ist als Status für die Aufgabe (true = erledigt). Das Erstelldatum nur als Hinweis, wann der Datensatz erstellt wurde.
Jetzt ist die Frage wie ich das mit den wiederkehrenden Terminen mach.
Mein Ansatz wäre eine zweite Tabelle und dann eine Referenz auf die Tasks.
Beispiel:
Wiederholungen: (TaskID, Fälligkeitstag, Rhythmus)
Oder wäre das ein falscher Ansatz?

Viele Grüße
Petra
 
Werbung:
Dürfen einzelne wiederkehrende Termine verschoben werden?
Wenn nein, dann kann man dies ja in der Haupttabelle mit aufnehmen.
Wenn ja, dann hilft die die Wiederholungstabelle so nicht.

Zu dem Status. Wieso nur Erledigt und nicht ein Status (Neu, In Bearbeitung, Erledigt, Zurückgestellt,...)?
 
Zu der Frage nach der Berechnung der wiederkehrenden Termine, hier eine Idee, natürlich mit PostgreSQL, INTERVAL-Datentyp, LATERAL JOIN und generate_series():

Code:
test=# create table todo (id int generated always as identity primary key, person int, datum date, wiederholung interval);
CREATE TABLE
test=*# insert into todo (person, datum, wiederholung) values (1, '2021-02-01',NULL);
INSERT 0 1
test=*# insert into todo (person, datum, wiederholung) values (1, '2021-02-01','1 week');
INSERT 0 1
test=*# insert into todo (person, datum, wiederholung) values (1, '2021-03-01','1 month');
INSERT 0 1
test=*# insert into todo (person, datum, wiederholung) values (2, '2021-02-01','3 month');
INSERT 0 1
test=*# select * from todo;
 id | person |   datum    | wiederholung
----+--------+------------+--------------
  1 |      1 | 2021-02-01 |
  2 |      1 | 2021-02-01 | 7 days
  3 |      1 | 2021-03-01 | 1 mon
  4 |      2 | 2021-02-01 | 3 mons
(4 rows)
test=*# select todo.*, x.s::date as next_date from todo left join lateral (select * from generate_Series(todo.datum, todo.datum + (10 * todo.wiederholung), todo.wiederholung) s) x on (true);
 id | person |   datum    | wiederholung | next_date  
----+--------+------------+--------------+------------
  1 |      1 | 2021-02-01 |              |
  2 |      1 | 2021-02-01 | 7 days       | 2021-02-01
  2 |      1 | 2021-02-01 | 7 days       | 2021-02-08
  2 |      1 | 2021-02-01 | 7 days       | 2021-02-15
  2 |      1 | 2021-02-01 | 7 days       | 2021-02-22
  2 |      1 | 2021-02-01 | 7 days       | 2021-03-01
  2 |      1 | 2021-02-01 | 7 days       | 2021-03-08
  2 |      1 | 2021-02-01 | 7 days       | 2021-03-15
  2 |      1 | 2021-02-01 | 7 days       | 2021-03-22
  2 |      1 | 2021-02-01 | 7 days       | 2021-03-29
  2 |      1 | 2021-02-01 | 7 days       | 2021-04-05
  2 |      1 | 2021-02-01 | 7 days       | 2021-04-12
  3 |      1 | 2021-03-01 | 1 mon        | 2021-03-01
  3 |      1 | 2021-03-01 | 1 mon        | 2021-04-01
  3 |      1 | 2021-03-01 | 1 mon        | 2021-05-01
  3 |      1 | 2021-03-01 | 1 mon        | 2021-06-01
  3 |      1 | 2021-03-01 | 1 mon        | 2021-07-01
  3 |      1 | 2021-03-01 | 1 mon        | 2021-08-01
  3 |      1 | 2021-03-01 | 1 mon        | 2021-09-01
  3 |      1 | 2021-03-01 | 1 mon        | 2021-10-01
  3 |      1 | 2021-03-01 | 1 mon        | 2021-11-01
  3 |      1 | 2021-03-01 | 1 mon        | 2021-12-01
  3 |      1 | 2021-03-01 | 1 mon        | 2022-01-01
  4 |      2 | 2021-02-01 | 3 mons       | 2021-02-01
  4 |      2 | 2021-02-01 | 3 mons       | 2021-05-01
  4 |      2 | 2021-02-01 | 3 mons       | 2021-08-01
  4 |      2 | 2021-02-01 | 3 mons       | 2021-11-01
  4 |      2 | 2021-02-01 | 3 mons       | 2022-02-01
  4 |      2 | 2021-02-01 | 3 mons       | 2022-05-01
  4 |      2 | 2021-02-01 | 3 mons       | 2022-08-01
  4 |      2 | 2021-02-01 | 3 mons       | 2022-11-01
  4 |      2 | 2021-02-01 | 3 mons       | 2023-02-01
  4 |      2 | 2021-02-01 | 3 mons       | 2023-05-01
  4 |      2 | 2021-02-01 | 3 mons       | 2023-08-01
(34 rows)

test=*#

Das erzeugt, ausgehend von dem Starttermin in Deiner Tabelle und der da hinterlegten Wiederholung (in Interval-Angabe) und Nutzung eines LATERAL JOINs mit generate_series() die nächsten 10 Termine.

Schwachpunkt ist, daß es nur die nächsten 10 Termine basierend von dem hinterlegten Startdatum erzeugt, hier kann es auch passieren, daß dieses Startdatum und die erzeugten Termine allesamt in der Vergangenheut sind. Das müßte man in die Berechnung der Werte für generate_series() noch mait aufnehmen. So quasi als Übungsaufgabe ...
 
Wenn ein wiederholender Termin nicht "für immer" ist, sondern mit definiertem Endpunkt, werden alle Termine einfach angelegt oder? Z.B. wie schon gezeigt oder anders.
Und für den Sonderfall "für immer", der nicht nur ein separates Handling benötigt, sondern auch als Prinzip fragwürdig ist, kann man vielleicht einfach auf eine Implementierung verzichten.
Was das Modell angeht, würde ich dann noch überlegen, ob ich systematische Informationen über Serientermine, ihre Erzeugungsparameter, Ausnahmen etc benötige. In der Praxis würde das zu einer komfortableren Handhabung von Serienterminen führen, "alle verschieben", "alle löschen", "Sie verändern einen Serientermin, sollen alle...", "Dies ist der letzte Termin in der Serie xy" usw.
 
Herzlichen Dank für die Antworten!

Ich brauche keinen Zwischenstatus. Es gibt nur Aufgaben, die entweder offen oder erledigt ist.
Allerdings sollten Termine verschoben werden können.

Mit Terminen, die sich wiederholen tappe ich allerdings noch mehr als vorher im Dunkeln.
Wenn ich das jetzt alles lese und interpretiere, nehme ich folgendes mit:
a) Ich lasse mir mit der vorgeschlagenen Lösung :))) Termine generieren
b) Ich generiere mir per Software immer den nächsten Termin. Also wenn ein Termin erledigt wird, wird der nächste Termin in die DB eingetragen.

Ohne Erfahrung ist es irgendwie nicht einfach.
Im Netz findet man auch nicht schnell mal Infos zu dem Thema.
 
Ich habe mal irgendwo sowas programmiert, aber wie ich Wiederholungen gemacht habe, weiß ich nicht mehr, wahrscheinlich ähnlich wie oben.
a) wäre also ok
b) wäre im Widerspruch zu a)
b) wäre außerdem ein Handhabungsproblem, denn wenn ich in einen Kalender schaue, erwarte ich, dass dort alle Termine stehen, nicht nur die nächsten und dann muss ich warten, bis etwas geschieht und dann wieder reinsehen, .. das ist Krampf

Also warum nicht den User entscheiden lassen. 10 Termine anlegen ,15, 20, 7, je Tag, Woche, Monat, Jahr, usw. was es da alles gibt? Die "Arbeit" macht ja dann die PG Proc oder nur das Select-Insert-Statement.
 
Ich würde erstmals die Anforderungen definieren!

Wie schon geschrieben. Müssen sich einzelne Termine, bei einer Serie, verschieben lassen?
D.h. 1x die Woche Montag, außer am 11.01. wird es am Dienstag statt Montag sein.
Das wird dann komplizierter.

Wenn dies nicht notwendig ist, reicht eine einfache Tabelle aus.

Außerdem sollte man sich überlegen ein End-Datum bei Serien Terminen einzuführen.
 
Danke für die Unterstützung.
Ich denke, dass einzelne Termine aus einer Serie verschoben werden sollen, schließe ich aus.
Wenn ich eine Tabelle für die Wiederholungen hätte, wie müsste die ungefähr aussehen?
Aktuell sehe ich die Problematik, dass ich bei Serien das Probleme mit dem Ende habe. Ich muss ja zum einen einen Termin auf erledigt setzen und
auch in der Lage sein, die Serie zu beenden. Muss ich evtl. die Logik zwischen Einzelterminen und Serienterminen in verschiedenen Tabellen abbilden?
Oder reicht die geplante Tabelle + Zusatztabelle mit den Serienterminen?

Viele Grüße
Petra?
 
Bedeutet eine Serie aus Deiner Perspektive, dass diese Serie nie aufhört? Und ist das so gefordert?
Meine beruflichen Serientermine gelten maximal für ein Jahr, sind sie wöchentlich, dann also max 56 Stück. Privat habe ich keine Serientermien außer Geburtstage. Ich nehme dann immer an, die Leute werden 100 und wähle entsprechend die Serienwiederholung.

zur Klarheit
- entweder es ist eine endliche Serie mit einer festen Anzahl von Terminen
Die werden dann zur Erstellung alle eingetragen. Fertig. Keine Zusatztabellen.
- oder es ist eine unendliche Serie, das ist komplexer und variantenreich.
Wenn es nicht sein muss, erlaubt man keine unendlichen Serien.

Für endliche Serien kannst Du ein weiteres ID Feld * verwenden, das alle Termine einer Serie markiert. Bei der Erzeugung kannst Du auch ein "Letzter Der Serie" Flag setzen, wenn unbedingt nötig, um dann irgendwas besonderes auslösen zu können. Z.B. eine Fortschreibung der Serie.

* Dieses Feld kannst Du natürlich zu einer eigenen Tabelle mit PK ausbauen, wenn die Serie selbst irgendwelche Infos in sich trägt, wie bspw. eine formale oder umgangssprachliche Beschreibung ihres Seriencharakters oder den konkreten Befehl, mit dem sie erzeugt wurde, um die Serie einfach fortschreibbar zu machen.
 
Ich denke, dass einzelne Termine aus einer Serie verschoben werden sollen, schließe ich aus.
Wenn ich eine Tabelle für die Wiederholungen hätte, wie müsste die ungefähr aussehen?

Wie kommst du auf eine weitere Tabelle?
Wenn keine einzelnen Termine verschoben werden müssen kannst du es einfach machen.
Termin, Start, Ende, Wiederholung
Bei einem einzelnen Termin trägst du nur den Start ein, ohne Fälligkeitsdatum nichts und bei einer Wiedewrholung Start, Ende und Wiederholung.
Da hast du alle Informationen für die Termine. Entweder du gibst via Select alle Termine der Serie aus oder in der Applikation, berechnet aus Start, Ende und Wiederholung.

EDIT: Wegen dem Ende:
Evtl. wäre zu überlegen als End-Datum den 31.12.9999 zu nutzen, wenn das End-Datum frei bleibt.
 
Eine berechnete Wiederholung würde ich nicht ohne Not machen. Das bedeutet doch, dass bei jeder Anzeige alles durchgeorgelt werden muss. Einfach die gewünschte Serie von Terminen explizit anlegen.
 
Mit dem Problem der "unendlichen" Aufgaben und wenn z.B. die ganze Serie verschoben werden muss. Z.b. statt jedem Montag jeden Dienstag.
Wieso sollte ich 10 Termine statt einem Termin speichern, wenn ich alle Termine aus dem einen ableiten kann?
 
Wieso sollte ich 10 Termine statt einem Termin speichern, wenn ich alle Termine aus dem einen ableiten kann?
Weil es im Zweifel eine große Rechenaufgabe ist, für einen anvisierten Tag x zu bestimmen, welche Termine dort schon alle vorliegen. Und weil das bischen Speicherplatz für die anderen 9 Termine das nicht wert ist.
 
Ich habe jetzt folgenden Stand:

Code:
CREATE TABLE "tasks" (
    "id" serial,
    "userid" character varying(100),
    "name" character varying(255) NOT NULL,
    "description" character varying(255),
    "schedule_date" timestamp,
    "end_date" timestamp,
    "repeat_type" integer DEFAULT '0',
    "prio" integer DEFAULT '3',
    "completed" boolean DEFAULT false,
    "taskID" integer,
    "updated_at" timestamp NOT NULL,
    "created_at" timestamp NOT NULL
);

Damit sollte ich folgendes bewerkstelligen können:
- Es können Todos ohne Datum eingebenen werden. Priorisierung ist möglich.
- Es ist möglich wiederholende Termine (tag, woche, monat, quartal) einzugeben. Mit Enddatum oder auch ohne.
Per Software werden dann die wiederholende Termine eingetragen. (Die TaskID dient als Referenz zur ID).
Ich könnte damit eigentlich auch einzelne Termine oder Serien ändern. (Z.B. von Dienstag auf Mittwoch)
(Halt per Software von außen).
Oder sieht noch jemand einen Fallstrick?

Gruß
Petra.
 
Werbung:
Zurück
Oben