Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Daten schnell in VST laden (https://www.delphipraxis.net/154537-daten-schnell-vst-laden.html)

youuu 14. Sep 2010 21:09

Datenbank: mysql • Version: 5.x • Zugriff über: devart

Daten schnell in VST laden
 
Hi,

wie lade ich am schnellsten mehrere 1.000 Daten in ein VST?
Momentan mach ich es über (gekürzt):
Delphi-Quellcode:
    liste.test1:= Query.FieldByName('test1').AsWideString;    
    Vst.addchild(nil, liste);
Jedoch dauert diese Art extrem lange.

wicht 14. Sep 2010 21:39

AW: Daten schnell in VST laden
 
Delphi-Quellcode:
Vst.RootNodeCount := 10000;
und dann im OnGetText-Event den passenden Text rausgeben. Das wäre eine Möglichkeit.

Satty67 14. Sep 2010 21:56

AW: Daten schnell in VST laden
 
Ja, denke wie bei jedem WinControl (z.B. auch StringGrid) bei größeren Datenmengen nichts in das Control laden sondern nur den sichbaren Abschnitt aus der externen Datenquelle laden und bereit stellen.

Luckie 14. Sep 2010 23:47

AW: Daten schnell in VST laden
 
Was soll der Benutzer mit tausend Datensätzen anfangen? Ich wäre da ziemlich überfordert, wenn ich die alle durchsehen müsste, um meine gewünschte Information zu bekommen.

wicht 15. Sep 2010 00:23

AW: Daten schnell in VST laden
 
Das ist natürlich wahr, aber eben eine der Stärken des VST :P

Die Frage ist auch noch, falls das hier youuu alles nicht so weiterhilft, wie er den Baum befüllt. Von welchem Typ ist das Objekt "liste"? Meine Zeit mit den DB-Komponenten ist lange vorbei... Macht er erst eine Query, iteriert dann über das Ergebnis und fügt jedes Node einzeln hinzu? Der Fehler wird vermutlich sein, dass das virtuelle Paradigma, oder wie man das nennt, hier nicht befolgt wurde. Selbst ein simples VST.Add() geht glaube ich noch recht schnell, auch wenn man es sehr sehr oft hintereinander aufruft. Das RootNodeCount ist aber der bessere Weg, denke ich.

Ich würde es mal so versuchen:
Query machen, Ergebnis irgendwo merken, RootNodeCount auf die Anzahl der Zeilen im Ergebnis setzen. Im OnGetText-Ereignis dann auf das gecachete Query-Ergebnis zugreifen und den passenden Text rausrücken. Dabei könnte man zum Beispiel den Index des Nodes, für welches OnGetText aufgerufen wird, benutzen, um die passenden Daten aus der Ergebnismenge herauszufischen.

Falls das auch noch nicht reicht.. etwas mehr Code, bitte :-D.. und Entschuldigung für meine sehr knappe Antwort von vorhin. Ich musste weg, aber musste trotzdem noch antworten, war so ein innerer Zwang.

Gute Nacht.

youuu 15. Sep 2010 07:17

AW: Daten schnell in VST laden
 
Morgen, bin gestern eingepennt :)

Also, ich mach ein Query auf die DB, fülle die Klasse Liste und pack es in das VST.

Delphi-Quellcode:
    Query.SQL.Text := 'Query String'

    Query.Open;

    while not Query.eof do
    Begin
      Liste := TListe.Create;
      with Liste do
      Begin
        liste.test1:= Query.FieldByName('test1').AsWideString;      
        .
        .
        .
      end;

      Vst.addchild(nil, Liste);

      Query.Next;
    End;

wicht 15. Sep 2010 11:15

AW: Daten schnell in VST laden
 
Hi,

mach doch mal zwei Schleifen, eine, die z.B. ein Array mit den "Liste"-Objekten befüllt, und dann eine, die die Nodes hinzufügt, basierend auf dem Array. Und dann guck mal, welche die meiste Zeit verbraucht. Ich vermute, dass die DB-Sachen dauern, das .Add() aber ganz schnell geht. Und falls nicht, versuch es mal mit dem RootNodeCount, wie oben vorgeschlagen.

