Laden...

Programmierung Outlook ähnlicher Erinnerungsfunktion

Erstellt von nighty2k vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.023 Views
N
nighty2k Themenstarter:in
8 Beiträge seit 2009
vor 13 Jahren
Programmierung Outlook ähnlicher Erinnerungsfunktion

Hallo Zusammen,

ich hätte mal eine Frage an euch wie Ihr am besten eine Erinnerungsfunktion programmieren würde. Aktuell für noch kein geplantes Projekt, rein mal aus Interesse heraus.

Also Grundlage soll z.B. eine SQL Datenquelle gegeben sein. In der Termine, Aufgaben, Eskalationen oder ähnliche Sachen gespeichert sein könnten.

Egal was es nun ist, angenommen es gibt dann eine Spalte mit einem Ablauf/Erinnerungsdatum, sobald dieses überschritten wird, soll eine Aktion (Event) ausgeführt werden. Wie würdet Ihr so etwas am besten programmieren.
Bitte nur Vorschläge die man auch als Performant ansehen kann, z.B. gehen wir mal von 100.000 Datensätzen aus.

Das einzige was mir jetzt gerade dazu einfallen würde, wäre ein Timer der jede Minute die SQL mit einem Zeitfilter(Now + 1 Minute) abfrägt.

Nachteile die ich hier sehe:

  • Nicht performant
  • Nur auf die Minute genau.

Wie würdet Ihr so etwas lösen?

MfG
Nighty2k

1.552 Beiträge seit 2010
vor 13 Jahren

Hallo nighty2k,

wäre ein Timer der jede Minute die SQL...Nur auf die Minute genau.

Wer hat schon Erinnerungen auf die Sekunde genau eingeplant.

Bitte nur Vorschläge die man auch als Performant ansehen kann, z.B. gehen wir mal von 100.000 Datensätzen aus.

M.E. ist diese Zahl etwas hoch angesetzt, aber naja.

Da ich aber denke dass nicht so viele Datensätze zusammenkommen kannst du auch wie im Outlook je nach Granularität, Tag, Arbeitswoche,Woche,Monat,Jahr laden. Und dies je nach dem was angezeigt wird laden. Wenn dann Monat gewechselt wird, wird der andere Monat geladen. Dies ist auch die übliche vorgehensweise.

Eine Möglichkeit wäre beim Programmstart mir wie du bereits sagtest ein Zeitfenster an Daten laden, dies jedoch nicht alle Minuten und ein Zeitfenster von +1min, sondern lade beim Start den gesamten heutigen Tag. Eventuell kannst du ja noch alle x-Stunden die Daten aktualisieren und oder die Daten von morgen+ wenn gewünscht nachladen.

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo nighty2k,

eine statische Klasse Notification anlegen. In der Klasse einen Timer mit einem Interval von z.B. 1 Minute festlegen. In der OnTick-Methode prüfen, ob was in der Datenbank vorhanden ist. Wenn ja, ein Event feuern. Verwende am besten eigens programmierte Events. Mehr findets du hier [FAQ] Eigenen Event definieren / Information zu Events. Anschließend kannst du dich an Events dranhängen und schauen, was für ein Termin oder was auch immer es ist.

Wenn du in einem bestimmten Intervall etwas prüfen möchtest, bleibt dir nichts anderes übrig, als einen Timer zu verwenden. Anders wird es wohl nicht gehen. Eine Abfrage musst du sowieso an die Datenbank schicken. Wie möchtest du sonst prüfen, ob etwas da ist oder nicht? Besser ist es natürlich, wenn du nicht die komplette Datenbank abfragst, sondern nur ein bestimmtes "Zeitfenster".

zero_x

N
nighty2k Themenstarter:in
8 Beiträge seit 2009
vor 13 Jahren

Danke euch, dann war mein Ansatz ja schon mal gar nicht so schlecht, freut mich 😃

Ein konkretes Beispiel, was mir jetzt wieder eingefallen ist und schon eine Weile im Kopf herum schwirrt wäre z.B. ein Ticketsystem, welches z.B. ein Popup bei Überschreitung einer maximalen Wartezeit ausgeben soll.

Wegen der großen Zahl von 100k, so unrealistisch finde ich die nicht, wenn ich Software schreibe, will ich diese ja natürlich auch so funktionell wie möglich machen.

Bleiben wir bei dem Beispiel eines Ticketsystem, 100.000 / 365 Tage / 5 Jahre sind nur noch 54 Tickets pro Tag, also durchaus machbar.

Wobei wie schon gesagt am sinnvollsten wäre denk ich mal sowieso die Filterfunktionen einer SQL zu nutzen, dafür gibt es ja SQL, also where != erledigt + zeitraum somit ist man noch bei einer handvoll Tickets über.

Danke für dem Tipp mit der Notification Class, bei MSDN hab ich leider nur eine Notification Class im Bezug auf Win CE gefunden, hättest evtl. eine Info Quelle.

Grüße
Matthias

1.820 Beiträge seit 2005
vor 13 Jahren

Hallo!

@nighty2k:
Bei SQL gibt es auch für WHERE -Conditions das between-Schlüsselwort, um bei Zahlen oder Datumswerten einen bereich zu definieren.

Nobody is perfect. I'm sad, i'm not nobody 🙁

U
135 Beiträge seit 2009
vor 13 Jahren

Danke für dem Tipp mit der Notification Class, bei MSDN hab ich leider nur eine Notification Class im Bezug auf Win CE gefunden, hättest evtl. eine Info Quelle.

Ich denke, gemeint war: Du sollst Dir eine eigene, statische Klasse schreiben... ob Du die nun Notification, Reminder oder Donaudampfschifffahrtskapitaen nennst, bleibt Dir überlassen. Notification wäre aber ein naheliegender Name 😉

A
350 Beiträge seit 2010
vor 13 Jahren

Hi,
was dir sicher bei deinem Vorhaben noch hilft ist dieses super Projekt :
http://quartznet.sourceforge.net/

X
1.177 Beiträge seit 2006
vor 13 Jahren

huhu,

"Outlook" benachrichtigt mich gerade mal Minutengenau - auch sind Sekunden-Timer etwas überdimensioniert.

Ich würde eine Mischung machen: Erst die "die Events während des Tages abrufen" - das sind diejenigen, für welche informiert werden muss.

Zusätzlich gibt es aber jene, welche Tagsüber von anderen in die DB eingefügt werden. Klar kann man diese per polling "jede Sekunde" aus der DB abholen, aber naja, polling ist immer schlecht.

Dafür gibt es in diesem Fall SqlDependency. Schick eine Abfrage an den SQL-Server und du bekommst Antwort wenn sich das ursprüngliche Ergebnis ändert (also ein Datensatz dazu kommt oder sich der Zeitpunkt ändert).

😃

Xynratron

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.