Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Programm-Design, um DB-Abfragen zu minimieren (https://www.delphipraxis.net/163171-programm-design-um-db-abfragen-zu-minimieren.html)

scrat1979 18. Sep 2011 11:27


Programm-Design, um DB-Abfragen zu minimieren
 
Hallo zusammen,

ich habe keine passende Rubrik gefunden, daher poste ich es hier. Sollte das Thema nach Meinung der MODs besser wo anders passen, bitte verschieben :-)

Folgendes Problem: Ich habe einen Dienstplaner für meine Abteilung geschrieben. Meine Kollegen sollen über ein (von mir geschriebenes) Programm die Möglichkeit haben, ihre Dienstplanwünsche selbt einzutragen. Zur Speicherung der Daten steht eine Firebird-Datenbank auf meinem Server zu Hause zur Verfügung. Das Programm arbeitet auch 1a, nur würde mich interessieren wie ihr in meinem Fall die Anzahl der Datenbankabfragen auf ein Minimum beschränken würdet.

An einem Tag stehen 3 verschiedene Dienste zu Auswahl. Ich habe es nun so gelöst, dass ich eine Klasse TTag erstellt habe, in welche beim Programmstart durch EINE Datenbankabfrage die bereits eingetragenen Dienste und Dienstplanwünsche aus der Datenbank eingelesen werden. Dann kann ich bequem "offline" testen, ob der ausgewählte Dienst bereits vergeben ist oder der Dienstplanwunsch schon existiert. Mit ist durchaus bewußt, dass es Probleme geben könnte, falls zwei Mitarbeiter gleichzeitig im Plan "herumhantieren", mir scheint es jedoch momentan die einzige praktikable Lösung zu sein - habe dies jedoch über den Primary-Key in der Datenbank gelöst, welcher eben Duplikate der Dienstwünsche vermeidet und einen Fehler ausgibt, welchen ich im Programm entsprechend interpretiere ("Dienst(wunsch) nicht möglich, bereits vergeben"). Würde ich jedesmal die Datenbank nach möglichen und vergebenen Diensten abfragen, nachdem der User den Tag/Dienst angeklickt hat, wäre die Geschwindigkeit über das Internet nicht mehr zumutbar (habe es selber getestet...).

Oder anders (allgemein) formuliert. Wie speichert ihr die Daten einer "fernen" Datenbank im Programm, um damit zu arbeiten OHNE die Datenbank durch zusätzliche Abfragen ansprechen zu müssen.

Hoffe auf einige Tipps,

Michael

Union 18. Sep 2011 11:30

AW: Programm-Design, um DB-Abfragen zu minimieren
 
Die Abfragen selber kannst Du nicht verhindern, aber die übertragene Datenmenge reduzieren indem Du z.b. stored procedures und views verwendest damit möglichst wenig Verarbeitung auf dem Client stattfindet.

scrat1979 18. Sep 2011 11:38

AW: Programm-Design, um DB-Abfragen zu minimieren
 
Danke Union,

das habe ich bereits alles berücksichtigt :)

Interessieren würde mich allgemein, wo mögliche Auswahllisten (z.B. Kollegen (welche Dienste können die überhaupt machen...), Wunscharten, etc.) aus der Datenbank im Programm zu speichern sind (ich habe es ja momentan über Klassen (z.B. TDienstArt, TKollege) mit entsprechenden Eigenschaften gelöst und alles in entsprechende ObjectLists gepackt... Gefüllt werden die Listen in meinem Falle beim Programmstart durch WENIGE Datenbankabfragen... Nun Frage ich mich, ob dieses Vorgehen in Ordnung ist oder ob es bessere Alternativen gibt.

Neumann 18. Sep 2011 13:53

AW: Programm-Design, um DB-Abfragen zu minimieren
 
Ich würde mir nicht die Mühe machen solche Daten in eigenen Klassen zu speichern. Es gibt doch das Clientdataset, welches sich einfach befüllen lässt und mit Queries verbunden werden kann.

Was man noch machen könnte ist eine Webanwendung, auf die die Mitarbeiter per Browser zugreifen. Entweder mit PHP bauen, oder z.B. Raudus nehmen für Delphi, zur Zeit das einzige Webframework für Delphi was einigermaßen funktioniert. Dafür braucht man ev. eine kommerzielle Lizenz für EXTJavaScript, bitte selber prüfen.

Ich habe mal ein Webinfo für unsere Kunden angefangen, bisher gehen 2 Funktionen, die Übersicht aktueller Status und der X-Bericht (Umsatzbericht).
Die Übersicht wird alle 10 s aktualisiert; Zeiträume können geändert werden.
War nicht viel Arbeit.

Zum Ansehen: http://www.kassensystem-picasso.de:88

scrat1979 18. Sep 2011 22:13

AW: Programm-Design, um DB-Abfragen zu minimieren
 
Okay, danke! ich schau mit mal TClientDataSet und Randus mal näher an :-)

Grüsse,
Michael

FredlFesl 20. Sep 2011 14:36

AW: Programm-Design, um DB-Abfragen zu minimieren
 
Zitat:

Zitat von scrat1979 (Beitrag 1125105)
Interessieren würde mich allgemein, wo mögliche Auswahllisten ... aus der Datenbank im Programm zu speichern sind

