![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBX
DataSet.LocateNext (horizontale Suche)
Hallo Leute,
ich habe folgendes Problem: Ich habe ein DatabaseGrid und nutze LocateNext für die Suche in dem DatabaseGrid. Die Suche geht jeweils die übergebenen Spalten einzeln durch und durchsucht jede Spalte vollständig, anstatt nur in die erste Zeile jeder Spalte zu gucken und dann erst in die zweite zu springen. Wenn ich zum Beispiel nach dem Begriff Test suche, der in der Spalte 3 (Zeile 2) steht und in der Spalte 1 (Zeile 4) steht Test ebenfalls, dann markiert die Suche die Zeile 4 und nicht 2. Ich hoffe Ihr wisst, was ich meine. Gibt es eine Möglichkeit horizontal zu suchen, anstatt jede Spalte nacheinander vertikal zu durchsuchen? Vielen Dank vorab, Dennis991 |
AW: DataSet.LocateNext (horizontale Suche)
Meinst du sowas:
Delphi-Quellcode:
Ungetestet, da im Foren-Editor getippt ...
...
Var Zaehl : Integer; Begin Zaehl := 0; MyQuery.SQL.Text := 'select Spalte1, Spalte3 from MeineTabelle order by Spalte1'; MyQuery.Open; IF MyQuery.Locate('Spalte1;Spalte3',VarArrayOf([Suchwort1, Suchwort2]),[]) THEN Begin Inc(Zaehl); WHILE MyQuery.LocateNext('Spalte1;Spalte3',VarArrayOf([Suchwort1, Suchwort3]),[]) DO Inc(Zaehl); End; ShowMessage('Insgesamt gefunden: ' + IntToStr(Zaehl)); End; |
AW: DataSet.LocateNext (horizontale Suche)
Locate macht aber AFAIK eine UND Suche über die Felder.
Wenn er aber Werte in Spalte1 oder Spalte3 oder Spalte3 suchen soll, dann geht das so nicht. |
AW: DataSet.LocateNext (horizontale Suche)
Zitat:
Wie wär's dann mit:
Delphi-Quellcode:
MyQuery.Active := False;
MyQuery.SQL.Clear; MyQuery.SQL.Append := 'select * from MeineTabelle'; MyQuery.SQL.Append := 'where (Spalte1 = ' + Suchwort + ')'; MyQuery.SQL.Append := 'or (Spalte3 = ' + Suchwort + ')'; MyQuery.Open; |
AW: DataSet.LocateNext (horizontale Suche)
Hmmm, ich denke er möchte in dem bereits geholten Dataset suchen ;)
|
AW: DataSet.LocateNext (horizontale Suche)
Zitat:
|
AW: DataSet.LocateNext (horizontale Suche)
Man benötigt ein Feld in dem die Werte aller Suchfelder mit Trennzeichen zusammengeführt sind.
Code:
Jetzt kann mit Locate über dieses Suchfeld gesucht werden (mit Parameter
Spalte1=Wert
Spalte2=Such Spalte3=Feld SuchSpalte=#Wert#Such#Feld#
Delphi-Quellcode:
)
loPartialKey
Ganze Feldwerte sucht man mit den Trennzeichen um den Wert
Delphi-Quellcode:
und Teile davon einfach mit dem Teil
#Wert#
Delphi-Quellcode:
.
el
Es entzieht sich meiner Kenntnis, ob Locate auch über berechnete Felder geht, möglich wäre es ... |
AW: DataSet.LocateNext (horizontale Suche)
Das ist natürlich auch eine Möglichkeit: Einfach die Tabelle erweitern oder ein entsprechendes View in der DB erstellen – ach ja, und natürlich, wenn' Locate über berechnete Felder geht, ein solches in der Query einrichten.
Darauf hätte ich auch selber kommen müssen – mit Ausnahme der berechneten Felder, das wäre mir nicht im Traum eingefallen. |
AW: DataSet.LocateNext (horizontale Suche)
Es geht aber auch ganz anders ... man schreibt sich eine
Delphi-Quellcode:
die das macht.
procedure
In etwa so: (ungetestet)
Delphi-Quellcode:
function DataSetLocateNext( ADataSet : TDataSet; const AFields : string; const AValue : Variant; ALocateOptions : TLocateOptions ) : Boolean;
var LBookmark : TBookmark; LSValue : string; LCValue : string; LFields : TStringList; begin LSValue := VarToStrDef( AValue, '' ); if loCaseInsensitive in ALocateOptions then LSValue := LowerCase( LSValue ); LFields := TStringList.Create; try LFields.Delimiter := ';'; LFields.StrictDelimiter := True; LFields.DelimitedText := AFields; for LIdx := 0 to LFields.Count - 1 do LFields.Objects[LIdx] := ADataSet.FieldByName( LFields[LIdx] ); Result := False; LBookmark := ADataSet.GetBookmark; ADataSet.DisableControls; try while not ADataSet.Eof and not Result do begin ADataSet.Next; for LIdx := 0 to LFields.Count - 1 do begin LCValue := VarToStrDef( TField( LFields.Objects[LIdx] ).Value, '' ); if loCaseInsensitive in ALocateOptions then LCValue := LowerCase( LCValue ); if loPartialKey in ALocateOptions then Result := Pos( LSValue, LCValue ) > 0 else Result := LSValue = LCValue; end; end; if not Result then ADataSet.GotoBookmark( LBookmark ); finally ADataSet.EnableControls; end; finally LFields.Free; end; end; |
AW: DataSet.LocateNext (horizontale Suche)
Danke für Eure zahlreichen Antworten, ich werde die Vorschläge mal ausprobieren.
Update: funktioniert ;-) (habe die Lösung von Sir Rufo umgesetzt, da ich dadurch nicht das Grid erweitern muss. |
AW: DataSet.LocateNext (horizontale Suche)
Ich habe noch ein Problem:
Wenn ich die Suche starte, dann werden alle durchsuchten Zeilen nacheinander fokusiert (= markiert). Das führt zu dem Effekt (falls es im ganzen Grid nur 1 Treffer gibt), dass es unschön aussieht, dass alle Zeilen nacheinander markiert und am Ende wieder die Ursprungszeile markiert wird. Wie kann ich dort noch Abhilfe schaffen? Grüße |
AW: DataSet.LocateNext (horizontale Suche)
vorher ein
Delphi-Quellcode:
und danach wieder
TDataSet.DisableControls;
Delphi-Quellcode:
Aber daran hatte Sir Rufo in seinem Beispielcode bereits gedacht.
TDataSet.EnableControls;
|
AW: DataSet.LocateNext (horizontale Suche)
Zitat:
ja das mache ich auch bereits. Jedoch scheint das nicht zu helfen. Hier ein kurzer Auszug:
Code:
LBookmark := DataSet.GetBookmark;
DataSet.DisableControls; try while (not DataSet.Eof) and (not Result) do begin ... end; if not Result then DataSet.GotoBookmark(LBookmark); finally DataSet.EnableControls; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:56 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 by Thomas Breitkreuz