![]() |
Servergeänderte Datensätze
Hallo Forum,
ich habe eine kleine Anwendung geschrieben um das unsägliche rumgefummel in einer Excel-Tabelle von 12 Mitarbeitern zu beenden.Eine Schwäche des Programms ist, der Client bekommt nicht mit, wenn ein anderer Client einen Datensatz ändert. Ich überlege nun ratlos wie ich sowas umsetzen könnte. Zum Anwendungsfall: Es ist im Prinzip ein kleine wenig aufgeblasener Kalender bei dem im Vorfeld sämtliche notwendigen Datensätze "leer" angelegt werden und dann vom Anwender ausgefüllt werden. Deswegen müsste ich auf das Ändern von DS reagieren. Hat jemand sowas schonmal umgesetzt oder hat Tipps dazu wie man sowas erreichen kann? Von der Kontruktion her könnte ich in den Userverzeichnissen eine Datei ablegen auf die dann alle angemeldeten Clients reagieren und die Tabellen aupdaten. Aber das geht doch sicher etwas eleganter, oder? Ich nutze D7 und SQL-Server 2012 Danke für Tipps Heiko |
AW: Servergeänderte Datensätze
Hallo...
Fragen: * Wie greifst du auf den Server zu? ADO? Tipps: * bei einem modernen DBMS nie mit Tabellen arbeiten sondern nur über Query welche sich nur die Daten holt die benötigt werden. (SQL) * vernünftige Datenzugriffskomponenten (Devart, FireDAC)... mit D7 etwas schwierig * Trennung der Datenbankschicht von der Oberfläche... keine datensensitiven Controls. (war vor Jahren State of Art) * MSSQL Server Events ![]() ...da hast du Brot. :thumb: |
AW: Servergeänderte Datensätze
Zitat:
Zu deinen Tipps: Ich muss leider - exakt aus Gründen der Performance - mit ein paar Tabellen arbeiten. Alle sinnvollen Daten hole ich mir natürlich mit AdoQueries. Und, man mag es veraltet halten, aber ohne datensensitive Controls stände ich jetzt vor dem gleichen Problem. Dein Link, danke dafür, hilft mir nach erster Analyse auch nicht weiter. So wie ich es verstehe, müsste der Client nur woanders nach einer Änderung suchen. Ich "überwache" nur eine andere Tabelle. |
AW: Servergeänderte Datensätze
Man kann in diversen Datenbanken, u.a. in MsSQL und in Firebird, sogenannte Ereignisse deklarieren (Trigger kennst du ja vermutlich schon). Diese Ereignisse werden dann an alle Clients versandt, die entsprechend darauf reagieren können. Ob deine uralte Delphiversion bereits entsprechende Komponenten bereitstellt, weiß ich natürlich nicht. Notfalls kannst du aber auch mit Zeos arbeiten, dort gibt's zwei sog. EventAlerter-Komponenten. Wenn nun ein Client einen Datensatz ändert und die anderen Clients diesen Alert erhalten, reagieren letztgenannte einfach mit einen Refresh. Wie das bei igendwelchen Konfliktfällen (z.B. Client A hat Datensatz 547 gerade gelöscht, während Client B diesen noch in Bearbeitung hat) genau aussieht, vermag ich jetzt nicht im Detail zu erklären.
|
AW: Servergeänderte Datensätze
Zitat:
Zitat:
Gruß K-H |
AW: Servergeänderte Datensätze
Hallo,
er benutzt TAdoTable, weil es sich so besser mit seinen datensensitiven Elementen (TDBEdit usw.) arbeiten läßt. Kennt TAdoQuery eigentlich auch das RequestLive ? Damit klappte war ein TQuery doch fast so gut wir ein TTable. Hatte ich aber nie benutzt. Heiko |
AW: Servergeänderte Datensätze
Die Problematik schreit eigentlich nach einem Service (aka Mittelschicht). Zugriff auf die Daten über den Service, der dann ja alle Clients benachrichtigen kann.
ADO unterstützt keine Event notifications. Man müsste also den Provider wechseln (AnyDac) oder sich eben den Service selbst schreiben. Fragt sich, was billiger ist ;-) |
AW: Servergeänderte Datensätze
Hallo,
als kleinere Zwischenlösung könntest Du auch folgendes machen: - In jeder Tabelle gibt es ein Feld mit Datum/Zeit der letzten Änderung - Wenn ein Datensatz bearbeitet wird, wird das Feld im Client zwischengespeichert - Bevor ein Datensatz dann gespeichert werden soll, wird das Datum der letzten Änderung nochmal aus der Datenbank gelesen und mit dem zwischengespeicherten verglichen - Ist das Datum unterschiedlich, wurde der Datensatz in der Zwischenzeit geändert oder Du setzt beim "Holen" eines Datensatzes ein Feld in der Tabelle, das allen anderen signalisiert, dass der Datensatz gesperrt ist (dann kannst Du auch hinterlegen, von wem und seit wann) Aber ein Service ist langfristig natürlich die bessere Wahl. Gruß Frank |
AW: Servergeänderte Datensätze
Du könntest auch sog. MessageQueues benutzen. Die Windows-Server haben die MS-MessageQueue mit an Board, welche man über die Serververwaltung nachinstallieren kann. Jedes Windows-OS ab 7 aufwärts (glaube ich), hat dieses Feature als Server auch integriert (bzw. ist nachinstallierbar).
Ansonsten kannst du auch RabbitMQ / ApacheMQ verwenden, wenn du eine Linux-VM erstellen kannst. Dann kannst du bei jeder Änderung eine Nachricht an die MessageQueue schicken, welche alle aktiven Clients benachrichtigt. Alternativ kannst du auch - wenn es nur um die Meldung geänderter Datensätze aus einem Modul geht - einen TCP-Server u Client verwenden und nach dem Ändern eines DS eine Broadcast-Message (oder alle aktiven Clients) via TCP/IP ansprechen und den String "/reload-1234" senden. Beim Empfangen wissen die TCP-Clients, dass die den DS 1234 aktualisieren müssen. |
AW: Servergeänderte Datensätze
Vielen Dank an alle. Also, die Anwendung ist mir für eine Investition in andere Zugriffskomponenten einfach zu minimal.
Ich würde mir aber gerne mal die Lösung mit dem Service, wenigstens in der Theorie, ansehen. Kennt einer hilfreiche Links oder andere Quellen (democode) dazu? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz