Zuviel Magie?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

ich stehe gerade vor folgender Entscheidung: Wenn ich z. B. alle Termine dieser Woche filtere, erstelle ich eine expression (ist das richtig ausgedrückt?) der entsprechenden 7 Tage und erhalte als Ergebnis eine Liste der passenden Termine. Dazu wird eine Methode `is_datetime` der Terminklasse abgefragt. Soweit, so gut. Nun benötige ich aber noch zu jedem Termin Informationen darüber, ob das jeweilige Trefferdatum das Datum des Termins selbst oder eine Wiederholung ist und auch die Position dieses Datums innerhalb der Termindauer des Termins oder der Wiederholung.
Wenn ich also z. B. einen sich täglich wiederholenden Termin vom 14. - 16. Oktober habe (blödes Beispiel das veranschaulichen soll, dass es Daten gibt, an denen Termin und Wiederholung(en) zusammentreffen können) und den 15. Oktober abfrage, dann steht erstmal dieser Termin via `is_datetime` in der Ergebnisliste. Danach muss ich noch eine Methode `get_scopes` bemühen, die mir dann die Information liefert, dass sich am 15. Oktober einmal der Termin selbst 'between' (nicht 'start' oder 'end') und einmal die Wiederholung 'start' befindet. Auch bis hierher alles klar.

Um zu den Positionsangaben zu gelangen, fallen mir diese Lösungen ein:
  1. Sobald `is_datetime` einen Treffer ermittelt, werden im Termin-Exemplar die Positionsangaben hinterlegt. Diese Attribute gelten nur bis zu einem erneuten Aufruf von `is_datetime` und werden bei Programmende verworfen.
  2. Ich gestalte die Filterroutine insofern um, dass die Abfragemethode keinen `bool` sondern gleich die Positionsdaten zurückgibt.
  3. Auch wenn es mir aufstößt: Ich durchlaufe nochmals die 7 Tage und frage die Ergebnisliste nach den Positionsangaben ab, wobei aber nochmals die Daten abgefragt werden müssen, die zuvor von `is_datetime` mit `False` zurückgewiesen wurden. Ist doch blöd, irgendwie!
Ich favorisiere die 1. Lösung, weil ich auf Magie stehe... ;-) Die 2. erscheint mir unsauber, zudem es ja auch Abfragen gibt, die kein Datum enthalten und dann wiederum nur mit einem `bool` antworten können. Die 3. ist doch Quatsch!

Was meint ihr?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@mutetella: Also mir ist ja ein mehrtägiger täglicher Termin schon zu magisch. So etwas gibt es nicht. Das sprengt mein Vorstellungsvermögen. :-)
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo mutetella,

was soll denn 'is_datetime' sein? Ich verstehe darunter die Abfrage, ob ein Termin ein »datetime«-Objekt ist. Ein »is_at_date« beschreibt die Methode doch viel besser. Um Zeiträume abzufragen brauchst Du dann aber noch ein »is_after_date« und »is_before_date«. Für wiederholende Termine können alle drei Methoden »True« liefern, was logisch gesehen ja noch nicht unlogisch ist. Da es sich um ein Termin-Objekt handelt, kann man diesem noch eine Menge Informationen wie Vorgängertermin, Nachfolgetermin, usw. dazugeben.
Also wo ist jetzt Dein Problem? Was meinst Du aber jetzt mit Positionsangabe?

Zu Deinen Varianten: Du hast Dich immer noch nicht von Deiner seltsamen Einträge-Markier-Methode verabschiedet. Eine »is_...«-Methode fraget eine Eigenschaft des Objektes ab. Niemand erwartet und sollte sich auch darauf verlassen können, das eine reine Frage nichts am Zustand ändert. Sobald zwei Abfragen eineinander verschachtelt laufen (was bei komplizierteren Verknüpfungen durchaus sein kann), fällst Du mit Methode 1 auf die Nase. Filter-Routinen machen deshalb immer unabhängige Listen und ändern den Zustand ihrer Einträge nicht.
Methode 2 verstehe ich nicht, weil ich mit Positionsdaten nichts anfangen kann. Filtern heißt immer eine ja/nein-Entscheidung zu treffen, ob ein Eintrag in der Zielmenge enthalten ist oder nicht, alles andere als ein bool macht also keinen Sinn.
Methode 3: Warum sollte ich Einträge, die schon ausgefiltert sind nochmal abfragen?

