Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Ähnliche Datensätze in TDataSet finden (https://www.delphipraxis.net/13435-aehnliche-datensaetze-tdataset-finden.html)

sirtoby73 18. Dez 2003 13:47


Ä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:

Smokey 18. Dez 2003 14:08

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:
'nachname = "' + txtFeld.Text + '*"'
dann entweder FindFirst() oder einfach filtern, den ersten datensatz merken, filter wieder rausmachen und auf den datensatz springen.

Leuselator 18. Dez 2003 14:45

Re: Ähnliche Datensätze in TDataSet finden
 
Wenn Du nicht Filtern möchtest, könntest Du es in etwa so machen
Delphi-Quellcode:
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;
Mann - bin ich wieder nett heute - na ja - bald ist Weihnachten :-)
Gruß

sirtoby73 18. Dez 2003 15:32

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:
 filter:= 'nachname = "' + Key + '*"'
filtered:= true;
kein einziger Datensatz gefunden, während die SQL-Abfrage
Delphi-Quellcode:
WHERE nachname like "k*"
mehrere Datensätze liefert.
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.

Garby 18. Dez 2003 15:44

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])

sirtoby73 18. Dez 2003 16:30

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:

Smokey 18. Dez 2003 16:50

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