AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Ansatz gesucht: Triggern einer Benachrichtigung im Kontext von zykl. Dateiabfragen...

Ansatz gesucht: Triggern einer Benachrichtigung im Kontext von zykl. Dateiabfragen...

Ein Thema von alphaflight83 · begonnen am 2. Nov 2011 · letzter Beitrag vom 2. Nov 2011
Antwort Antwort
Benutzerbild von alphaflight83
alphaflight83

Registriert seit: 5. Jun 2008
Ort: Würzburg
144 Beiträge
 
Delphi 10.3 Rio
 
#1

Ansatz gesucht: Triggern einer Benachrichtigung im Kontext von zykl. Dateiabfragen...

  Alt 2. Nov 2011, 09:00
Genereller Ansatz gesucht:
Triggern einer Benachrichtigung im Kontext von zyklischen Dateiabfragen kombiniert mit Datenbankzugriff
(Delphi 2009, Datenbank: Firebird 2.5.1 mit UniDac)

Tag Gemeinde,
sorry erstmal für die Prosa, aber wie die Überschrift schon sagt, ist die Situation etwas komplizierter ...

Ich habe für mehrere Clients jeweils eine CSV-Datei mit einer Liste von Meldungen, die ständig aktualisiert werden.
(Dass diese Konstellation an sich schon mal ungeschickt ist weiß ich, das steht aber (leider) momentan nicht zur Disposition)
Jede Meldung besteht aus mehreren Strings und Integern. (StringLists fallen als Container also aus)

1. Die Dateien sollen eingelesen und mit einer Definitionstabelle aus der lokalen Datenbank kombiniert werden. (Edit: Meldungen die nicht mehr in den Dateien auftreten, sollen auch nicht mehr angezeigt werden.)
2. Die aktuellen kombinierten Daten sollen sowohl für jedes Gerät einzeln als auch zusammen angezeigt werden können.
3. Bei einem neuen Eintrag mit gewisser Priorität soll eine Benachrichtigung ausgelöst werden.
Die Einträge lassen sich über den Meldungscode nebst Zeitstempel eindeutig zuordnen.

Das Problem besteht nun darin, wie man diese Kombination möglichst performant hinbekommt.

Momentan besteht eine Lösung, bei der die kombinierten Daten EINES Clients angezeigt werden können.
Das Ganze jedoch ohne Benachrichtigung und ohne Möglichkeit der Anzeige aller Clients.
Hierzu werden ALLE Dateien zyklisch in Stringgrids gelesen und dort die Felder überprüft.
Sollen die Daten eines Clients angezeigt werden, werden die ausgelesenen Daten aus dem jeweiligen StringGrid in eine Datenbanktabelle geschrieben,
dann per SQL mit der Definitionstabelle verknüpft und in ein DBGrid ausgegeben. Das Ganze ebenfalls zyklisch.
Performance-technisch ein Albtraum, da permanent in die Datenbank geschrieben wird.
Zudem kann eben immer nur ein Client angezeigt werden.

Wie könnte man das angehen?
Zyklisches Einlesen der Dateien in StringGrids (oder Arrays) ist denke ich nicht so dumm,
zum Feststellen von Änderungen ein zweiter Satz Arrays, in welche die alten Daten vor dem nächsten Zyklus geschoben werden.
Ob zu einer Meldung bereits eine Benachrichtigung gesendet wurde, könnte dann in einem zusätzlichen Feld des Arrays abgelegt werden,
muss aber bei jeder Aktualisierung beim Vergleich der Arrays nachgezogen werden.

Nun müssen die Arrays noch mit den Daten der Definitionstabelle aus der lokalen Datenbank verknüpft werden,
(Temporäre Tabelle, oder Datenbanktabelle dauerhaft auslesen !?!)
und diese verknüpften Daten für jeden Client einzeln als auch für Alle zusammen abgerufen werden.
Die Benachrichtigung soll ebenfalls die kombinierten Daten enthalten.

Ich bin für jeden Vorschlag und Ansatz dankbar.
Make me a sandwich! - What? Make it yourself. - Sudo make me a sandwich! - Okay

Geändert von alphaflight83 ( 2. Nov 2011 um 12:31 Uhr) Grund: Edit in Punkt 1
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
1.233 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Ansatz gesucht: Triggern einer Benachrichtigung im Kontext von zykl. Dateiabfrage

  Alt 2. Nov 2011, 12:15
Zitat:
1. Die Dateien sollen eingelesen und mit einer Definitionstabelle aus der lokalen Datenbank kombiniert werden.
Daten aus den Dateien sofort in die Datenbank schreiben.
Jeder Datensatz erhält zusätzlich die ID des Gerätes und den Zeitstempel.
Kein Update oder Delete, nur Inserts!
Zitat:
2. Die kombinierten Daten sollen sowohl für jedes Gerät einzeln als auch zusammen angezeigt werden können.
Nur die für die Anzeige notwendigen Daten abfragen und anzeigen.
Dafür passenden Index anlegen.
Zitat:
3. Bei einem neuen Eintrag mit gewisser Priorität soll eine Benachrichtigung ausgelöst werden.
Periodische Abfrage aller neuen DB-Eintragungen (ID oder Zeitstempel > letzte Abfrage) mit gewisser Priorität.
Auch hierfür einen Index anlegen.
  Mit Zitat antworten Zitat