Ich verwende dazu nur zwei Tabellen (=2 Abfragen). Egal wie viele Auswahllisten ich habe, der Abruf ist immer gleich simpel. Im Programm erstelle ich mir dann In-Memory Datasets und verteile die Daten auf diese Lookuplisten. Das ist mit wenigen Handgriffen getan.

Falls Du eine Mehrbenutzerumgebung hast, solltest Du über Reconcile-Strategien nachdenken, bei denen etwaige Konflikte beim Speichern behandelt und gelöst werden(2 Leute ändern das gleiche, der eine löscht, der andere ändert etc.)

scrat1979 20. Sep 2011 21:36

AW: Programm-Design, um DB-Abfragen zu minimieren
 
Zitat:

Zitat von FredlFesl (Beitrag 1125542)
Zitat:

Zitat von scrat1979 (Beitrag 1125105)
Interessieren würde mich allgemein, wo mögliche Auswahllisten ... aus der Datenbank im Programm zu speichern sind

Ich verwende dazu nur zwei Tabellen (=2 Abfragen). Egal wie viele Auswahllisten ich habe, der Abruf ist immer gleich simpel. Im Programm erstelle ich mir dann In-Memory Datasets und verteile die Daten auf diese Lookuplisten. Das ist mit wenigen Handgriffen getan.

Falls Du eine Mehrbenutzerumgebung hast, solltest Du über Reconcile-Strategien nachdenken, bei denen etwaige Konflikte beim Speichern behandelt und gelöst werden(2 Leute ändern das gleiche, der eine löscht, der andere ändert etc.)

Hättest Du mir da ein Beispiel-Source aus einer Deiner Anwendungen, mir ist das Prinzip nicht ganz klar. Und da ich dies wohl öfters noch benötigen werde, möchte ich gerne eine saubere Lösung für die Zukunft haben. Wäre wirklich klasse! Wie z.B. GENAU bekomme ich die Datensätze der (Remote)-Datenbank in ein In-Memory-Dataset am lokalen Rechner? Mir fiel da nur ein, die Felder des Datasets zu erstellen und über eine Schleife die Datensätze von der Datenbank auf den lokalen Rechner zu übertragen. Wie gesagt, über einen Source, der mir das Vorgehen zeigt, wäre ich dankbar.

Das Problem mit dem synchronen bearbeiten der Datensätze exisitert (zumindest in meiner momentanen Anwendung) nicht, da die Datensätze benutzerspezifisch geladen werden und auf die anderen Datensätze gar kein Zugriff besteht.

Michael

P.s.: Ich habe schon viele "Tutorials" über TClientDataset im Internet gesehen, aber irgendwie wird mir aus keinem das Prinzip (v.a. das Übertragen der Daten in das Datenset von der Datenbank) klar :-(

AlBo55 21. Sep 2011 07:34

AW: Programm-Design, um DB-Abfragen zu minimieren
 
Ich hab's noch nicht getestet, aber Firebird kann auch events (named messages) an Anwendungen schicken. ist vielleicht eine Möglichkeit

AlBo55

Neumann 21. Sep 2011 09:35

AW: Programm-Design, um DB-Abfragen zu minimieren
 
Mit dem Clientdataset ist es eigentlich keine Geheimwissenschaft. Wenn man Daten "readonly" anzeigen will, nimmt man eine Query-Komponente, einen DatsourceProvider, ein Clientdataset, eine DataSource und zuletzt z.B. ein DBGrid und verbindet alle Komponenten. Setzt man jetzt das Clientdatset auf Active, werden die Daten geholt.
Die Query wird dabei automatisch ausgeführt und wieder geschlossen; die Transactionskomponente muss entsprechend eingestellt werden.

Read/Write ist etwas komplizierter; kann man in der Hilfe nachlesen.

scrat1979 21. Sep 2011 21:05

AW: Programm-Design, um DB-Abfragen zu minimieren
 
Zitat:

Zitat von Neumann (Beitrag 1125705)
Mit dem Clientdataset ist es eigentlich keine Geheimwissenschaft. Wenn man Daten "readonly" anzeigen will, nimmt man eine Query-Komponente, einen DatsourceProvider, ein Clientdataset, eine DataSource und zuletzt z.B. ein DBGrid und verbindet alle Komponenten. Setzt man jetzt das Clientdatset auf Active, werden die Daten geholt.
Die Query wird dabei automatisch ausgeführt und wieder geschlossen; die Transactionskomponente muss entsprechend eingestellt werden.

Read/Write ist etwas komplizierter; kann man in der Hilfe nachlesen.

Habe gerade etwas damit rumexperimentiert. Klappt auch wunderbar :-). Nun habe ich meine Daten (soll eine ItemListe einer Combobox werden...) in meinem ClientDataSet. Was ist jetzt das nächste vorgehen? Ich würde es so machen, dass ich das DataSet durchlaufe und die Datensätze so in die ItemListe schreibe, als Objekt würde ich die Datensatz-ID mit in die ItemListe nehmen, um bei der Auswertung mittels FindKey(...) zum korrekten Datensatz springen und die dazugehörigen Daten auslesen zu können. Ist das so in Ordnung oder gibt es eine "einfachere" / sauberere Lösung?

Ihr habt mir bisher sehr geholfen, Jungs!!! :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz