![]() |
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 |
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:
Freundliche Grüße vom marabu
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; |
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.
|
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! |
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:
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 ...
if tblArtikel.FieldByName(cbxArtikelFiltern.Text).DataType = ftString then ...
Freundliche Grüße |
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 04:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz