Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Tabellenzeilen in virtueller ListView darstellen??? (https://www.delphipraxis.net/207076-tabellenzeilen-virtueller-listview-darstellen.html)

Marco Steinebach 22. Feb 2021 20:19

Datenbank: Firebird • Version: 3.x • Zugriff über: ADO

Tabellenzeilen in virtueller ListView darstellen???
 
Hallo zusammen,
Ich habe mich, mittels ADO, zu einer FireBird-DB verbunden.
Nun, träumt mir, dass ich die via Select-Anweisung ausgelesenen Datensätze, irgendwie, in einer ListView darstellen kann.
Soweit, so klar, einfach mit next bis zu EOF durchlaufen, und gut is.
Aber geht das auch mit einer Virtuellen Liste?
Und wenn ja, ;-), wie?
Zumindest kann ich ja rausfinden, wieviele Elemente meine Query ausgespuckt hat...

Ach ja: DBGrid geht bei mir nicht, weil der Inhalt von meinem Screen-Reader nicht vernünftig angezeigt wird, und ich zum Editieren sowieso ein eigenes Dialogfeld mit lauter schönen, einzelnen, Eingabefeldern nehmen möchte.

Herzlich grüßt
Marco

Fritzew 22. Feb 2021 21:05

AW: Tabellenzeilen in virtueller ListView darstellen???
 
Hallo Marco

bin jetzt nicht am PC, aber als Ansatz
wenn Virtuelle Liste, muss die Query offen bleiben.
Du brauchst auch etwas eindeutiges um vom Index der Listview auf die Query zugreifen zu können, ak Findley oder so
Dann kannst Du im Event GetData die Query positionieren um an die Daten zu kommen.

Gruss Fritz.

PS: Welchen Screenreader benutzt Du?

Marco Steinebach 22. Feb 2021 21:19

AW: Tabellenzeilen in virtueller ListView darstellen???
 
Huhu Fritz,
Als Screenreader benutze ich JAWS, hab hier aber auch NVDA drauf.

Offenbleiben kann die Query ja, aber mit was positioniere ich?

Herzlich grüßt
Marco

Fritzew 22. Feb 2021 21:25

AW: Tabellenzeilen in virtueller ListView darstellen???
 
Hi Marco,
Wie gesagt bin nicht am Rechner aber entweder locate(xxxx) oder findkey sollte helfen

Wegen dem Screenreader habe ich gefragt da ich für einen Bekannten etwas suche. (Nicht Werner)
aber die Szene ist etwas undurchsichtig für mich.

PS: Wenn Du interessiert bist könnten wir auch über PM oder so mal diskutieren.
Gruss Fritz

Marco Steinebach 22. Feb 2021 22:41

AW: Tabellenzeilen in virtueller ListView darstellen???
 
Huhu Fritz,
Immer gerne:
marco.steinebach@blindreiten.de

Herzlich grüßt
Marco

Marco Steinebach 26. Feb 2021 23:49

AW: Tabellenzeilen in virtueller ListView darstellen???
 
Hallo zusammen,
Ich bin ein Stück weiter, hab 'ne Menge über Datasets und co gelesen, wenn ich die ListView einfach durchlaufe und fülle, ist alles schön.
Aber ich kriege nicht raus, wie ich im onData der ListView sagen soll:
dataset.gehe zu Datensatz nr item.index.
Mit locate könnte es gehen, aber ich habe in meiner Datenbank nix, was einfach von 0 bis zur Datensatzanzahl mitläuft. Klar gibt es einen eindeutigen Identifier, aber der kann, werden Datensätze gelöscht, natürlich auch lücken haben.
Also bräuchte ich entweder was, tja, s.o., oder ich kann meinem SQL-Statement irgendwas hinzufügen, dass einfach eine, immer um 1 erhöhte Nummer, in das Dataset einfügt.

Ich bitte nochmal um Hilfe und grüße herzlich
Marco

jobo 27. Feb 2021 06:03

AW: Tabellenzeilen in virtueller ListView darstellen???
 
Ich bin mir nicht sicher, ob ich das Problem richtig verstehe. Zu virtuellen Listviews kann ich auch nichts sagen.
Die Gegenfrage: Was bringt es Dir, zu Dataset Nr x zu gehen?
Du willst doch sicher zu einem Datensatz, der eine bestimmte Information hält, statt zu einer nichtssagenden Nummer zu springen?