Benutzerbild von alphaflight83
alphaflight83

Registriert seit: 5. Jun 2008
Ort: Würzburg
144 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Ansatz gesucht: Triggern einer Benachrichtigung im Kontext von zykl. Dateiabfrage

  Alt 2. Nov 2011, 12:45
Hi Blup,

erst mal Danke für den Beitrag.
Das Problem ist, dass ich um "Delete" nicht rumkomme, da die Meldungen auch wieder verschwinden können und dementsprechend auch nicht mehr angezeigt werden sollen.
(Hab's im Eingangspost editiert)
Wäre das eventuell mit einer temporären Tabelle performanter, oder sollte man da die Verwendung der DB grundsätzlich anders angehen?
Make me a sandwich! - What? Make it yourself. - Sudo make me a sandwich! - Okay
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.629 Beiträge
 
Delphi 6 Enterprise
 
#4

AW: Ansatz gesucht: Triggern einer Benachrichtigung im Kontext von zykl. Dateiabfrage

  Alt 2. Nov 2011, 13:45
Das Problem ist, dass ich um "Delete" nicht rumkomme, da die Meldungen auch wieder verschwinden können und dementsprechend auch nicht mehr angezeigt werden sollen.
Wäre es nicht im Sinne eines vollständigen "loggens" sinnvoller, auch den Zeitpunkt zu speichern, ab dem eine Meldung nicht mehr auftaucht und bei der Anzeige die Meldungen dann halt nicht mehr anzuzeigen?
Mach natürlich was die Datenbankzugriffe angeht, wenig Unterschied, ob du nun einen Datensatz löschst oder "updatest".
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von alphaflight83
alphaflight83

Registriert seit: 5. Jun 2008
Ort: Würzburg
144 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Ansatz gesucht: Triggern einer Benachrichtigung im Kontext von zykl. Dateiabfrage

  Alt 2. Nov 2011, 14:05
Hi Jumpy,

in diesem Abschnitt sind nur die aktuell anliegenden Meldungen wichtig, die am Client noch nicht quittiert wurden, daher ist ein Loggen der Historie hier nicht nötig.
Die alten Daten wären nur ungenutzte Altlasten und die möchte ich möglichst vermeiden.
Make me a sandwich! - What? Make it yourself. - Sudo make me a sandwich! - Okay
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
1.233 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Ansatz gesucht: Triggern einer Benachrichtigung im Kontext von zykl. Dateiabfrage

  Alt 2. Nov 2011, 14:14
Wird kein Protokoll benötigt, ist doch alles sehr einfach.
Für jedes Objekt gibts einen Eintrag in der Datenbank mit der letzten Statusmeldung und ob diese quittiert wurde und fertig.
Code:
select * from tabelle where (status = 'kritisch') and (quittiert = 0)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.099 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Ansatz gesucht: Triggern einer Benachrichtigung im Kontext von zykl. Dateiabfrage

  Alt 2. Nov 2011, 14:19
Wird in allen Dateien oft etwas geändert?

Man kann sich eventuell vom Windows informieren lassen, welche Dateien gerade verändert wurden,
dann müßte mn nicht immer alle Dateien durchgehn, sondern nur die Geänderten.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von alphaflight83
alphaflight83

Registriert seit: 5. Jun 2008
Ort: Würzburg
144 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Ansatz gesucht: Triggern einer Benachrichtigung im Kontext von zykl. Dateiabfrage

  Alt 2. Nov 2011, 14:23
@Blup:
Ja, die Benachrichtigung kann ich dann mit einem zusätzlichen Feld à la "Bereits gesendet" triggern,
allerdings muss ich in jedem Fall die Datensätze updaten.

@Himitsu:
Ich wusste gar nicht dass das geht, bzw. hab da noch nie drüber nachgedacht.
Das ist auf jeden Fall schon mal nicht schlecht: FILE_NOTIFY_CHANGE_LAST_WRITE
Edit: Hab bei Torry mal die ATFileNotification Compos gezogen, die werd ich mir mal anschauen.

Edit: Nach nochmaligem Nachdenken ist es wirklich die bessere Lösung, die Daten zu behalten
(und irgendwann mal im Paket zu löschen) und Update für die Felder "Quittiert" und "Bereits gesendet" auszuführen.
In Kombination mit Himitsus Vorschlag kann ich vielleicht schon ein gutes Stück Performance rausholen.
Make me a sandwich! - What? Make it yourself. - Sudo make me a sandwich! - Okay

Geändert von alphaflight83 ( 3. Nov 2011 um 07:40 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf