Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Client Data Set suchen nach Stichwörter/Einzelnen Buchstaben (https://www.delphipraxis.net/179752-client-data-set-suchen-nach-stichwoerter-einzelnen-buchstaben.html)

Luki206 29. Mär 2014 14:13

Client Data Set suchen nach Stichwörter/Einzelnen Buchstaben
 
Hi, ich stehe jetzt gerade vor dem Problem: Wie kann man ein Suchfeld so programmieren das ich passende Inhalte so angezeigt bekomme ohne das ich den kompletten Namen dieses Felds eingeben muss? Weil im Moment suche ich noch so im Client Data Set mit
Delphi-Quellcode:
CDS.Locate(...);
und da muss ich ja wirklich den Inhalt eines Feldes wirklich so in mein Edit Feld schreiben damit ich dort hin navigiert werde. Ich denke so an die Methode wie es die Forensuche auch macht das wenn keine Übereinstimmungen gefunden wurden so ähnliche Artikel angezeigt werden.
Danke
Luki :)

Hansa 29. Mär 2014 14:37

AW: Client Data Set suchen nach Stichwörter/Einzelnen Buchstaben
 
Versuch mal Such%

Luki206 29. Mär 2014 15:21

AW: Client Data Set suchen nach Stichwörter/Einzelnen Buchstaben
 
Hä? Wie jetzt? :D

DeddyH 29. Mär 2014 15:33

AW: Client Data Set suchen nach Stichwörter/Einzelnen Buchstaben
 
Schau Dir die Parameter von Locate doch einmal genau an, besonders den letzten.

Luki206 30. Mär 2014 14:35

AW: Client Data Set suchen nach Stichwörter/Einzelnen Buchstaben
 
Ja ok danke, nur wie kann ich das ganze in eine Liste packen und nicht das es im DBGrid angezeigt wird? Also alle übereinstimmende Treffer?

Perlsau 30. Mär 2014 16:25

AW: Client Data Set suchen nach Stichwörter/Einzelnen Buchstaben
 
Zitat:

Zitat von Luki206 (Beitrag 1254026)
Ja ok danke, nur wie kann ich das ganze in eine Liste packen und nicht das es im DBGrid angezeigt wird? Also alle übereinstimmende Treffer?

Offensichtlich hast du DeddyH's Rat nicht befolgt, dir in der Online-Hilfe Locate einmal genauer anzuschauen, denn sonst würdest du bemerkt haben, daß Locate den Datensatz-Zeiger verschiebt, wenn die Methode etwas gefunden hat und keine Datenmenge zurückliefert, wie du das erwartest.

Für gefilterte Datenmengen setzt du entweder den Filter des Datasets ein – genau! die Namensähnlichkeit mit dem, was du suchst, ist nicht zufällig – oder du filterst bereits im Dataset via SQL-Statement, indem du die Where-Klausel entsprechend setzt.

Und jetzt frag bitte nicht gleich wieder, wie das geht, sondern schau dir zuerst einmal die entsprechenden Punkte in der Online-Hilfe an, dort steht das nämlich genau drin. Falls deine nur auf Englisch ist und du Englisch nicht gut kannst, benutze die hiesige Delphi-Referenz.

sx2008 30. Mär 2014 16:28

AW: Client Data Set suchen nach Stichwörter/Einzelnen Buchstaben
 
Willst du suchen oder filtern?

Suchen
das Dataset wird von Vorne nach Hinten (oder umgekehrte Suchrichtung) durchsucht und bei jedem Treffer bleibt der Datensatzcursor im betreffenden Datensatz stehen.
Danach muss der Benutzer die Suche neu anstoßen wenn er weitere Treffer sehen möchte.
Sollte die Suche keinen (weiteren) Treffer ergeben muss der Benutzer durch eine Meldung oder sonstigen Hinweis darauf hingewiesen werden.

Die
Delphi-Quellcode:
Locate
-Methode ist auch eine Suchfunktion; sie hat aber den Mangel dass man nicht von der aktuellen Position weitersuchen kann. Ausserdem kann man mit Locate nicht in allen Feldern suchen ("Volltextsuche").

Filtern
Es werden nur Datensätze angezeigt die dem Suchmuster entsprechen. Dazu wird das Event
Delphi-Quellcode:
OnFilterRecord
verwendet.

Perlsau 30. Mär 2014 16:34

AW: Client Data Set suchen nach Stichwörter/Einzelnen Buchstaben
 
Zitat:

Zitat von sx2008 (Beitrag 1254041)
Filtern
Es werden nur Datensätze angezeigt die dem Suchmuster entsprechen. Dazu wird das Event
Delphi-Quellcode:
OnFilterRecord
verwendet.

Mit Verlaub, aber das ist nicht richtig. Auszug aus der Delphi-Referenz:

TClientDataSet.OnFilterRecord
Wird jedes Mal ausgelöst, wenn ein anderer Datensatz in der Datenmenge aktiviert und ein Filter verwendet wird.

TClientDataSet.Filter
Gibt den Text des aktuellen Filters einer Datenmenge an.

TClientDataSet.Filtered
Gibt an, ob für die Datenmenge ein Filter aktiv ist.

Sir Rufo 30. Mär 2014 18:23

AW: Client Data Set suchen nach Stichwörter/Einzelnen Buchstaben
 
Wenn eine DataSet gefiltert werden soll, dann muss Delphi-Referenz durchsuchenTDataSet.Filtered auf
Delphi-Quellcode:
True
und entweder man schreibt etwas in Delphi-Referenz durchsuchenTDataSet.Filter und/oder benutzt den Event

Delphi-Referenz durchsuchenTDataSet.OnFilterRecord:

Wenn der Datensatz die Kriterien erfüllt, dann setzt man einfach
Delphi-Quellcode:
Accept
auf
Delphi-Quellcode:
true
und der Datensatz wird in der gefilterten Menge mit angezeigt. Ansonsten einfach auf
Delphi-Quellcode:
False
und der Datensatz gehört nicht mehr zur gefilterten Menge.

sx2008 30. Mär 2014 18:38

AW: Client Data Set suchen nach Stichwörter/Einzelnen Buchstaben
 
Zitat:

Zitat von Perlsau (Beitrag 1254043)
Zitat:

Zitat von sx2008 (Beitrag 1254041)
Filtern
Es werden nur Datensätze angezeigt die dem Suchmuster entsprechen. Dazu wird das Event
Delphi-Quellcode:
OnFilterRecord
verwendet.

Mit Verlaub, aber das ist nicht richtig. ...

Ich bin davon ausgegangen dass ein Volltextfilter für alle Felder des Datasets durchgeführt werden soll.
Die eingebauten Fähigkeiten des Datasets sind dafür aber nicht ausreichend weshalb auf jeden Fall Sourcecode nötig wird um eine gute und allgemeingültige Lösung zu finden.
Dazu das Kochrezept:
Delphi-Quellcode:
Accept := False;
for i := 0 to Dataset.Fields.Count-1 do
begin
  f := Dataset.Fields[i];
  if not f.IsNull and f.Visible then
  begin
    // Ggf. müssen bestimmte Feldtypen ausgeschlossen werden (Felder mit binärem Inhalt, TBlobField)

    s := f.Text;
    // die WildCompare Funktion liefert True wenn ein String auf das Suchmuster, das ? und * enthalten darf, passt
    // passende Funktionen findet man hier in der DP
    // Wer mag kann dafür auch reguläre Ausdrücke einsetzen (könnte aber den Benutzer damit überfordern)
    if WildCompare(s, suchpattern) then
    begin
      Accept := True;
      break;
    end;
  end;
end;


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