Zitat von
ZeroQool007:
Hallo! Folgendes Problem....habe eine Tabelle u möchte die Filtern und zwar nach mehreren Suchkriterien...
Delphi-Quellcode:
ADODataSet_Anzeige.CommandText:=('Select * FROM tblMovieList '
+ 'WHERE vCh50Filmtitel LIKE ' + QuotedStr(SQL_JokerStr[0] + edt_Filmtitel.Text + SQL_JokerStr[0])+
'AND vChFormat LIKE ' + QuotedStr(SQL_JokerStr[0] + ComboBox_Format.Text + SQL_JokerStr[0]) +
'AND vChKategorie LIKE ' + QuotedStr(SQL_JokerStr[0] + ComboBox_Kategorie.Text + SQL_JokerStr[0]) +
'AND vChVerliehen LIKE ' + QuotedStr(SQL_JokerStr[0] + edt_Leiher.Text + SQL_JokerStr[0]));
Wenn ein Eingabefeld leer ist, sollte es gleich aus dem Filter herausfallen:
Delphi-Quellcode:
cmdtext := 'Select * FROM tblMovieList WHERE ';
if edt_Filmtitel.Text <> '' then
cmdtext := cmdtext + 'vCh50Filmtitel LIKE ' + QuotedStr(SQL_JokerStr[0] + edt_Filmtitel.Text + SQL_JokerStr[0]);
.....
Der dynamische Zusammenbau der WHERE-Klausel wird nun etwas knifflig, denn man muss
an den richtigen Stellen die Schlüsselwörter WHERE und AND liefern.
Deshalb hier eine Procedure, die dabei hilft:
Delphi-Quellcode:
{**************************************************************************
* NAME: ImplantSqlWhereClause
* DESC: Diese Procedure analysiert eine SQL-Anweisung und
* "pflanzt" eine einschränkende Where-Bedingung in die
* Anweisung
*************************************************************************}
procedure ImplantSqlWhereClause(
SQL:TStrings;
const WhereClause:
string);
var
i : Integer;
wflag : Boolean;
ipos : Integer;
s :
string;
begin
if Trim(WhereClause) = '
'
then
Exit;
// Ohne Where-Bedingung ist nix zu tun
wflag := False;
ipos :=
SQL.Count;
for i :=
SQL.Count - 1
downto 0
do
begin
s := UpperCase(Trim(
SQL.Strings[i]));
if s = '
'
then
Continue;
if AnsiSameText('
ORDER BY', Copy(s, 1, 8))
or
AnsiSameText('
GROUP BY', Copy(s, 1, 8))
or
AnsiSameText('
HAVING', Copy(s, 1, 6))
then
begin
ipos := i;
Continue;
end;
if AnsiSameText('
WHERE', copy(s, 1, 5))
then
wflag := True;
end;
if wflag
then
begin
s := '
AND '+WhereClause;
end
else
begin
s := '
WHERE '+WhereClause;
end;
if ipos <
SQL.Count
then
SQL.Insert(ipos, s)
else
SQL.Add(s);
end;