Keine Deiner Methoden ist gut. Versuch nochmal das Problem zu beschreiben, das Du lösen willst und nicht wie Du es lösen willst. Es gibt sicher eine saubere Methode, die ich aber aufgrund von Verständnisproblemen im Moment nicht sehe.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@BlackJack: Ich könnte mir z. B. vorstellen, dass dieselbe 3-tägige Veranstaltung an 4 Tagen startet, sprich 4 Blöcke. Der eine würde dafür 4 Termineinträge machen, ein anderer macht dafür vielleicht lieber einen Termineintrag, der sich eben 4 mal täglich wiederholt.

@Sirius: Jeder Termin hat ein Anfangs- und Enddatum. Jede Wiederholung des Termins hat ebenfalls ein Anfangs- und Enddatum, jedoch versetzt um die Distanz des Wiederholungsintervals (täglich, vierteljährlich etc.). `is_datetime` liefert ein bool, ob sich ein Datum innerhalb einer dieser Zeitspannen befindet. Wenn ich nun die Termine einer Woche abfrage, erstelle ich eine Abfrage, die die 7 Tage dieser Woche enthält. Das Ergebnis ist dann eine Liste der Termine, deren `is_datetime` True geliefert hat. Das ist der momentane Stand der Dinge.

Mein Problem: Wenn ich nun diese Ergebnisliste zur Ausgabe bringen möchte, benötige ich dort ja nicht nur den Termin selbst, sondern auch Informationen darüber, ob sich am jeweiligen Tag nur der Termin oder eventuell auch eine seiner Wiederholungen befindet. Und diese Information möchte ich nicht innerhalb der Ausgabe abfragen, was dort auch nichts verloren hat. Zudem wurde der Tag, an dem die Ausgabe stattfindet, ja bereits durch `is_datetime` abgefragt.

mutetella

P.S.: Jetzt, da ich das Problem beschrieben habe, denke ich, dass ich eine Abfrage von Terminen zu einer Woche nicht zu einem Ausdruck zusammenfassen sollte, sondern schlicht eine Schleife `date in dates` durchlaufe. Darin könnte ich dann zum einen die Gültigkeit des Termins und, wenn diese gegeben ist, zum anderen die Informationen über sein Vorkommen an diesem `date` abfragen.
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@mutetella: dann ist die Lösung doch ganz einfach. Du hast eine Methode 'Event.is_between(start_date, end_date)' die zurückliefert ob irgendein Termin oder Wiederholung innerhalb dieses Zeitfensters stattfindet und eine Methode 'Event.get_actual_dates_between(start_date, end_date)' die alle Zeiten des Termins zurückliefert innerhalb des gegebenen Zeitfensters. Wenn diese Information erst zur Ausgabe gebraucht wird, dann wird sie auch dort erst abgefragt.
BlackJack

@mutetella: Das kann ich mir vorstellen, Deine Beschreibung klang für mich aber so als wenn jemand *einen* vier Tage langen Termin einträgt und den dann 3 mal wiederholt und zwar im Tagesabstand, so dass sich das überlappt. Vielleicht lag es einfach nur an der Uhrzeit zu der ich das gelesen hatte. :-)
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Sirius3: Vielleicht hab' ich da wirklich mal wieder versucht, alles möglichst kompakt zu machen. Dieselbe Schleife zweimal zu durchlaufen stößt mir einfach auf, ist aber in diesem Fall wohl wirklich einfacher, weil klarer...

@BlackJack: Ok, Du hast mich noch immer nicht verstanden... :) Beispiel: Vom 10. - 13. findet eine Veranstaltung statt. Nachdem sich unglaublich viele Leute dazu angemeldet haben :wink: , startet die gleiche Veranstaltung nochmals am 11. (dann also vom 11. - 14.) und am 12. (vom 12. - 15.). Wenn ich einen solchen Termin als 3tägigen Termin mit 2 täglichen Wiederholungen anlege und sagen wir den 13. abfrage, muss angezeigt werden:

Code: Alles auswählen

