Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Tabelle filtern mit mehreren Suchkriterien

  Alt 6. Sep 2004, 16:45
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;
Andreas
  Mit Zitat antworten Zitat