AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Programm-Design, um DB-Abfragen zu minimieren
Thema durchsuchen
Ansicht
Themen-Optionen

Programm-Design, um DB-Abfragen zu minimieren

Ein Thema von scrat1979 · begonnen am 18. Sep 2011 · letzter Beitrag vom 21. Sep 2011
Antwort Antwort
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#1

Programm-Design, um DB-Abfragen zu minimieren

  Alt 18. Sep 2011, 11:27
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
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#2

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

  Alt 18. Sep 2011, 11:30
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 18. Sep 2011, 11:38
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.
Michael Kübler
  Mit Zitat antworten Zitat
Neumann

Registriert seit: 6. Feb 2006
Ort: Moers
529 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 18. Sep 2011, 13:53
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
Ralf
Gruß vom Niederrhein
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#5

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

  Alt 18. Sep 2011, 22:13
Okay, danke! ich schau mit mal TClientDataSet und Randus mal näher an

Grüsse,
Michael
Michael Kübler
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#6

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

  Alt 20. Sep 2011, 14:36
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.)
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#7

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

  Alt 20. Sep 2011, 21:36
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
Michael Kübler
  Mit Zitat antworten Zitat
AlBo55

Registriert seit: 17. Jan 2008
Ort: Lieblingshof
30 Beiträge
 
Delphi XE7 Enterprise
 
#8

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

  Alt 21. Sep 2011, 07:34
Ich hab's noch nicht getestet, aber Firebird kann auch events (named messages) an Anwendungen schicken. ist vielleicht eine Möglichkeit

AlBo55
  Mit Zitat antworten Zitat
Neumann

Registriert seit: 6. Feb 2006
Ort: Moers
529 Beiträge
 
Delphi 11 Alexandria
 
#9

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

  Alt 21. Sep 2011, 09:35
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.
Ralf
Gruß vom Niederrhein
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#10

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

  Alt 21. Sep 2011, 21:05
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!!!
Michael Kübler
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:12 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