10. 11. 12. 13. 14. 15.
 x   x   x   x
     x   x   x   x
         x   x   x   x
             ^
             |___________ 1 x end appt, 2 x between recurrence
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@mutetella: Also dann habe ich Dich ursprünglich doch richtig nicht verstanden. :-D So etwas geht nicht. Jedenfalls nicht in meiner Welt. Das sind drei verschiedene viertägige Veranstaltungen. Wenn das jemand so „in sich selbst überlappend” einzutragen versucht wie Du, dann würde ich dem Benutzer das als Fehler um die Ohren hauen. Ganz praktisch gesehen müssen da doch auch Veranstaltungsnummer, Uhrzeit, und Raum in den Terminen vermerkt sein damit das Sinn macht, und mindestens eines von den dreien muss doch verschieden sein, so dass das gar nicht alles der selbe „Grundtermin” sein kann.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@BlackJack: Nun gut, das kann man durchaus so sehen. Jedenfalls sollte aber ein solch merkwürdiger Eintrag trotzdem so angezeigt werden, wie er nun mal merkwürdig angelegt wurde. Ob das Sinn macht muss in diesem Fall der Nutzer entscheiden. Auch auf die Gefahr hin, dass er sich damit Ärger mit Dir einhandelt... :)
Ich sehe jetzt auch keine sinnvolle Alternative dazu. Eine Fehlermeldung a la "So ein doofer Termin ist leider nicht möglich. Wenden Sie sich an einen Administrator Ihres Vertrauens!" ist IMHO übertrieben...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@mutetella: Deine Terminklasse wird durch Wiederholungen, Mehrfachtermine, sehr komplex und kann doch nicht die nötige Information, wie Ort, Teilnehmer, Kursleiter, usw. enthalten. Du mußt Dein Klassendesign dringend überarbeiten. Eine Kursangebot (Titel, Materialien, Kosten, ...) besteht aus Veranstaltungen (Kursleiter, Teilnehmer), die aus Terminen (Ort, Datum, Dauer) bestehen. Ein Termin geht also nicht über Tage und hat auch nicht mehrere Wiederholungen, ist also viel simpler und damit einfacher zu implementieren und zu testen.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Sirius3: Das mit dem Kurs war ja nur als Beispiel gedacht... Ich möchte ja keinen Veranstaltungsplaner machen, sondern wirklich nur einen Kalender. Somit benötigt meine Terminklasse lediglich Attribute wie title, owner etc. Wiederholungen handle ich in einer eigenen Klasse. Somit gestaltet sich das bisher schon recht übersichtlich. Oder habe hast Du etwas anderes gemeint?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@mutella: Ich verstehe deine Denke ebenfalls nicht. Wenn eine Veranstaltung sich regelmäßig wiederholt, dann ist das doch jeweils ein neuer Termin für sich.

Man kann sich ja von mir aus auch vorstellen, dass eine viertägige Veranstaltung (z.B. irgendein Kurs) jeweils mit dem Starttermin Montag, Dienstag und Mittwoch angeboten wird und somit an mehreren Tagen zeitgleich ein Termin für die gleiche Veranstaltung laufen wird (nur eben mit unterschiedlichem Fortschritt der Veranstaltung). Trotzdem bleiben es aber 3 einzelne Termine.

Wenn du das anders siehst, dann hast du IMHO eine etwas ungewöhnliche Vorstellung von dem, was man normalerweise unter "Termin" versteht.

Auch Wikipedia sagt (und damit muss es ja wohl stimmen *höhöhö*):
Ein Termin [...] ist ein festgelegter Zeitpunkt im allgemeinen Zeitverlauf und wird durch ein Kalenderdatum und eine Uhrzeit bezeichnet.
http://de.wikipedia.org/wiki/Termin

Es gibt also einen einmaligen Start- und Endzeitpunkt im Kalender. Also nix mit Wiederholungen.

Natürlich steht es dir frei, dein Programm nach deiner eigenen Interpretation zu gestalten. Wundere dich dann nur nicht, wenn deine Benutzer später ein wenig verwirrt davon sind. ;)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

mutetella hat geschrieben:Nun benötige ich aber noch zu jedem Termin Informationen darüber, ob das jeweilige Trefferdatum das Datum des Termins selbst oder eine Wiederholung ist und auch die Position dieses Datums innerhalb der Termindauer des Termins oder der Wiederholung.
Diesen Satz verstehe ich nicht. Ein Objekt vom Typ `Wiederholung` wird ja vermutlich ein Attribut mit seinen zugehörigen Terminen haben, richtig? Sorry wenn ich so blöd frage, aber was genau willst du anschließend überhaupt erreichen?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Kann es sein, dass du etwas willst, was in etwa dem folgenden Szenario entspricht:

