![]() |
Ähnliche Datensätze in TDataSet finden
Ich möchte ein Formular zur Anzeige von Personendaten (Nachname, Adresse etc.), dessen Inhalte aus einer TADOQuery kommen, per Tastatureingabe auf einen Datensatz positionieren.
Beispiel: Bei Eingabe von "M" soll auf den ersten mit M beginnenden Nachnamen (z.B. "Mahr") positioniert werden. Die Datensätze sind schon alphabetisch nach Nachname sortiert. Locate zieht offensichtlich nur bei exakter Übereinstimmung, ich bräuchte sowas wie den LIKE-Operator in SQL. SQL kann ich aber nicht nehmen, weil ich die Datenmenge ja nicht einschränken will, sondern nur eine Positionierung nach Eingabe des Buchstabens vorgenommen werden soll. Es sollen weiterhin alle Datensätze im Recordset vorhanden sein, damit man per Datensatznavigationsleiste durchsteppen kann. Ideen ? :gruebel: |
Re: Ähnliche Datensätze in TDataSet finden
schau dir mal die Filtereigenschaften an und Prozeduren wie FindFirst
ka in wie weit TADOQuery die hat, aber sollten da auch drin sein. Dann kannst du einen Filter setzten mit beispielsweise:
Delphi-Quellcode:
dann entweder FindFirst() oder einfach filtern, den ersten datensatz merken, filter wieder rausmachen und auf den datensatz springen.
'nachname = "' + txtFeld.Text + '*"'
|
Re: Ähnliche Datensätze in TDataSet finden
Wenn Du nicht Filtern möchtest, könntest Du es in etwa so machen
Delphi-Quellcode:
Mann - bin ich wieder nett heute - na ja - bald ist Weihnachten :-)
procedure DeinForm.DeinDbGridKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin if (Key = 83) and (ssCtrl in Shift) then begin // Ctrl+S - wie Suchen Key := 0; DeinEdit.SetFocus; end; end; procedure DeinForm.DeinEditKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); var LenSearch : Integer; DerAusgangsPunkt : TBookmark; Gefunden : Boolean; begin if (Key in [VK_RETURN,VK_ESCAPE]) then FlbxList.SetFocus DeinEdit.Color := clWindows; // Farbe normalisieren DeinEdit.Text := ''; // Suchtext löschen DeinDbGrid.SetFocus; // Suchedit verlassen und ins Grid springen else begin if Key in [8,13,33..40,45..46,65..90,186,192,219,222] then begin // Gültige bzw. suchbare Buchstaben LenSearch := length(DeinEdit.Text); Gefunden := False; if LenSearch > 0 then begin DerAusgangsPunkt := DeinDataSet.GetBookmark; DeinDataSet.DisableControls; // Es soll ja nicht Flimmern nicht wahr? DeinEdit.Color := $00CECEFF; // SuchEdit leicht rot färben Gefunden := False; DeinDataSet.First; While not DeinDataSet.Eof do begin if (copy(DeinDataSet.FieldByName('DeinSuchFeld').AsString,1,LenSearch) = DeinEdit.Text) then begin Gefunden := True; Break; end; DeinDataSet.Next; end; end; if Gefunden then begin DeinEdit.Color := $00CEFFCE; // Edit leicht grün (Erfolg) end else begin DeinEdit.Color := $00CECEFF; // Edit leicht rot (Mißerfolg) DeinDataSet.GotoBookmark(DerAusgangsPunkt); end; DeinDataSet.EnableControls; FreeAndNil(DerAusgangsPunkt); end; end; end; Gruß |
Re: Ähnliche Datensätze in TDataSet finden
@smokey:
Der von Dir vorgeschlagene Filteransatz scheint nicht zu klappen, bei Drücken der Taste 'k' wird mit
Delphi-Quellcode:
kein einziger Datensatz gefunden, während die SQL-Abfrage
filter:= 'nachname = "' + Key + '*"'
filtered:= true;
Delphi-Quellcode:
mehrere Datensätze liefert.
WHERE nachname like "k*"
Bist Du sicher, dass der Stern in der Filtereigenschaft zulässig ist ? Ich denke, man kann nur auf Gleichheit abfragen. Die Filterfunktion ist doch ziemlich eingeschränkt. |
Re: Ähnliche Datensätze in TDataSet finden
Hallo,
wenn du nur die jeweils erste Übereinstimmung des eingegebenen Parameters finden willst, dann funktioniert Locate normalerweise schon. Du musst nur die LocateOptions korrekt setzen:
Delphi-Quellcode:
DataSet.Locate('nachname', Edit1.Text, [loCaseInsensitive, loPartialKey])
|
Re: Ähnliche Datensätze in TDataSet finden
@Garby: Das war genau das, was ich suchte. Einfach, schnell und elegant...
Danke natürlich auch für die anderen Hinweise. Wieder viel gelernt heute :mrgreen: |
Re: Ähnliche Datensätze in TDataSet finden
Hm jo hab vergessen dir zu sagen, dass in den Filteroptions noch was eingestellt werden muss. Aber steht ja alles in der DelphiHilfe 8)
Schau mal nach dem Thema Setting the Filter property Das Locate ist zum Teil ne Tolle Sache, aber bei mir völlig unnütz. Ich habe RefID's die so zB aussehen: 1-1-1 1-1-116 1-3-45 Wenn ich dann im Suchfeld 1-1-11 eingebe, soll er logischerweise auf den 2ten Datensatz. Nur tut er das mit Locate nicht und bleibt immer schön auf Datensatz 1-1-1 :pale: Kann auch an mir liegen, weil ich irgendwas nicht bedacht habe...aber habs ja dann anders hinbekommen :wink: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:04 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