Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Lazarus TDBGrid Scrol funktion (https://www.delphipraxis.net/187271-lazarus-tdbgrid-scrol-funktion.html)

manfred_h 13. Nov 2015 10:55

Datenbank: MySQL • Version: 5.5 • Zugriff über: REMObject

Lazarus TDBGrid Scrol funktion
 
Hallo zusammen

Ich habe in meiner Anwendung ein TDBGrid und alles funktioniert einwandfrei.
Die Datenbank ist im Internet.
Das Problem ist das wenn ich im Grid Scrolle wird sofort der nächste Datensatz geladen.
( In allen dazugehörigen Edit Feldern. )
Das ist bei einer lokalen DB ok aber hier weniger.:wink:
Habe das TKDBGrid getestet, welches erst beim auswählen eines Eintrags im Grid die Daten lädt.http://www.tkweb.eu/en/delphicomp/kgrid.html

Ist dies nicht auch mit der normalen TDBGrid möglich?

Jumpy 13. Nov 2015 11:38

AW: Lazarus TDBGrid Scrol funktion
 
Gibt es den generell eine Routine oder sowas, dass die Felder in den Edits füllt, wenn du im Grid was auswählst? Wie machst du das? Denn wenn das normale DBEdits sind, die an der selben DataSource hängen wie beim Grid, dann muss doch beim Datensatzwechsel nichts nachgeladen werden.

manfred_h 13. Nov 2015 12:30

AW: Lazarus TDBGrid Scrol funktion
 
Zitat:

Zitat von Jumpy (Beitrag 1321418)
Denn wenn das normale DBEdits sind, die an der selben DataSource hängen wie beim Grid, dann muss doch beim Datensatzwechsel nichts nachgeladen werden.

Es sind ganz normale DBEdits und es wird auch alles automatisch nachgeladen. Ich möchte aber das die DBEdits erst geladen werden wenn ich einen Eintrag im DBGrid anwähle.

Perlsau 13. Nov 2015 12:40

AW: Lazarus TDBGrid Scrol funktion
 
Verstehe ich nicht: Genau das passiert doch, wenn du einen Eintrag im DBGrid anwählst – vorausgesetzt, DBGrid und DBEdits hängen am selben DataSource. Sobald eine Datenmenge aktiv ist, existiert auch ein Datensatz-Zeiger. Gewöhnlich zeigt der beim Aktivieren einer Datenmenge auf den ersten Record, also den Record mit der RecNo 1. Was also meinst du genau, wenn du schreibst: "... wenn ich im Grid Scrolle wird sofort der nächste Datensatz geladen." Das ist doch genau das Verhalten, das du hier forderst:

Zitat:

Zitat von manfred_h (Beitrag 1321434)
Ich möchte aber das die DBEdits erst geladen werden wenn ich einen Eintrag im DBGrid anwähle.

:?: :roll: :wiejetzt:

Das Scrollen im DBGrid entspricht einer Weiterbewegung des Datensatzes. Wenn du ein anderes Verhalten wünschst, dann mußt du auf DBGrid verzichten und StringGrid verwenden. Oder du bastelst dir dein eigenes DBGrid, das beim Scrollen keinen Datensatzwechsel auslöst.

Wenn es dir jedoch lediglich darum geht, unnötigen Traffic zu vermeiden, dann halte die erforderliche Datenmenge im Speicher vor. Gewöhnlich gibt es dafür das Property FetchAll im jeweiligen TQuery oder TDataSet: Damit holst du alle Datensätze auf einmal ab. Voraussetzung ist natürlich, daß du über ausreichend Ram verfügst.

manfred_h 13. Nov 2015 13:26

AW: Lazarus TDBGrid Scrol funktion
 
Zitat:

Das ist doch genau das Verhalten, das du hier forderst:
Mit anwählen meinte ich einen Mausklick.. Sorry das war leider zu ungenau..:wink:
Das StringGrid wäre dann eine Variante. Dachte mir nur wenn sich da "normale" verhalten des DBGrid das beim scrollen automatisch der Datensatz-Zeiger "mit bewegt" wird anpassen liesse wäre es ein schritt weniger..

Perlsau 13. Nov 2015 16:22

AW: Lazarus TDBGrid Scrol funktion
 
Jetzt sag doch mal: Ging es dir nicht in erster Linie darum, unnötigen Traffic zu vermeiden, weil die Datenbank ja nur über eine Internetverbindung erreichbar ist? Zumindest hatte ich den Eindruck, da du ja oben im Eingangsposting geschrieben hast: "Das ist bei einer lokalen DB ok aber hier weniger." Dann wäre die Sache mit dem datenzeigerbewegenden DBGrid nämlich wurscht, weil du dann andere Lösungen ins Auge fassen könntest.

manfred_h 13. Nov 2015 16:45

AW: Lazarus TDBGrid Scrol funktion
 
Zitat:

Zitat von Perlsau (Beitrag 1321456)
Jetzt sag doch mal: Ging es dir nicht in erster Linie darum, unnötigen Traffic zu vermeiden, weil die Datenbank ja nur über eine Internetverbindung erreichbar ist?

Ja dem ist so.

Zitat:

Dann wäre die Sache mit dem datenzeigerbewegenden DBGrid nämlich wurscht, weil du dann andere Lösungen ins Auge fassen könntest
Was für eine andere Lösung denn?

Perlsau 13. Nov 2015 19:34

AW: Lazarus TDBGrid Scrol funktion
 
Zitat:

Zitat von manfred_h (Beitrag 1321460)
Was für eine andere Lösung denn?

Fragst du das jetzt im Ernst? Hatte ich oben doch bereits beschrieben:

Zitat:

Zitat von Perlsau (Beitrag 1321438)
Wenn es dir jedoch lediglich darum geht, unnötigen Traffic zu vermeiden, dann halte die erforderliche Datenmenge im Speicher vor. Gewöhnlich gibt es dafür das Property FetchAll im jeweiligen TQuery oder TDataSet: Damit holst du alle Datensätze auf einmal ab. Voraussetzung ist natürlich, daß du über ausreichend Ram verfügst.

Jetzt zitiere ich mich schon selber :gruebel:

manfred_h 14. Nov 2015 20:52

AW: Lazarus TDBGrid Scrol funktion
 
Zitat:

Fragst du das jetzt im Ernst? Hatte ich oben doch bereits beschrieben:
Ist durchaus mein ernst, da es, wie ich im ersten Post ja geschrieben habe, auch DBGrids gibt, die dies nicht so machen. Wie ich schon im ersten Post geschrieben habe:
Zitat:

Habe das TKDBGrid getestet, welches erst beim auswählen eines Eintrags im Grid die Daten lädt.http://www.tkweb.eu/en/delphicomp/kgrid.html

Ist dies nicht auch mit der normalen TDBGrid möglich?
Es geht seit dem ersten Post darum, ob das nicht auch mit dem normalen DBGrid geht. Verstehe nicht was an dieser Frage so aussergewöhnlich ist... ( freundlich gemeint ) Meine Überlegung war lediglich, dass ich gerne mit dem Standard DBGrid arbeite anstelle von noch einer zusätzlichen Komponente.

Zitat:

Wenn es dir jedoch lediglich darum geht, unnötigen Traffic zu vermeiden, dann halte die erforderliche Datenmenge im Speicher vor.
Was wird denn hierbei vermieden, es wird ja lediglich alles auf einmal geladen... das soll ja vermieden werden:wink:....

Werde mich halt ein wenig mit dem TKDBGrid auseinandersetzten.
Shalom
Manfred

Perlsau 14. Nov 2015 23:45

AW: Lazarus TDBGrid Scrol funktion
 
Zitat:

Zitat von manfred_h (Beitrag 1321499)
Zitat:

Wenn es dir jedoch lediglich darum geht, unnötigen Traffic zu vermeiden, dann halte die erforderliche Datenmenge im Speicher vor.
Was wird denn hierbei vermieden, es wird ja lediglich alles auf einmal geladen... das soll ja vermieden werden:wink:....

Das widerspricht deiner Aussage im Eröffnungsposting diametral:
Zitat:

Zitat von manfred_h (Beitrag 1321410)
Das Problem ist das wenn ich im Grid Scrolle wird sofort der nächste Datensatz geladen.

Also entweder soll der nächste Datensatz beim Scrollen geladen werden oder nicht – entscheide dich doch mal, was du eigentlich willst :evil:

Abgesehen davon verstehe dich dich noch immer nicht: Wenn du in einem DBGrid einen Record darstellen willst, dann muß der doch zuvor aus der Datenbank geladen werden. Kannst du das nicht nachvollziehen? Du kannst doch keinen Record im DB-Grid anklicken, der noch gar nicht aus der Datenbank geholt wurde! Wenn DB-Edits, die mit demselben Datasource verbunden sind, wie das DBGrid, mit dessen Hilfe du durch die Records blätterst, den neu angewählten Record anzeigen, dann beziehen sie ihre Daten aus demselben zugrundeliegenden Query wie das DBGrid. Dabei kommt es, wie bereits erwähnt, auf die Einstellungen der Properties an, ob beim Scrollen Daten nachgeladen werden müssen oder nicht.

Das mit dem Traffic ist selbstverständlich so zu verstehen, daß unter Umständen bei jedem Datensatzwechsel Daten über's Internet angefordert werden müssen, was die Bedienbarkeit einer Anwendung verschlechtern würde. Werden dagegen alle Daten gleich beim Programmstart geladen, Änderungen an den Tabellen zwischengespeichert und diese auf einmal z.B. während eines Idle-Zustands in der entfernten Datenbank aktualisiert, bleibt die Bedienbarkeit des Programms weitgehend erhalten.

Ich hoffe, mich diesmal verständlich genug für dich ausgedrückt zu haben und daß jemand anderes herauszufinden in der Lage ist, worum's hier wirklich geht. Ich fühle mich davon überfordert und gebe auf. :cyclops:

stahli 15. Nov 2015 10:10

AW: Lazarus TDBGrid Scrol funktion
 
Ich kann auch nicht ganz nachvollziehen, was Du genau suchst.

Angenommen, Deine Tabelle hat 1Mio Records und 8 Felder (A..H).
In Deinem Grid zeigst Du dann wieviel Felder an?

Ich setze jetzt mal 3 voraus (A..D).

Bei 1Mio Records kannst Du natürlich nicht alle abrufen und lokal speichern.
Also muss das Grid und der Datenbanktreiber das irgendwie stückchenweise nachladen.

Wenn Du beim Scrollen immer Daten sehen willst müssen die immer schnell nachgeladen werden, was aber dennoch etwas dauert.
Entsprechend wird das Scrollen etwas haken. Das ist aber dann nicht vermeidbar.

Oder der Datenbanktreiber weiß schon mal, dass es 1Mio Records gibt und Du kannst Dich in der Datenmenge frei bewegen, wobei scheinbar 1Mio Einträge verfügbar sind und das Scrollen flüssig funktioniert.
Dann sind aber die Zellen u.U. zunächst noch leer, weil die Daten gar nicht so schnell abgerufen werden können wie das Neuzeichnen wegen dem Scrollen es eigentlich verlangen würde. Dann müssen die Daten nachträglich abgerufen und in die Zellen geschrieben werden.
(Mit dem Weg arbeite ich im Moment.)

Ein Dritter Weg fällt mir nicht ein.

Beim Abrufen der Daten macht es aber wenig Unterschied, ob Du jetzt nur die sichtbaren Daten A-D abholst oder alle Felder von A-H (außer wenn große Binärfelder o.ä. vorliegen). Im Regelfall ist es besser, eine größere Datenmenge abzurufen, als viele kleine.


Ich kann jetzt nicht erkennen, welches Problem Du hast.
Dein Grid stellt (wie auch immer das organisiert ist) die Felder A-D dar. Die Daten müssen also abgerufen werden.

Wann willst Du jetzt welche Teildaten noch auf Klick abrufen? Hast Du sehr viele DBEdits noch neben dem Grid?

Sir Rufo 15. Nov 2015 10:51

AW: Lazarus TDBGrid Scrol funktion
 
Es geht hier wohl darum, dass beim Scrollen mit der Scrollbar/Mausrad in einem TDBGrid sich auch der aktuelle Datensatz ändert. Das gewünschte Verhalten wäre analog zu einer ListView, dort wird der aktuelle Eintrag durch explizites Anklicken desselben gesetzt.

stahli 15. Nov 2015 11:04

AW: Lazarus TDBGrid Scrol funktion
 
Ok, das hätte aber mit dem Traffic wenig zu tun.

Wenn man in den Mio Records scrollt und der aktuelle Datensatz bleibt auf dem ersten stehen, müssen ja trotzdem die Daten der hinteren Datensätze geladen werden um diese anzeigen zu können.

Aber jetzt verstehe ich das. Die gebunden Edits sollen beim scrollen noch nicht aktualisiert werden - erst beim Anklicken einer Zelle im Grid.

Dazu kann ich nichts sagen. Wenn es keine passende Option dafür gibt, wird eine eigene Lösung sicher aufwendig.

Perlsau 15. Nov 2015 11:43

AW: Lazarus TDBGrid Scrol funktion
 
Zitat:

Zitat von stahli (Beitrag 1321510)
Aber jetzt verstehe ich das. Die gebunden Edits sollen beim scrollen noch nicht aktualisiert werden - erst beim Anklicken einer Zelle im Grid.
Dazu kann ich nichts sagen. Wenn es keine passende Option dafür gibt, wird eine eigene Lösung sicher aufwendig.

Das ist nicht wirklich aufwendig: In AfterScroll der Datenmenge werden die Edits befüllt bzw. deren Befüllung angestoßen. Man darf dann eben keine DBEdits nehmen. Oder man nimmt DBEdits und arbeitet mit zwei Datasets: Dann wird im AfterScroll der ersten Datenmenge der gesuchte Datensatz der zweiten Datenmenge lokalisiert. Ist aber alles eher ungewöhnlich und dient nicht dem vom TE angegebenen Zweck, den Traffic übers Internet zu verringern.

Sir Rufo 15. Nov 2015 13:37

AW: Lazarus TDBGrid Scrol funktion
 
Generell muss man sagen, dass die Beschreibung etwas vage ist. Hier sollte der TE doch bitte etwas konkreter werden.

Ich kann nur im Nebel stochern und vermuten, dass es sich hier um ein "Master-Detail" Konstrukt handelt.
Das Master-DataSet holt die Daten für das Grid (nur die relevanten Felder für die Grid-Anzeige) und das Detail-DataSet lädt den gesamten Datensatz (alle Felder).

Bewegt man sich nun im Master von einem Datensatz zum anderen, dann wird auch das Detail-Dataset aktualisiert.

Diese Bewegung im Master soll nun auf ein Minimum reduziert werden, bzw. nur dann erfolgen, wenn im Grid eine Zeile explizit ausgewählt wird.

Bei einem TDBGrid löst allerdings die Verwendung des Mausrads auch ein Bewegen des Datensatz aus und damit ein Aktualisieren des Detail-Dataset und erzeugt somit den angesprochenen Traffic.

Das war jetzt Lesen im Kaffeesatz und es wäre freundlich vom TE hier etwas mehr Informationen zu geben.

manfred_h 16. Nov 2015 09:32

AW: Lazarus TDBGrid Scrol funktion
 
Guten Morgen
Danke für Deine ausführlichen Erläuterungen.
Du erklärst es föllig korrekt und verständlich. :thumb:

Mein Fehler war das ich das ganze nicht komplett erklärt habe. Ich wollte die Fragestellung vereinfachen, war wohl ein Schuss in den Ofen...
Es sind noch 2x Master Detail Beziehungen daran geknüpft...
Diese werden dann natürlich auch beim Datensatzwechsel nachgeladen...

Es war mein Versäumnisse dies nicht von Anfang an zu erwähnen. Sorry..
Vermutlich kannst Du meine Überlegungen nachvollziehen..
Das mit dem fetch all muss ich wirklich noch testen.(dann natürlich nur für die erste query)

Werde das ganze nochmals überdenken..
Shalom Manfred

manfred_h 16. Nov 2015 14:55

AW: Lazarus TDBGrid Scrol funktion
 
An alle die hier im Kaffeesatz lesen mussten, Sorry nochmal, war über das Wochenende nicht am Laptop.:oops:

@Sir Rufo: Das ist es, habe mich versucht im letzten Post zu Entschuldigen....:pale:
Zitat:

Ich kann nur im Nebel stochern und vermuten, dass es sich hier um ein "Master-Detail" Konstrukt handelt.
Das Master-DataSet holt die Daten für das Grid (nur die relevanten Felder für die Grid-Anzeige) und das Detail-DataSet lädt den gesamten Datensatz (alle Felder).

Bewegt man sich nun im Master von einem Datensatz zum anderen, dann wird auch das Detail-Dataset aktualisiert.

Diese Bewegung im Master soll nun auf ein Minimum reduziert werden, bzw. nur dann erfolgen, wenn im Grid eine Zeile explizit ausgewählt wird.

Bei einem TDBGrid löst allerdings die Verwendung des Mausrads auch ein Bewegen des Datensatz aus und damit ein Aktualisieren des Detail-Dataset und erzeugt somit den angesprochenen Traffic.

Die TKDBGrid Komponente wird vermutlich wie schon von Perlsau vorgeschlagen eine ~Fetsch all Funktion plus der Möglichkeit das beim Scrolling der Datensatz-Zeiger nicht bewegt wird..
Dieses verhalten hätte ich gerne mit dem standard DGGrid erledigt.

BadenPower 16. Nov 2015 15:59

AW: Lazarus TDBGrid Scrol funktion
 
Zitat:

Zitat von manfred_h (Beitrag 1321585)
...
beim Scrolling der Datensatz-Zeiger nicht bewegt wird..
Dieses verhalten hätte ich gerne mit dem standard DGGrid erledigt.

Damit der Datensatzzeiger beim Scrollen nicht automatisch bewegt wird müßtest Du nur die Procedure WMVScroll überschreiben.

manfred_h 16. Nov 2015 16:26

AW: Lazarus TDBGrid Scrol funktion
 
Zitat:

Zitat von BadenPower (Beitrag 1321588)
Damit der Datensatzzeiger beim Scrollen nicht automatisch bewegt wird müßtest Du nur die Procedure WMVScroll überschreiben.

Das hört sich interessant an, werde mich mal ein wenig schlau machen. Danke schon mal für den Tipp.

manfred_h 16. Nov 2015 17:35

AW: Lazarus TDBGrid Scrol funktion
 
Danke Euch allen für die Ideen und nochmals Sorry für die angestiftete Verwirrung.
Habe es momentan so wie auch schon von Perlsau angesprochen umgesetzt.:thumb:
Ein separates Dataset und dann im DBrid ein ClickEvent:

Delphi-Quellcode:
procedure Tfrm_test.main_dbgridCellClick(Column: TColumn);
begin
     DM.ApplyFilter(dm_test.tbl_test,'((ID = ''' + dm_test.tbl_test_list.Dataset.FieldByName('ID').AsString + ''') )','');
end;
Dies geht nun wirklich schenller und war auch einfach umgesetzt.
Shalom
Manfred


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:47 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