Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Locate mit mehreren Ergebnissen (https://www.delphipraxis.net/176349-locate-mit-mehreren-ergebnissen.html)

Kaarsten 29. Aug 2013 10:03

Locate mit mehreren Ergebnissen
 
Locate ist ja sehr praktisch und schnell zum Auffinden und Anzeigen des ersten Fundes innerhalb einer Tabelle.

Wie kann ich danach auf den zweiten Fund springen, bzw. mir anzeigen lassen?

Also quasi den Anfangswert der Suche auf die Position des gefunden Wertes setzen und weitersuchen. Ist das einfach möglich, oder muss ich das konventionell machen. Dann ist Locate in diesem Fall vollkommen unbrauchbar.

Union 29. Aug 2013 10:16

AW: Locate mit mehreren Ergebnissen
 
Wenn der Index mit der zu suchenden Spalte übereinstimmt ist es besser mit FindKey und while zu arbeiten. Locate arbeitet leider optimiert, so dass der erste Fund nicht unbedingt am Anfang der zu selektierenden Datenmenge steht, sondern an irgend einer. Noch besser wäre natürlich der Einsatz von SQL.

Perlsau 29. Aug 2013 10:40

AW: Locate mit mehreren Ergebnissen
 
Zitat:

Zitat von Kaarsten (Beitrag 1226595)
Wie kann ich danach auf den zweiten Fund springen, bzw. mir anzeigen lassen?

In den meisten Queries/Datasets gibt es die Methode LocateNext, bzw. in IbDac LocateEx mit der TLocateExOption lxNext oder auch lxNearest und lxUp (rückwärts).

Wie jedoch Union oben bereits anmerkte, ist Locate für das Iterieren durch eine ausgewählte Datenmenge weniger gut geeignet, weil Locate erstens mit der Suche nicht am Anfang der Tabelle beginnt und zeitens weniger flexibel ist, was die Selektionsmöglichkkeiten betrifft. Besser wäre hier, die gewünschte Datenmenge via SQL zu selectieren und dann vom ersten bis zum letzten Datensatz mit Next zu durchzublättern (iterieren):
Delphi-Quellcode:
MyQuery.Active := False;
MyQuery.SQL.Clear;
MyQuery.SQL.Append('select * from MyTable');
MyQuery.SQL.Append('where Strasse = ' + QuotedStr('Hauptstraße'));
MyQuery.SQL.Append('order by Strasse');
MyQuery.Open;

IF MyQuery.RecordCount > 0 THEN
While not MyQuery.Eof DO
Begin
  DoSomething(MyQuery);
  MyQuery.Next;
End;

Kaarsten 2. Sep 2013 21:22

AW: Locate mit mehreren Ergebnissen
 
Tatsächlich kann LocateEx genau das, was ich gesucht hatte.

Es wird bei der weiteren Suche auf den nächsten Datensatz gesprungen.
2 Dinge muss man dazu wissen.
Die Sortierung muss für das Feld sein, welches man sucht. Anderenfalls wird die Reihenfolge innerhalb der Tabelle nicht linear abgearbeitet.

Die Uses ist nicht MemDS sondern MemData.
Und nicht vergessen den Zeiger bei veränderter Suche wieder auf den Anfang zu setzen.

Danke für Eure Hilfe.


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