Das
+edit1.text+ fügt lediglich den String deines Edit Feldes in den
SQL String ein.
dazu muss das Edit Feld nicht mit der Datenbank verknüpft sein, da die Verbindung erst hergestellt wird, wenn du dein
Query ausführst, bzw. das DBGrid Daten empfangen soll.
Bin im Moment an einem ganz ähnlichen Problem.
Die Durchführung per Select ist für mich dabei nur begrenzt sinnvoll. Wenn zum Beispiel eine Funktion benötigt wird, die die Anzeige eines DBGrids durchsucht, sprich den Cursor im Grid auf den Datensatz verschiebt und nicht den Inhalt lediglich auf den gesuchten Datensatz beschränkt.
Eine Möglichkeit hierfür wäre
Pos oder auch
Locate
Mit Pos kann die
OkayClick Funktion beispielsweise so aussehen:
Delphi-Quellcode:
(* Setze den Edit Text als Suchwort *)
SearchTerm := Edit_Search.Text;
(* Beschränke die Felder um Probleme mit Strings in Integerfeldern zu vermeiden *)
if RadioButton_Field1 .Checked
then SearchField := '
ZuDurchsuchendesFeld1';
if RadioButton_Field2 .Checked
then SearchField := '
ZuDurchsuchendesFeld2';
(* Stelle die Controls des Grids aus, damit das Grid nicht bei jeder Zeile aktualisiert wird *)
DBGrid.DataSource.Dataset.DisableControls;
(* Suche bei jedem Click einen Datensatz weiter, alternativ kann eine If Bedingung für eine Abfrage vom Begin mit First gesetzt werden *)
DBGrid.DataSource.Dataset.Next;
(* Der momentane Datensatz enthält nicht das gesuchte Feld nicht dem*)
while (Pos(SearchTerm, DBGrid.DataSource.Dataset.FieldByName (SearchField).AsString) = 0)
(* Und das Dateiende ist noch nicht erreicht*)
and not (DBGrid.DataSource.Dataset.Eof)
do begin
(* Also zum nächsten Datensatz*)
DBGrid.DataSource.Dataset.Next;
end;
(* Wurde eine Übereinstimmung gefunden wird die while Schleife verlassen und die Anzeige aktualisiert *)
DBGrid.DataSource.Dataset.EnableControls;
(* Wenn keine Übereinstimmung gefunden wurde und das Dateiende erreicht wurde wird eine Fehlermeldung ausgegeben*)
if (Pos(SearchTerm, DBGrid.DataSource.Dataset.FieldByName (SearchField).AsString) = 0)
and (DBGrid.DataSource.Dataset.Eof)
then begin
MessageBox(
Handle, pChar('
Suche erfolglos'), pChar('
Aus is'), MB_ICONHAND
and MB_APPLMODAL);
end;
Das funktioniert soweit, wie gesagt, man kann noch einen zweiten Button erstellen und über Sender dann abfragen ob von Oben oder einfach weitergesucht werden soll.
Delphi-Quellcode:
if Sender = Button_FromTop then FromTop := True;
if FromTop then begin (* Liste von Oben durchsuchen *)
DBGrid.DataSource.Dataset.DisableControls;
DBGrid.DataSource.Dataset.First;
... usw
Die Fehlermeldung ist nur ein Beispiel. Da müssten noch Abfragen rein.
(wird immer ausgegeben, wenn das Dateiende erreicht wurde, auch wenn vorher Datensätze gefunden wurden)
Die Felder werden wie gesagt deshalb ausgewählt, um eine Abfrage mit einem String in einem Integer zu vermeiden.
Ist natürlich blöd wenn man auch in Integerfeldern suchen will
Jetzt kommt die Frage von mir:
Ich suche grade nach ner Möglichkeit auf die Characters abzufgragen und dann je nach feld als Integer oder String zu suchen.
Sprich, Wenn die Chars nur aus 0-9 bestehen darf in allen Feldern gesucht werden, falls auch Buchstaben dabei sind nur in den Stringfeldern.
Um die Reihenfolge im Grid zu wahren, müsste man wahrscheinlich für jedes feld eine Einzelne Abfrage machen, und die hintereinander in der While-Schleife aufrufen, nicht das die Position dann rumspringt.
... Oder aber man sucht mit
Value statt
AsString und
AsInteger, dann braucht man da nicht unterscheiden ...
Und gleich noch eine:
Kann man mit Locate auch weitersuchen? Mein Versuch mit
Locate sucht immer vom Tabellenbeginn:
DBGrid.DataSource.Dataset.Locate('Feld1;Feld2;Feld3',SearchTerm,[loCaseInsensitive, loPartialKey]);
Die Integer String Problematik bringt das dabei auch noch mit.
Gruß, alphaflight
PS: Würde mich über Vorschläge freuen, natürlich auch (oder gerade wenn) das Geschriebene alles viel zu umständlich ist und schneller gehen würde.
Make me a sandwich! - What? Make it yourself. - Sudo make me a sandwich! - Okay