Die VHS Buxtehude bietet ab dem 15.11.2013 viertägige Kurse zum Thema "Häkeln für Fortgeschrittene" an. Kurs 1 startet am 15.11., Kurs 2 am 16.11. und Kurs 3 am 17.11.2013. Alle Kurse gehen von 12-18 Uhr und finden jeweils in einen ihnen vorab zugeteilten Raum in der VHS statt, der für den jeweiligen Kurs immer der selbe bleibt. Nun möchte man für den Zeitraum 16.11. - 18.11.2013 wissen, welche Kurse dort rein fallen. Hiefür soll nun das weltbekannte Tool vom Python-Progammierer mutella benutzt werden. Leider hat der Programmautor aber noch keine Ahnung, wie er diese Funktionalität in sein Tool einbauen soll...
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ich hätte niemals gedacht, dass ich mal im Python-Forum von der VHS Buxtehude lesen werde :D (Ich habe mal nicht weit von Buxtehude gewohnt) Leider wird kein Häkelkurs angeboten: http://www.vhs-buxtehude.de/cms/index.p ... t=h%E4keln :(

Ich finde übrigens auch, dass du zu kompliziert denkst. Wenn ein Termin über mehrere Tage geht, dann dauert er entweder jeweils den ganzen Tag an oder befindet sich jeweils in einem bestimmten Zeitrahmen. Ist ersteres der Fall, musst du nur Start- und Enddatum speichern. Ist letzteres der Fall, musst du eben X Termine speichern (wobei X der Anzahl an Tagen entspricht), die alle den gleichen Start- und Endtermin haben. Dass solche Art von Terminen leicht zu erstellen und verwalten sind, ist Aufgabe des User Interfaces.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Ich weiß gar nicht, warum denn jetzt alle auf mir herumreiten... :roll: Schlimm genug, dass das Essen hier auf der PyCon so miserabel ist... :shock:

Ich bin ja inzwischen vollkommen Eurer Meinung, in welcher Form zum Beispiel (und wirklich nur als Beispiel ohne Gewähr einer sich im realen Leben widerspiegelnden Sinnhaftigkeit) eine mehrtägige sich wiederholende Veranstaltung eingegeben werden sollte: Ein Termin, dann nochmals ein Termin, und vielleicht nochmals ein Termin. :mrgreen:

Trotz allem hat der Nutzer aber die Möglichkeit, (nicht nur in meinem Kalenderprogramm) Wiederholungstermine zu definieren, die sich miteinander kreuzen. Und das muss nun mal irgendwie gehandhabt werden. Goggle calendar beispielsweise gibt eine Warnmeldung aus. Wenn ich die aber wegklicke, werden auch dort sich kreuzende Termine angezeigt. Was sollte denn auch anderes geschehen?
snafo hat geschrieben:
mutetella hat geschrieben:Nun benötige ich aber noch zu jedem Termin Informationen darüber, ob das jeweilige Trefferdatum das Datum des Termins selbst oder eine Wiederholung ist und auch die Position dieses Datums innerhalb der Termindauer des Termins oder der Wiederholung.
Diesen Satz verstehe ich nicht. Ein Objekt vom Typ `Wiederholung` wird ja vermutlich ein Attribut mit seinen zugehörigen Terminen haben, richtig? Sorry wenn ich so blöd frage, aber was genau willst du anschließend überhaupt erreichen?
Ok, nochmals (und völlig unabhängig davon, ob sich nun Termine mit ihren eigenen Wiederholungen überschneiden können, dürfen, sollen oder nicht):

Wenn ich die Termine für den 12. und den 13. zur Anzeige bringen möchte, ging ich bisher so vor:
  1. Ich erstellte einen Ausdruck `12. or 13.`
  2. Ich verglich jeden Termin mit diesem Ausdruck und erhielt eine Liste mit den treffenden Terminen
  3. Zum Anzeigen nahm ich jeden Termin aus der Ergebnisliste und ermittelte, ob der 12. das Start-, End- oder between-Datum ist (um die Position des Termins bei der Anzeige irgendwie kenntlich zu machen). Dasselbe nochmals mit dem 13.
