Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Query auslesen und in ein Grid einlesen (https://www.delphipraxis.net/161663-query-auslesen-und-ein-grid-einlesen.html)

juergen 14. Jul 2011 18:29

Datenbank: Pervasive • Version: 10 • Zugriff über: PDAC

Query auslesen und in ein Grid einlesen
 
Hallo zusammen,

ich versuche ein nicht datengebundenes Grid zu befüllen, ausgehend von einer Query (ca. 12.000 Datensätze und 36 Spalten).
Die zweite Spalte wird nun auch schon wie gewünscht befüllt. :stupid:

Im Moment habe ich aber noch 2 Probleme:

1. Wie kann man in der Schleife das FieldbyName() so ersetzen, dass man über einen Integer (i) auf die verschiedenen Spalten zugreifen kann? So dass man dann in "einem Rutsch" alle Spalten füllen kann.
2. Mit unten aufgeführtem Code benötigt das ganze jetzt schon 3 Minuten! Für eine Spalte! Dabei sind es nur knapp 12.000 Datensätze.

Delphi-Quellcode:
  for i := 0 to DatabaseModul.PvswQuery_1.FieldCount - 1 do begin
    j := 0;
    while not DatabaseModul.PvswQuery_1.EoF do begin
      tv_1.DataController.AppendRecord; //ist beim Quantumgrid notwendig
      tv_1.DataController.Values[J, I + 1] := DatabaseModul.PvswQuery_1.FieldByName('kundenname').AsString; // I + 1 deswegen, weil die 1. Spalte schon verwendet wird...
      DatabaseModul.PvswQuery_1.Next;
      inc(j);
    end;
  end;
  DatabaseModul.PvswQuery_1.Close;

Für Eure Hilfe schon mal jetzt ein Danke im Voraus!

omata 14. Jul 2011 18:40

AW: Query auslesen und in ein Grid einlesen
 
Zitat:

Zitat von juergen (Beitrag 1111774)
1. Wie kann man in der Schleife das FieldbyName() so ersetzen, dass man über einen Integer (i) auf die verschiedenen Spalten zugreifen kann?

Delphi-Quellcode:
  tv_1.DataController.Values[J, I + 1]:=
    DatabaseModul.PvswQuery_1.Fields[I].AsString;

haentschman 14. Jul 2011 19:18

AW: Query auslesen und in ein Grid einlesen
 
Nur so am Rande...
Zitat:

Dabei sind es nur knapp 12.000 Datensätze.
...wer bitte soll sich durch das Grid scrollen ? Müssen immer alle gelesen werden ? Gibts an deinem Grid EnableControls / DisableControls ? Dann wäre das zu empfehlen...

juergen 14. Jul 2011 20:26

AW: Query auslesen und in ein Grid einlesen
 
Hallo Omata!

vielen Dank für deinen Hinweis auf Fields! :thumb:
Es funktioniert nun auch alles. 8-)
Allerdings dauert das Laden schon 3-4 Minuten....

Ich hatte jetzt mit Dataset rumgespielt, ändert an der Geschwindigkeit aber auch nichts...
Die Query ist in 1 Sekunde geladen. Der nachfolgende Code benötigt die o.g. Zeit:
Delphi-Quellcode:
  //**** laden der Daten aus der Query in das Grid im OnCreate-Event der Haupt-Form
  begin
    cx_Grid_1.BeginUpdate;
    row_ID := 0;
    while not DatabaseModul.PvswQuery_1.EoF do begin
      tv_1.DataController.AppendRecord;

      // !!! die erste Spalte im Grid ist schon vorbelegt mit anderen Daten deswegen die Schleife ab 1
      for col_ID := 1 to DatabaseModul.PvswQuery_1.FieldCount - 1 do begin
        tv_1.DataController.Values[row_ID, col_ID] := DatabaseModul.PvswQuery_1.Fields[col_ID - 1].AsString;
      end;

      DatabaseModul.PvswQuery_1.Next;
      inc(col_ID);
      inc(row_ID);
    end;
    cx_Grid_1.EndUpdate;
    DatabaseModul.PvswQuery_1.Close;
  end;
`
Kennt jemand hier noch Optimierungsmöglichkeiten?
Danke!

@haentschman,
Ich nutze das Quantumgrid. Dort lassen sich die Daten wunderbar filtern und gruppieren. Da aber nach allen(!) Werten der 36 Spalten gefiltert werden können soll, muss ich alle Daten laden...

Edt: Fehler behoben (col_ID - 1)...

jaenicke 15. Jul 2011 05:05

AW: Query auslesen und in ein Grid einlesen
 
Zitat:

Zitat von juergen (Beitrag 1111793)
Kennt jemand hier noch Optimierungsmöglichkeiten?

Nimm einfach eine schnellere Komponente, nämlich z.B. die TVirtualStringTree. ;-)

FredlFesl 15. Jul 2011 07:21

AW: Query auslesen und in ein Grid einlesen
 
Kann das VST denn auch so komfortabel gruppieren und filtern (ohne eine Zeile Code)? Nebenbei: Schneller als ein TcxGrid ist das auch nicht. Das Grid lädt nur defaultmäßig alle Daten, um eben die Filterdropdownlisten zu befüllen. Spätestens beim Sortieren müssen eh alle Daten angefasst werden.

1. Wieso muss es ein handbefülltes Grid sein? Nimm doch einfach das TcxGridDBTableView, bei 12k Datensätzen geht das Ratzfatz.
2. Noch schneller (fast instantan) geht es, wenn Du den GridMode (glaub, das war es) änderst. Dann werden nur die sichtbaren Daten geladen.
4. Dann klappt das aber nicht mehr mit dem 'nach allen Feldinhalten filtern'.
5. Ätsch, klappt doch. Du musst dann aber per 'select distinct Feld from Tabelle' die Filterdropdownlisten selbst erzeugen. Schau mal in den Events danach. Da gibts sowas wie OnGetFilterList oder so.

Ich würde mal mit 1 anfangen. Sollte wirklich ausreichend schnell sein, jedenfalls viel schneller als deine Methode.

PS: Wenn es (wieso auch immer) ein nicht datengebundenes Grid sein muss, verwende eine UserDatasource, anstatt das Grid per Hand zu befüllen.

Ich habe hier ein Testprojekt, das 100.000 Daten (6 Spalten) in ca. 1.5 Sekunden darstellt. Inklusive Einlesen einer CSV-Datei und komplett mit der Möglichkeit zum filtern, sortieren und gruppieren.

@Jänicke: wäre das eine DB-Tabelle, hätte ich keine einzige Zeile Code schreiben müssen und hätte ein sehr mächtiges Datenanzeige, -eingabe, -analysewerkzeug mit der Möglichkteit, die Daten in Tabellen-, Karten- oder Linien- bzw. Barchartform darzustellen. Kann VST das auch? ;-)

juergen 15. Jul 2011 08:17

AW: Query auslesen und in ein Grid einlesen
 
Hallo Sebastian,

das Quantumgrid liefert mir "fix und fertig" mächtige Funktionen, wo ich auch nicht in der Lage wäres diese für das VST umzusetzen (in einem sinnvollen, zeitlichen Rahmen).
Mit den benötigten Sortier- Gruppier- und Filterfunktionen wäre wahrscheinlich auch ein VST nicht viel schneller.


@FredlFesl,

zu 1. Das hatte ich schon als erste Variante. :wink: Das laden geht dann wesentlich schneller, aber das Grid ist dann auch in der gesamten Bedienung "schleppend". Schon das anhaken einer Chekcbox dauerte ca. 0,7 Sekunden. Deswegen habe ich umgestellt auf ein Grid ohne Datenanbindung. Wenn das Grid erst einmal geladen ist, ist das gesamte Verhalten wesentlich schneller und völlig in Ordnung, auch bei noch größeren Datenmengen.
Den "GridMode" kann ich nicht aktivieren, da die Filterungen ausgiebig benötigt werden. Wie gesagt, wenn das Grid erst mal befüllt ist, ist das Tempo absolut ausreichend.

Es gibt eine Demo für das unbounded Grid wo die Daten aus einer StringList geladen werden. Nur muss ich die StringList ja auch erst einmal aus der Query befüllen. Da weiß ich nicht wie lange das dauern würde.

Die Query ist in knapp 1 Sekunde mit Daten geladen. Daran liegt es also nicht.

Trotzdem Danke für Eure Hinweise! :thumb:

jaenicke 15. Jul 2011 08:52

AW: Query auslesen und in ein Grid einlesen
 
Zitat:

Zitat von FredlFesl (Beitrag 1111831)
Kann das VST denn auch so komfortabel gruppieren und filtern (ohne eine Zeile Code)? Nebenbei: Schneller als ein TcxGrid ist das auch nicht. Das Grid lädt nur defaultmäßig alle Daten, um eben die Filterdropdownlisten zu befüllen. Spätestens beim Sortieren müssen eh alle Daten angefasst werden.

Eben das ist der Unterschied:
Es werden die Daten angefasst und nicht alles als Strings schon einmal in die Oberfläche gelegt. Das heißt du kannst beim VST sortieren usw. ohne dass der Anzeigetext der meisten Knoten ein einziges Mal abgerufen oder im Baum angezeigt wird.

Genau das macht es so extrem schnell. Ich hatte in einem Baum auch schon ca. 400.000 Knoten, das Einlesen dauerte ca. 50 Millisekunden und das Filtern ging auch so schnell, dass ich einen Livefilter bei der Eingabe in den Header einbinden konnte.

Genau die Geschwindigkeit ist aber auch der Nachteil, denn da es eben die Einträge nicht schon hat, muss man logischerweise viel selbst machen. Aber dafür hat man eben auch einen sehr hohen Geschwindigkeitszuwachs gegenüber jeder Gridkomponente, die ich bisher gesehen habe.

juergen 15. Jul 2011 17:48

AW: Query auslesen und in ein Grid einlesen
 
Hallo zusammen,

der Vollständigkeitshalber hier mein Nachtrag, falls jemand mal daselbe Problem hat:
Das Problem bei mir lag am falschen BeginUpdate und EndUpdate. :wall:
Ich hatte dieses auf das Grid angewendet, muss es aber auf die TableView anwenden! :oops: Nun startet alles in 2-3 Sekunden.

Alles wird Gut...

Allen ein schönes Wochenende!

FredlFesl 15. Jul 2011 18:52

AW: Query auslesen und in ein Grid einlesen
 
Zitat:

Zitat von jaenicke (Beitrag 1111849)
Eben das ist der Unterschied: Es werden die Daten angefasst und nicht alles als Strings schon einmal in die Oberfläche gelegt. Das heißt du kannst beim VST sortieren usw. ohne dass der Anzeigetext der meisten Knoten ein einziges Mal abgerufen oder im Baum angezeigt wird.

Wird reden von einem G-R-I-D, nicht von einem Baum (ist beim VST vielleicht das Gleiche).
Aber Eines musst Du mir trotzdem erklären: Wie soll man ein ganzes Grid sortieren, ohne alle Datensätze einzulesen? Kapier ich nicht. Ebenso das Gruppieren und eine Filter-Dropdownliste: Wie soll das gehen, ohne alle Daten (dieser Spalte) zu kennen?

Wenn ich in einem TcxGrid alle Zellen befülle, so wie der Fragesteller, dauert es natürlich ein Weilchen. Verwende ich die DB-Version oder ein eigenes Dataset, dann passiert im Hintergrund genau das, wofür Du das VST so lobst. Es werden nur die Datensätze gezogen, die für die Operation notwendig sind.

Unabhängig davon denke ich jedoch, das VST wirklich jeden Cent wert ist, den es nicht kostet!


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:57 Uhr.
Seite 1 von 2  1 2      

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