Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Tabelle filtern mit mehreren Suchkriterien (https://www.delphipraxis.net/29245-tabelle-filtern-mit-mehreren-suchkriterien.html)

ZeroQool007 6. Sep 2004 15:00


Tabelle filtern mit mehreren Suchkriterien
 
Liste der Anhänge anzeigen (Anzahl: 1)
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]));

*Link zum Bild entfernt*


Hab mal etwas gebastelt, aber der spuckt nur dann etwas aus, wenn ich alle 4 Felder ausfülle, aber möchte halt das mir Ergebnisse liefert, wenn ich zB nur 1,2,3 oder alle 4 Felder ausfülle....Danke im voraus....

[edit=Sharky]Bilder bitte immer als Anhang. Nicht jeder hat eine DSL-Flatrate. Danke. Mfg, Sharky[/edit]

Jelly 6. Sep 2004 15:07

Re: Tabelle filtern mit mehreren Suchkriterien
 
Hallo,

wenn du in einem Feld nichts einträgst, kommt irgendwo in der SQL Abfrage eine Bedingung
SQL-Code:
where Feld like '%%'
Vielleicht interpretieren einige DBMS diese %% Bedingung unterschiedlich, und liefern dir immer FALSE zurück. Bei MySQL klappt das, daher meine Frage (wie üblich), welche Datenbank benutzt du denn?

Gruß

ZeroQool007 6. Sep 2004 15:25

Re: Tabelle filtern mit mehreren Suchkriterien
 
Ich benutze gerade eine Access Datenbank und greife per ADOConnection und ADODataSet darauf zu...

SQL_JokerStr habe ich bei mir so definiert:

Delphi-Quellcode:
SQL_JokerStr : Array[0..7] of String[1] =
    ('%', '_',
     '[', ']',
     ',' ,
     '(',')',
     '.');

shmia 6. Sep 2004 15:45

Re: Tabelle filtern mit mehreren Suchkriterien
 
Zitat:

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;

ZeroQool007 7. Sep 2004 10:23

Re: Tabelle filtern mit mehreren Suchkriterien
 
Vielen Dank für eure Hilfen! Hab es nun hinbekommen....

Delphi-Quellcode:
var
  TempSQLWhere1 : String;

begin
  ADODataSet_Anzeige.Filtered:=false;
  ADODataSet_Anzeige.Close;
  ADODataSet_Anzeige.Active:=false;

  TempSQLWhere1 := '';

  if edt_Filmtitel.Text <> '' then
      TempSQLWhere1 := TempSQLWhere1 + 'vCh50Filmtitel LIKE ' + QuotedStr(SQL_JokerStr[0] + edt_Filmtitel.Text + SQL_JokerStr[0]);
  if ComboBox_Format.Text <> '' then
    begin
      if TempSQLWhere1 = '' then
          TempSQLWhere1 := TempSQLWhere1 + 'vChFormat LIKE ' + QuotedStr(SQL_JokerStr[0] + ComboBox_Format.Text + SQL_JokerStr[0])
      else
        TempSQLWhere1 := TempSQLWhere1 + ' and ' + 'vChFormat LIKE ' + QuotedStr(SQL_JokerStr[0] + ComboBox_Format.Text + SQL_JokerStr[0]);
    end;

  if ComboBox_Kategorie.Text <> '' then
    begin
      if TempSQLWhere1 = '' then
          TempSQLWhere1 := TempSQLWhere1 + 'vChKategorie LIKE ' + QuotedStr(SQL_JokerStr[0] + ComboBox_Kategorie.Text + SQL_JokerStr[0])
      else
        TempSQLWhere1 := TempSQLWhere1 + ' and ' + 'vChKategorie LIKE ' + QuotedStr(SQL_JokerStr[0] + ComboBox_Kategorie.Text + SQL_JokerStr[0]);
    end;

  if edt_Leiher.Text <> '' then
    begin
      if TempSQLWhere1 = '' then
          TempSQLWhere1 := TempSQLWhere1 + 'vChVerliehen LIKE ' + QuotedStr(SQL_JokerStr[0] + edt_Leiher.Text + SQL_JokerStr[0])
      else
        TempSQLWhere1 := TempSQLWhere1 + ' and ' + 'vChVerliehen LIKE ' + QuotedStr(SQL_JokerStr[0] + edt_Leiher.Text + SQL_JokerStr[0]);
    end;

  ADODataSet_Anzeige.CommandText := TempSQLWhere1 + 'vChFormat LIKE ' + QuotedStr(SQL_JokerStr[0] + ComboBox_Format.Text + SQL_JokerStr[0]);
  ADODataSet_Anzeige.CommandText:= 'Select * FROM tblMovieList WHERE ' + TempSQLWhere1;

      memo1.Clear;
      memo1.Lines.Add(ADODataSet_Anzeige.CommandText);
  ADODataSet_Anzeige.Open;
  ADODataSet_Anzeige.Active:=active;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz