AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Filtern mit QuotedStr, AND / OR Verbindung und Variablen
Thema durchsuchen
Ansicht
Themen-Optionen

Filtern mit QuotedStr, AND / OR Verbindung und Variablen

Ein Thema von Seto · begonnen am 9. Jun 2007 · letzter Beitrag vom 10. Jun 2007
Antwort Antwort
Seto

Registriert seit: 9. Jun 2007
9 Beiträge
 
#1

Filtern mit QuotedStr, AND / OR Verbindung und Variablen

  Alt 9. Jun 2007, 22:31
Datenbank: Paradox7 • Zugriff über: mit der Table Komponente in Delphi
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Filtern mit QuotedStr, AND / OR Verbindung und Variablen

  Alt 10. Jun 2007, 10:03
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
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Filtern mit QuotedStr, AND / OR Verbindung und Variablen

  Alt 10. Jun 2007, 11:05
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.
  Mit Zitat antworten Zitat
Seto

Registriert seit: 9. Jun 2007
9 Beiträge
 
#4

Re: Filtern mit QuotedStr, AND / OR Verbindung und Variablen

  Alt 10. Jun 2007, 11:54
Oh das ist mir aber peinliich
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!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Filtern mit QuotedStr, AND / OR Verbindung und Variablen

  Alt 10. Jun 2007, 12:53
Was die Variablen stringvar und stringvar2 betrifft, so würde ich diese überhaupt nicht verwenden, sondern die benötigte Information aus dem Tabellenfeld auslesen:

  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
  Mit Zitat antworten Zitat
Seto

Registriert seit: 9. Jun 2007
9 Beiträge
 
#6

Re: Filtern mit QuotedStr, AND / OR Verbindung und Variablen

  Alt 10. Jun 2007, 15:37
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 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