Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Filtern mit QuotedStr, AND / OR Verbindung und Variablen (https://www.delphipraxis.net/93697-filtern-mit-quotedstr-verbindung-und-variablen.html)

Seto 9. Jun 2007 21:31

Datenbank: Paradox7 • Zugriff über: mit der Table Komponente in Delphi

Filtern mit QuotedStr, AND / OR Verbindung und Variablen
 
Hallo zusammen,

ich bin noch ziemlicher Anfänger in Sachen Delphi und besonders mit Datenbanken. Nun soll ich in der Schule eine Datenbanksoftware programmieren, habe aber mit der Filterfunktion Probleme. Ich habe schon sehr viele Möglichkeiten durchprobiert und die Delphi Hilfe gelesen, bin daraus aber nicht wirklilch schlau geworden.

Die Filterfunktion besteht bei mir aus vier Comboboxen, zwei zum Auswählen des Datenbankfeldes und zwei zum Auswählen des Mengenzeichens, sprich =,> oder <. Der Text nach dem gefiltert werden soll wird in zwei edits eingegeben. Nun soll bei Klick auf den Button nach beiden kriterien gefiltert werden. Ich muss also mit Variablen arbeiten, da ja Feld, Menge und Filtertext ausgewählt werden sollen. Diese Variablen sind alle als Strings deklariert. Ich habe folgenden Code verwendet:

Delphi-Quellcode:
menge:=cbxMenge.text;
menge2:=cbxMenge2.text;
filtertext:=edtFiltertext.text;
filtertext2:=edtFiltertext.text;

case cbxArtikelFiltern.ItemIndex of
             0: begin
                  feld:='Artikelnummer';
                  stringvar:=false;
                  end;
             1: begin
                  feld:='Artikelname';
                  stringvar:=true;
                  end;
             2: begin
                  feld:='Kategorie';
                  stringvar:=true;
                  end;
             3: begin
                  feld:='Genre';
                  stringvar:=true;
                  end;
             4: begin
                  feld:='Hersteller';
                  stringvar:=true;
                  end;
             5: begin
                  feld:='Erscheinungsjahr';
                  stringvar:=false;
                  end;
             6: begin
                  feld:='Altersfreigabe';
                  stringvar:=true;
                  end;
             7: begin
                  feld:='Preis';
                  stringvar:=false;
                  end;
             8: begin
                  feld:='Anzahl';
                  stringvar:=false;
                  end;
             end;
           case cbxArtikelFiltern2.ItemIndex of
             0: begin
                  feld2:='Artikelnummer';
                  stringvar:=false;
                  end;
             1: begin
                  feld2:='Artikelname';
                  stringvar:=true;
                  end;
             2: begin
                  feld2:='Kategorie';
                  stringvar:=true;
                  end;
             3: begin
                  feld2:='Genre';
                  stringvar:=true;
                  end;
             4: begin
                  feld2:='Hersteller';
                  stringvar:=true;
                  end;
             5: begin
                  feld2:='Erscheinungsjahr';
                  stringvar:=false;
                  end;
             6: begin
                  feld2:='Altersfreigabe';
                  stringvar:=true;
                  end;
             7: begin
                  feld2:='Preis';
                  stringvar:=false;
                  end;
             8: begin
                  feld2:='Anzahl';
                  stringvar:=false;
                  end;
             end;
           
           if (stringvar=false)AND(stringvar2=false) then
             tblArtikel.Filter:='('+feld+menge+filtertext+')AND('+feld2+menge2+filtertext2+')';
           if (stringvar=false)AND(stringvar2=true) then
             tblArtikel.Filter:='('+feld+menge+filtertext+')AND('+feld2+menge2+QuotedStr(filtertext2)+')';

Die variablen bekommen also ihre Werte zugewiesen und je nach Filtertext typ wird die booleansche Variable stringvar auf true oder false gesetzt, da beim Filtern mit Strings als Text ja die Option QuotedStr() benutzt werden muss.

So nun mein eigentliches Problem mit dem Code. Der erste Fall, also stringvar und stringvar2:=false, also wenn man z.b. nach zwei integerwerten filtert funktioniert einwandfrei. Der zweite Fall, bei dem ein Wert aus einem String besteht und somit mit QuotedStr eingegeben werden muss funktioniert allerdings nicht! Wenn ich z.B. als ersten Filter nach Der Artikelnummer und als zweiten nach Genre (was ja ein String enthält) filtern möchte, lässt sich das Programm zwar starten, aber bei Buttonklick kommt die Fehlermeldung "Filterausdruck fehlerhaft abgeschlossen". Falls es relevant ist, ich benutze Delphi 7 Enterprise auf deutsch.
Ich hab schon so viel probiert, finde aber einfach keine Lösung. Weiß von ihnen jemand, was an dem Code falsch ist, bezw. wie man in einer AND oder OR verbindung mit QuotedStr filtern kann?


Über eine Antwort wäre ich sehr dankbar, bin ziemlich verzweifelt. Vielen Dank schonmal,
Gruß, Seto

marabu 10. Jun 2007 09:03

Re: Filtern mit QuotedStr, AND / OR Verbindung und Variablen
 
Herzlich willkommen in der Delphi-PRAXiS, Seto.

Du musst die Eingaben nicht unbedingt in eigene Variablen umspeichern. Und was den Fehler betrifft, so kommst du ihm sicher leicht auf die Spur, wenn du dir den Inhalt von Filter einmal anschaust:

Delphi-Quellcode:
  menge := cbxMenge.text;
  menge2 := cbxMenge2.text;
  filtertext := edtFiltertext.text;
  filtertext2 := edtFiltertext.text;

  feld := cbxArtikelFiltern.Text;
  feld2 := cbxArtikelFiltern2.Text;
             
  if not stringvar and not stringvar2 then
    sFilter := '(' + feld + menge + filtertext+ ') AND (' + feld2 + menge2 + filtertext2 + ')';
  if not stringvar and stringvar2 then
    sFilter := '(' + feld + menge + filtertext + ') AND (' + feld2 + menge2 + QuotedStr(filtertext2) + ')';

  ShowMessage(Format('{%s}', [sFilter]);
 
  tblArtikel.Filter := sFilter;
  tblArtikel.Filtered := True;
Freundliche Grüße vom marabu

Jelly 10. Jun 2007 10:05

Re: Filtern mit QuotedStr, AND / OR Verbindung und Variablen
 
Also mir fällt erst mal auf, dass die Variable Stringvar2 nie gesetzt wird, sondern immer nur Stringvar. Du prüfst aber zum Schluss auf StringVar2, das kann also eigentlich nur schief gehen.

Seto 10. Jun 2007 10:54

Re: Filtern mit QuotedStr, AND / OR Verbindung und Variablen
 
Oh das ist mir aber peinliich :lol:
Da teste ich stundenlang rum ob ich Klammern vergessen habe oder ob AND oder Quotedstr als String selbst geschrieben werden muss und dann vergess ich die 2 bei stringvar nach dem copy -paste.
Und Marabus Lösung sieht um einiges eleganter aus.
Vielen dank, ihr habt mir beide sehr geholfen!

marabu 10. Jun 2007 11:53

Re: Filtern mit QuotedStr, AND / OR Verbindung und Variablen
 
Was die Variablen stringvar und stringvar2 betrifft, so würde ich diese überhaupt nicht verwenden, sondern die benötigte Information aus dem Tabellenfeld auslesen:

Delphi-Quellcode:
  if tblArtikel.FieldByName(cbxArtikelFiltern.Text).DataType = ftString then ...
Eine Verbesserrung deines Programms wäre sicherlich auch, wenn man auf die Angabe eines zweiten Suchkriteriums ganz verzichten könnte - falls ein Kriterium bereits ausreichend ist ...

Freundliche Grüße

Seto 10. Jun 2007 14:37

Re: Filtern mit QuotedStr, AND / OR Verbindung und Variablen
 
Danke, ich hab bereits eine Combobox verbaut in der man auswählen kann, ob man mit and, or oder nur mit einem Begriff filtern möchte, habe das nur nicht hier explizit erwähnt da das Filtern ohne and / or schon funktioniert hat.
Wusste gar nicht dass man auf die Art auch den Typ auslesen kann aber das erscheint mir auch leichter, werde ich mal ausprobieren. Werde auch die Variablen noch entfernen, wenn ich direkt über den Text auf das Feld zugreife erspart das ja einige Zeilen Quelltext.
Viele Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 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