Auf Datenbankseite gibt es Werkzeuge, um solche Nummern wie Du sie möchtest zu erzeugen. Unter Firebird war es mal "generator", allgemein "sequence". Im Grunde eine parameterlose Funktion, die bei Abfrage immer einen neuen Wert ausspuckt, normalerweise jeweils 1 höher als die letzte Ausgabe.
Diese Funktion wird meist eingesetzt, um eindeutige ID zu erzeugen, die in der Tabelle als Primärschlüssel genutzt werden.
Sie kann auch einfach in einem Select Statement genutzt werden, also ohne die Ausgabe in eine Tabellenspalte zu speichern.

Man muss dabei berücksichtigen, dass eine solche Sequence zwar schön brav aufsteigende Zahlen liefert, in der Datenbankwelt spielt die Reihenfolge jedoch keine Rolle. Die Reihenfolge von Datensatzausgaben wird durch eine Sortieranweisung erzeugt (order by), ohne diese Anweisung ist sie zufällig.

Fortlaufende Nummern in Delphi gemäß Deiner Formulierung würde ich in einem Array verorten, den Arrayindex. (Der nichts mit einem Datenbankindex zu tun hat). Vielleicht gibt es eine solche Eigenschaft und daraus ableitende Funktionen auch im virtuellen Listview.

Delphi.Narium 27. Feb 2021 16:45

AW: Tabellenzeilen in virtueller ListView darstellen???
 
Du hast doch 'nen eindeutigen Identifier, der kommt mit ins Select und geht auch mit in die ListView.
Delphi-Quellcode:
if ADOQuery.Locate('Name Der Identifier Spalte Im Select',Identifier_Aus_Dem_ListView,[]) then begin
  // Mach was mit dem Satz.
end else begin
  // Den Satz gibt es nicht mehr oder er wurde (aus welchem Grund auch immer) nicht gefunden.
end;
Damit positionierst Du die ADOQuery auf dem Satz, der dem eindeutigen Identifier entspricht.

Marco Steinebach 1. Mär 2021 19:48

AW: Tabellenzeilen in virtueller ListView darstellen???
 
Hallo zusammen,
Was den "eindeutigen Identifier" angeht, hab ich den, natürlich, aber da sind, werden Datensätze gelöscht, Löcher drin, sprich:
1, 2, 5, 6, 7 (5 Elemente)
und die List hätte im onData gern für das Item 3 einen Datensatz, für den es aber keinen Identifier mehr gibt.

Falls nochmal jemand drüber fällt, hier die Lösung:
Zunächst brauchen wir mal die wirkliche Menge der Einträge, die in der Listview angezeigt werden sollen:
Code:
query.sql.text := 'select count(*) as anzahl from adressen';
query.open;
listview1.items.count := query.fieldByName('anzahl');
query.close;
Dann brauchen wir, bevor es losgeht, die Spaltenbreiten für die einzelnen Spalten der Listview, hier nur mal als Beispiel:
Code:
query.sql.text := 'select suchbegriff, char_length(suchbegriff) as laenge from adressen order by laenge desc';
query.open;
listview1.columns[0].width := listview1.canvas.textWidth(abfrage.fieldByName('Suchbegriff').asString);
query.close;
query.sql.text := 'select Nachname, char_length(nachname) as laenge from adressen order by laenge desc';
...
Ist zwar ein bisschen mühsam, aber mir will nicht einfallen, wie man die Abfragen für jede Spalte kombinieren könnte.
Und zum guten Schluss brauchen wir das onData für die Listview:
Code:
// irgendwo beim Erstellen der Listview:
query.sql.text := 'select row_number() over (order by Nachname) as x, nachname, vorname from adressen;';
query.open;
// im eigentlichen onData:
query.locate('x', item.index, []);
item.caption := query.fieldByName('Suchbegriff');
Herzlich grüßt
Marco

Blup 1. Mär 2021 20:32

AW: Tabellenzeilen in virtueller ListView darstellen???
 
Die einfachste Lösung, lies alle Daten (inclusive ID) in Objekte und häng diese in eine Objektliste.
Wenn die Query nicht zu langsam ist, dürften 10000 oder mehr Zeilen auch kein Problem sein.

Übriegens eignet sich "TDrawgrid" auch gut für Anzeigen und Bearbeiten von Datenobjekten.
OnGetText, OnSetText implementieren und RowCount setzen.


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