Hat Dein DBGrid die Eigenschaft VisibleRowCount? Wenn ja, dann könntest Du ein (äußerst unschönes) Konstrukt dieser Art verwenden:
Delphi-Quellcode:
Query.Close;
Query.SQL.Text := Format('
SELECT first %d * FROM Kunden WHERE Vorname >= :Suchbegriff',[DBGrid.VisibleRowCount]);
Query.Params.ParamByName('
Suchbegriff').AsString := EditMitDemSuchbegriff.Text;
Query.Open;
Query.Locate('
Vorname',EditMitDemSuchbegriff.Text,[]);
Als Anwender käme ich mir aber ziemlich ... vor, wenn meine Suche nur genau ein Ergebnis liefert, mir aber ein paar Ergebnisse mehr angezeigt werden, nur damit die Anzeige voll wird und ich mir daraus dann wieder mein Ergebnis heraussuchen muss.
Wenn's nur ein Ergebnis gibt, ist die Datenbankabfrage schneller und meine Arbeit als Anwender auch, weil ich in den Ergebnissen nicht erst nach dem schauen muss, was ich eigentlich suchte, sondern bei einem Datensatz als Ergebnis recht schnell feststellen kann, ob es auch das gesuchte Ergebnis ist.
Sprich: Wenn die Suche nur einen Datensatz als Ergebnis liefert, dann erwarte ich als Anwender, dass mir auch nur ein Datensatz als Ergebnis geliefert wird (egal, wieviele Datensätze theoretisch oder praktisch oder bildschirmfüllend oder ... angezeigt werden könnten).
select first geht z. B. bei FireBird:
Query.SQL.Text := Format('SELECT first %d * FROM Kunden WHERE Vorname >= :Suchbegriff',[DBGrid.VisibleRowCount]);
Access nennt das select top:
Query.SQL.Text := Format('SELECT top %d * FROM Kunden WHERE Vorname >= :Suchbegriff',[DBGrid.VisibleRowCount]);
MySQL hängt lieber ein Limit hinten an das
SQL an:
Query.SQL.Text := Format('SELECT * FROM Kunden WHERE Vorname >= :Suchbegriff limit %d',[DBGrid.VisibleRowCount]);
Das alte Oracle macht es (glaub' ich) eher so:
Query.SQL.Text := Format('SELECT * FROM Kunden WHERE Vorname >= :Suchbegriff ROWNUM <= %d',[DBGrid.VisibleRowCount]);
Und neue Oracle mögen sowas:
Query.SQL.Text := Format('SELECT * FROM Kunden WHERE Vorname >= :Suchbegriff FETCH FIRST %d ROWS ONLY',[DBGrid.VisibleRowCount]);
Andere
DB, andere Syntax
Es lebe die datenbankunabhängige Programmierung, die übrigens, wenn das DBGrid nur die tatsächlich gefundenen Ergebnisse anzeigt und nicht aufgefüllt wird, erhalten bleibt.
Query.SQL.Text := 'SELECT * FROM Kunden WHERE Vorname = :Suchbegriff';
. Und das können alle schnell