Bei dieser Vorgehensweise gefiel es mir eben nicht, dass ich den 12. und den 13. zweimal zur Abfrage bringe. Zuerst, um zu schauen, welche Termine überhaupt in Frage kommen und dann nochmals, um die Treffer nach ihrer Position start/between/end abzufragen.
Inzwischen erstelle ich für die Datumsabfrage keinen Ausdruck mehr sondern frage jeden Termin gleich nach seiner Position. Wenn es ein Ergebnis gibt, kommt das in die Ergebnisliste, wenn nicht, dann nicht.
snafo hat geschrieben:Kann es sein, dass du etwas willst, was in etwa dem folgenden Szenario entspricht: [...]
Ja. Und ich würde das wirklich NIE SO machen, aber in meiner verdorbenen Fantasie kann ich mir vorstellen, dass jetzt jemand völlig unbedarft einen solchen Kurs folgendermaßen in seinen Kalender einträgt:
Titel: "Häkeln für Fortgeschrittene", Datum: 15. - 18.11.2013, Wiederholung: Täglich, 4x
snafo hat geschrieben:Leider hat der Programmautor aber noch keine Ahnung, wie er diese Funktionalität in sein Tool einbauen soll...
Doch, hat er. Und ich sehe auch gar nicht die Notwendigkeit, einem solchen Vorgang eine eigene Funktion zu spendieren. Kann man ja mit einer Wiederholung machen. :mrgreen:

Mir gefiel anfangs nur nicht, dass ich, um bei dem Beispiel zu bleiben, zuerst alle Termine zum 16., 17. und 18. herausfiltere und dann nochmals für die Anzeige zum 16., 17. und 18. abfrage, ob der Termin eventuell mehrmals angezeigt werden muss, weil er sich mit einer eigenen Wiederholung überschneidet. Und eine solche Überschneidung ist ja bei einer einfachen bool Abfrage "passt der Termin zum 16." erstmal noch nicht zu sehen.

Irgendwie... ich weiß auch nicht... :mrgreen:

Jetzt mach' ich mal, und dann zeig' ich's euch...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@mutella: Wähle alle für den gewünschten Zeitraum infrage kommenden Termine mittels einer Abfrage aus. Nutze dann etwas wie `termin.render()`, um den Termin z.B. grafisch auszugeben. Die `.render()`-Methode sollte ein optionales Argument bekommen, mit dem man festlegen kann, ob nur ein bestimmter Ausschnitt dieses Termins gerendert werden soll. Du meintest es doch so, dass bei einer Abfrage für den Zeitraum 15.-17. und einem dort reinfallenden Termin, der von 14.-15. geht, wahlweise nur der Teil mit dem 15. von dem Termin beim Rendern enthalten sein soll, richtig?

Das mit den Wiederholungen von sich selbst würde ich - zumindest in dieser Form - an deiner Stelle komplett vergessen. Erstelle stattdessen in einer Hilfsfunktion für Wiederholungstermine doch einfach X unabhängige `Termin`-Objekte, die abgesehen vom Datum, einen völlig identischen Inhalt haben. Dann hast du überhaupt nicht das Problem, großartig zu unterscheiden, ob es sich jetzt um eine Wiederholung oder um das Original handelt.

Was man alternativ noch machen kann: Erstelle Objekte vom Typ `Mehrfachtermin`. Diese Klasse sollte auf jeden Fall von `Termin` abgeleitet sein. `Mehrfachtermin` verhält sich entsprechend beim Rendern etwas anders als ein Einzeltermin und führt das neue Attribut `.termine` ein, was eine Liste der Einzeltermine ist. Der "Original-Termin" wäre dann immer `mehrfachtermin.termine[0]`. Wenn man will, kann man natürlich auch ein `@property` namens `originaltermin` einführen, welches als Alias für den vorgenannten Code dient. Analog dazu entspräche `mehrfachtermin.start` einem `self.termine[0].start` und `mehrfachtermin.ende` einem `self.termine[-1].ende`.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