HTH

youuu 15. Sep 2010 11:18

AW: Daten schnell in VST laden
 
Dann wird aber Zeit gleich bleiben im Endeffekt?
Oder verstehe ich das falsch?

Stevie 15. Sep 2010 11:59

AW: Daten schnell in VST laden
 
RootNodeCount auf RecordCount des DataSets setzen und im GetText den Datensatz im Dataset über den NodeIndex referenzieren. Dann wird beim Scrollen durch den VST auch im Dataset gescrollt.
Delphi-Quellcode:
  ds.Open;
  vst.RootNodeCount := ds.RecordCount;

...

// Im OnGetText
// Setzt vorraus, dass du vorher Columns im VST angelegt hast,
// die vom Index genau zu seinen Feldern im Dataset passen
// ansonsten einfach nen bestimmtes Feld nehmen
  if Column > -1 then
  begin
    ds.RecNo := Node.Index + 1;
    CellText := ds.Fields[Column].AsString;
  end;
@Luckie: Solch eine pauschale Aussage halte ich für überflüssig, es gibt durchaus Anwendungsfälle, wo man viele Daten präsentiert bekommt. Ob man dann eine weitere Auswertung durchführen kann (über Filter etc) steht auf einem anderen Blatt. 2 Fälle die mir sofort einfallen: 1. Anschauen eines Logs, 2. SQL Tool

Luckie 15. Sep 2010 12:01

AW: Daten schnell in VST laden
 
Zitat:

Zitat von Stevie (Beitrag 1049773)
Ob man dann eine weitere Auswertung durchführen kann (über Filter etc) steht auf einem anderen Blatt. 2 Fälle die mir sofort einfallen: 1. Anschauen eines Logs, 2. SQL Tool

Und warum dann den Filter nicht schon vorher anwenden?

Stevie 15. Sep 2010 12:09

AW: Daten schnell in VST laden
 
Zitat:

Zitat von Luckie (Beitrag 1049774)
Zitat:

Zitat von Stevie (Beitrag 1049773)
Ob man dann eine weitere Auswertung durchführen kann (über Filter etc) steht auf einem anderen Blatt. 2 Fälle die mir sofort einfallen: 1. Anschauen eines Logs, 2. SQL Tool

Und warum dann den Filter nicht schon vorher anwenden?

Wenn ich mir ein Log anschaue, was nunmal drölftausend Einträge hat, dann bekomm ich sie präsentiert.
Dann kann Clientseitig nen Filter anwenden um auszuwerten. Was würde nach deinem Prinzip wohl passieren, wenn ich den Filte ändere? Neue Anfrage an die Datenbank/Datenquelle.
Wenn ich nen select * from tabelle_mit_fünf_millionen_datensätzen mache, dann kommen 5 Millionen Datensätze (mal davon abgesehen, ob das clever ist oder nicht)

Wird aber nun off topic - Lösungsvorschläge zum Ursprungsproblem wurden gegeben.

youuu 15. Sep 2010 12:21

AW: Daten schnell in VST laden
 
Ein Filter ist vorhanden, allerdings möchte ich vorher alle Daten holen und dann kommt der Filter der den Rest unsichtbar macht und jenachdem, ob man mehr sehen möchte wird der Filter dann abgeschwächt und holt nicht jedesmal die Daten neu rein, da das dann wieder Ewigkeiten dauert.

youuu 15. Sep 2010 12:30

AW: Daten schnell in VST laden
 
Hab es hin bekommen, Danke.

Hab nun allerdings eine weitere Frage bezüglich der Datenbankabfrage, ich denke es ist besser dies in einem neuen Thread zu tun.

Stevie 15. Sep 2010 14:43

AW: Daten schnell in VST laden
 
Geh ich richtig in der Annahme, dass du MyDAC benutzt? Dort hast du doch eine TMyQuery Komponente. Die ist (höchstwahrscheinlich?) von TDataSet abgeleitet und bietet somit alle Methoden/Eigenschaften, die du benötigst.

Edit: Falls du UniDAC benutzt, hast du die TUniQuery Komponente.


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