AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Query auslesen und in ein Grid einlesen
Thema durchsuchen
Ansicht
Themen-Optionen

Query auslesen und in ein Grid einlesen

Ein Thema von juergen · begonnen am 14. Jul 2011 · letzter Beitrag vom 16. Jul 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.174 Beiträge
 
Delphi 11 Alexandria
 
#1

Query auslesen und in ein Grid einlesen

  Alt 14. Jul 2011, 19:29
Datenbank: Pervasive • Version: 10 • Zugriff über: PDAC
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.

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!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Query auslesen und in ein Grid einlesen

  Alt 14. Jul 2011, 19:40
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;
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#3

AW: Query auslesen und in ein Grid einlesen

  Alt 14. Jul 2011, 20:18
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...
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.174 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Query auslesen und in ein Grid einlesen

  Alt 14. Jul 2011, 21:26
Hallo Omata!

vielen Dank für deinen Hinweis auf Fields!
Es funktioniert nun auch alles.
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)...
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)

Geändert von juergen (14. Jul 2011 um 22:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.590 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Query auslesen und in ein Grid einlesen

  Alt 15. Jul 2011, 06:05
Kennt jemand hier noch Optimierungsmöglichkeiten?
Nimm einfach eine schnellere Komponente, nämlich z.B. die TVirtualStringTree.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
FredlFesl

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

AW: Query auslesen und in ein Grid einlesen

  Alt 15. Jul 2011, 08:21
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?
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.174 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Query auslesen und in ein Grid einlesen

  Alt 15. Jul 2011, 09:17
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. 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!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.590 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Query auslesen und in ein Grid einlesen

  Alt 15. Jul 2011, 09:52
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.174 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Query auslesen und in ein Grid einlesen

  Alt 15. Jul 2011, 18:48
Hallo zusammen,

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

Alles wird Gut...

Allen ein schönes Wochenende!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
FredlFesl

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

AW: Query auslesen und in ein Grid einlesen

  Alt 15. Jul 2011, 19:52
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!
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:43 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