snafo hat geschrieben:Dann hast du überhaupt nicht das Problem, großartig zu unterscheiden, ob es sich jetzt um eine Wiederholung oder um das Original handelt.
Das Problem möchte ich aber haben, da ich angezeigt bekommen möchte, ob es der Originaltermin oder eine Wiederholung ist. Unter anderem ist das ein Punkt, der mich an mir bekannten Kalendern stört, dass Zusammenhänge diesbezüglich nur über Umwege zu sehen sind.
snafo hat geschrieben:Erstelle Objekte vom Typ `Mehrfachtermin`.
Das habe ich durch eine Klasse `DateTimeScope` gelöst. Jeder Termin hat seine Zeitinformationen in einem scope-Exemplar. Soll der Termin an verschiedenen Tagen stattfinden, die sich nicht über eine Wiederholungsregel definieren lassen, so füge ich einfach für jeden dieser Tage ein scope-Exemplar an den Termin an.
Ähnlich mache ich das mit Wiederholungen, nur dass die eben jeweils durch eine Regel definiert sind. Und jedes Wiederholungsexemplar füge ich ebenfalls an den Termin an. Somit habe ich im Termin alle Informationen.

Das alles ist nicht das Problem. "Lose" Wiederholungen und geregelte Wiederholungen habe ich IMHO ganz gut gelöst. Meine Frage ging eher darum, an welcher Stelle ich mit den geringsten Kosten Termine filtere und gleichzeitig oder an anderer Stelle Positionsangaben, die ich allein für die Anzeige benötige, abfrage. Die Frage war (und ist es noch ein wenig) eben: "... Termine filtere und gleichzeitig oder an anderer Stelle ...".

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

mutetella hat geschrieben:Beispiel: Vom 10. - 13. findet eine Veranstaltung statt. Nachdem sich unglaublich viele Leute dazu angemeldet haben :wink: , startet die gleiche Veranstaltung nochmals am 11. (dann also vom 11. - 14.) und am 12. (vom 12. - 15.). Wenn ich einen solchen Termin als 3tägigen Termin mit 2 täglichen Wiederholungen anlege und sagen wir den 13. abfrage, muss angezeigt werden:

Code: Alles auswählen

10. 11. 12. 13. 14. 15.
 x   x   x   x
     x   x   x   x
         x   x   x   x
             ^
             |___________ 1 x end appt, 2 x between recurrence
Das heißt, du willst die oben skizzierte Spalte z.B. farblich hervorheben und suchst dafür den idealen Weg? Und dafür willst du Abfrage und die Vorarbeit zur Markierung möglichst so verbinden, dass du die Ergebnisse aus der Abfrage nicht erneut durchlaufen musst, um die Daten für die Spaltenmarkierung zu ermitteln. Habe ich das jetzt richtig verstanden?
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@snafu: JA!!! Genau das ist die Frage!

Um einen bestimmten Zeitraum nach den darin vorkommenden Terminen abzufragen, habe ich aus den Daten (Datums, Datümmern... :-) ) einen Ausdruck gebildet und damit alle passenden Termine herausgefiltert. Nun gestaltet es sich aber schwierig, in der Abfrageroutine aus einem solchen Ausdruck, der z. B. so

Code: Alles auswählen

days_of_any_week = [10, 11, 12, 13, 14, 15]
expr = Equal(Constant(days_of_any_week.pop(0), Attribut('is_datetime')))
for day in days_of_any_week:
    expr = Or(expr, Equal(Constant(day), Attribut('is_datetime')))
ausehen kann wiederum die Tage zu extrahieren, die letztlich einen Treffer erzeugen und damit gleich noch die Informationen abzufragen, die in der Anzeige benötigt werden, um start/between/end darzustellen.
In meinem von Dir zitierten Beispiel benötige ich also am Tag 13 für den 1. Termin die Info `end`, für den 2. Termin `between` und für den 3. Termin ebenfalls `between`. Diese Informationen zu bekommen ist nicht das Problem. Sondern wo.

Momentan denke ich eben, dass ich die abzufragenden Tage nicht in einem Ausdruck zusammenfasse, sondern Termin für Termin überprüfe, welcher der Tage darin vorkommt und im Wahrheitsfall diesen Termin samt Positionsinformationen zur Ausgabe schicke. Oder ich muss mir nochmals Gedanken darüber machen, ob es vielleicht doch Sinn machen könnte, die Abfrageroutine dahin zu ändern, dass sie nicht nur True/False antwortet, sondern auch den abgefragten term ausspuckt.

Das Abfragemodul sieht so aus.

mutetella


EDIT: Ich denke inzwischen, es würde durchaus Sinn machen, wenn mir die Abfrage nicht nur das Ergebnis, sondern auch den zugrundeliegenden term zurückliefert. Denn letztlich möchte ich ja nicht nur die Positionen von Terminen kenntlich machen, sondern auch gefundene Begriffe im title, Kategorien in categories und so weiter...
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten