Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TADODataset und Locate (https://www.delphipraxis.net/151444-tadodataset-und-locate.html)

Moony 18. Mai 2010 11:04

Datenbank: MySQL / Access • Zugriff über: TADODataset

TADODataset und Locate
 
Hallo zusammen,

ich versuche meine Suchfunktion ein wenig zu erweitern. Neben dem Filer soll eine Lokalisierung des Datensatzes möglich sein. Ich gebe also einen Text im Eingabefeld ein und möchte dass der erste Datensatz in meiner Datenmenge mit dem zutreffenden Suchbegriff lokalisiert wird. Dabei ist das Feld völlig egal - es muss also nach dem Suchbegriff in allen Feldern gesucht werden. Als nice to have wäre auch eine Funktion die einen Datensatz mit einer Ähnlichkeitssuche lokalisiert.

Zum Problem:
1. Locate hat scheinbar Probleme mit Integer- bzw. nonString-Feldern und gibt hierbei eine Exception aus
2. Locate führt scheinbar eine Suche mit den Anfangsbuchstaben duch und keine Ähnlichkeitssuche.

Hoffe ihr könnt mir bei den beiden Problemen helfen. Danke im Voraus.

Gruß, Moony

mkinzler 18. Mai 2010 11:06

Re: TADODataset und Locate
 
Du kannst ja die Methode entsprechend überladen

Moony 18. Mai 2010 11:18

Re: TADODataset und Locate
 
Aber wie macht man die Routine am besten? Wenn ich doch zu fuss Datensatz für datensatz und feld für feld durchgehe daauert das unendlich lange, je nach datenmenge...

mkinzler 18. Mai 2010 11:20

Re: TADODataset und Locate
 
Z.B. per SQL Abfrage mit LIKE

Moony 18. Mai 2010 12:10

Re: TADODataset und Locate
 
Aber dann setze ich wiederum einen Filter in die Datenmenge und ich will lediglich die gesamtmenge behalten aber den richtigen datensatz lokalisieren...

mkinzler 18. Mai 2010 12:12

Re: TADODataset und Locate
 
SQL-Code:
select first <id> from <Tabelle> where <Feld1> like <Wert> or <Feld2> = <Wert> ...;
in extra Abfrage
und dann ein Locate auf die ID.

shmia 18. Mai 2010 14:25

Re: TADODataset und Locate
 
Hier kommt eine Procedure die du als Filter zur Volltextsuche einsetzen kannst:
Delphi-Quellcode:
procedure TForm1.DoFilterRecord(DataSet: TDataSet;var Accept: Boolean);
var
   i : Integer;
   fields : TFields;
begin
   fields := dataset.Fields;
   for i := 0 to fields.Count-1 do
   begin
      if CompareWildText(Suchmuster, fields[i].Text) then
      begin
         Accept := True;
         Exit;
      end;
   end;
   Accept := False;
end;
Die Funktion CompareWildText() prüft ob das Suchmuster im Datenfeld enthalten ist.
Siehe: Stringvergleich mit Wildcards

Damit kannst du jetzt also einen Volltextfilter setzen indem du das Event OnFilterRecord auf die Methode von oben richtest.
Du kannst damit aber auch Suchen.
"Suchen" ist der kleine Bruder des "Filters".

Delphi-Quellcode:
procedure TForm1.Volltextsuche(Dataset:TDataset);
var
  accept : boolean;
begin
  dataset.DisableControls;
  try
    while not Dataset.Eof do
    begin
      DoFilterRecord(Dataset, accept);
      if accept then
        break; // gefunden
      Dataset.Next;
    end;
  finally
    dataset.EnableControls;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz