Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Probleme mit dem Filterstring (https://www.delphipraxis.net/127296-probleme-mit-dem-filterstring.html)

aladin60 10. Jan 2009 16:17

Datenbank: MSSQL • Version: 2005 • Zugriff über: ADO

Probleme mit dem Filterstring
 
Hallo Ihr Wissenden,

frohes neues Jahr wünsche Ich Euch noch. Der Grund meines Auftrittes ist jedoch ein Problem, bei dessen Lösung ich Hilfe brauche.

Ich filtere eine Tabelle folgendermaßen:

Delphi-Quellcode:
Filter:=''(Archiv = ''false'') AND (Betreff LIKE '''+'%'+SS+'%'' OR Notiz LIKE '''+'%'+SS+'%'')'
was mit dem Fehler "Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereiches oder sind unvereinbar." endet.

Hierbei ist "SS" der zu suchende String. Lasse ich die Klammern weg, gibt es keine Fehlermeldung, es wird auch gefiltert aber natürlich mit dem falschen (logischen) Ergebnis.

Seht Ihr mein Versagen?

Bernd.

mkinzler 10. Jan 2009 16:18

Re: Probleme mit dem Filterstring
 
Versuch mal
Delphi-Quellcode:
Filter:=''(Archiv = ''false'') AND ((Betreff LIKE '''+'%'+SS+'%'') OR ( Notiz LIKE '''+'%'+SS+'%''))'

Matze 10. Jan 2009 16:21

Re: Probleme mit dem Filterstring
 
Hallo,

ich kann mich auch irren, aber gehört zu Beginn nicht nur ein Hochkomma hin, da du ja einen String zuweisen möchtest?

Also statt

Delphi-Quellcode:
Filter := ''( // ...
so

Delphi-Quellcode:
Filter := '( // ...
Grüße, Matze

aladin60 10. Jan 2009 16:31

Re: Probleme mit dem Filterstring
 
Hatte ich auch schon, muss aber wohl so ein:

Delphi-Quellcode:
 Filter:='(Archiv = ''false'') AND ((Betreff LIKE '''+'%'+SS+'%'') OR ( Notiz LIKE '''+'%'+SS+'%''))'
Sieht dann so aus: (Archiv = 'false') AND ((Betreff LIKE '%such%') OR (Notiz LIKE '%such%'))


...aber gleiches Ergebnis.

Bernd.

@Matze: Hast Recht, war aber nur ein Schreibfehler.

aladin60 10. Jan 2009 16:46

Re: Probleme mit dem Filterstring
 
Ich werde verrückt, probehalber habe ich das OR in der Klausel mal durch AND ersetzt:

Delphi-Quellcode:
Filter:='(Archiv = ''false'') AND (Betreff LIKE '''+'%'+SS+'%'' AND Notiz LIKE '''+'%'+SS+'%'')'
..da kommt kein Fehler. Ich weiß nicht weiter...

Bernd.


[edit=Matze]Hab den Beitrag mal neu abgesendet. Irgendwie wird/wurde das DP-Layout zerstört. MfG, Matze[/edit]

mkinzler 10. Jan 2009 16:50

Re: Probleme mit dem Filterstring
 
Verwende mal QuotedStr zum Einschliessen von Strings in Hochkomma

aladin60 10. Jan 2009 16:56

Re: Probleme mit dem Filterstring
 
...gleiches Ergebnis: Mit OR Fehlermeldung, mit AND geht es, aber logisch falsch.

Delphi-Quellcode:
Filter:='(Archiv = '+QuotedStr('false')+') AND (Betreff LIKE '+QuotedStr('%'+SS+'%')+' OR Notiz LIKE '+QuotedStr('%'+SS+'%')+')'
Bernd.

mkinzler 10. Jan 2009 17:02

Re: Probleme mit dem Filterstring
 
Bersuch es doch nochmal zu Klammern

WInfo 10. Jan 2009 17:07

Re: Probleme mit dem Filterstring
 
Moin Moin aladin60,

(1) gibts denn beim Filter einen Like, (2) müsst nicht statt % ein * kommen und (3) ist die partielle Suche in den Filteroptions aktiviert?

aladin60 10. Jan 2009 17:11

Re: Probleme mit dem Filterstring
 
habe ich...

Delphi-Quellcode:
 Filter:='(Archiv = '+QuotedStr('false')+') AND ((Betreff LIKE '+QuotedStr('%'+SS+'%')+') OR (Notiz LIKE '+QuotedStr('%'+SS+'%')+'))'
gleiches -schlechtes- Ergebnis.

Inzwischen habe ich unter SQL (Management Studio Express) gleiches getan (mit dem resultierenden String). Es geht mit der doppelten Klammerebene -(..) AND ((..) OR (..))- genauso wie mit der einfachen Klammerung -(..) AND (.. OR ..)- einwandfrei.

Bernd.

@ WInfo: Einzeln gehen alle Statements wunderbar, % ist richtig, es gibt auch ein LIKE. Trotzdem DANKE.

mkinzler 10. Jan 2009 17:15

Re: Probleme mit dem Filterstring
 
Vielleicht ist der gesamte Ausdruck auch zu komplex

aladin60 10. Jan 2009 17:18

Re: Probleme mit dem Filterstring
 
..eher nicht, ich habe auch solche:

Delphi-Quellcode:
        DSKund.Filter:='Name LIKE '''+'%'+S+'%'' OR Vorname LIKE '''+'%'+S+'%'' OR Bem LIKE '''+'%'+S+'%'''+
                         ' OR Tel LIKE '''+'%'+S+'%'' OR Fax LIKE '''+'%'+S+'%'' OR Mobil LIKE '''+'%'+S+'%'''+
                         ' OR Mail LIKE '''+'%'+S+'%'' OR Anrede LIKE '''+'%'+S+'%''';
Bedenklich ist für mich, dass wenn ich OR durch AND ersetze kein Fehler kommt, das Ergebnis natürlcih nicht das gewünschte ist.


Bernd.

aladin60 10. Jan 2009 17:23

Re: Probleme mit dem Filterstring
 
hier noch die SQL-Abfrage, die wunderbar funtioniert:

SELECT [Person]
,[Termin]
,[Alarm]
,[Adr]
,[Obj]
,[Kunde]
,[Notiz]
,[Betreff]
,[Archiv]
,[Sound]
FROM [Termine]
where (Archiv = 'false') AND (Betreff LIKE '%Ka%' OR Notiz LIKE '%Ka%')

PS: "Ka" ist der Suchbegriff.

Das Ergebnis lautet: (1 Zeile(n) betroffen)

Bernd.

alzaimar 10. Jan 2009 19:37

Re: Probleme mit dem Filterstring
 
Wieso verwendest Du nicht einfach den Format-Befehl. Er befreit Dich von Plus- und Hochkommaorgien
Delphi-Quellcode:
// So:
Filter:='(Archiv = '+QuotedStr('false')+') AND ((Betreff LIKE '+QuotedStr('%'+SS+'%')+') OR (Notiz LIKE '+QuotedStr('%'+SS+'%')+'))'
// Oder so:
Filter := Format('(Archiv = %s) AND ((Betreff LIKE %s) OR Notize LIKE %1:s),['false',QuotedStr('%'+SS+'%')]);
Ist das nicht übersichtlicher und leichter zu lesen?

Bernhard Geyer 10. Jan 2009 19:58

Re: Probleme mit dem Filterstring
 
Wieso lässt du nicht Filter Filter sein und baust dir eine passende parametrisierte Abfrage zusammen?

alzaimar 10. Jan 2009 20:51

Re: Probleme mit dem Filterstring
 
Weil man so sehr flexibel auf unterschiedliche Filterszenarien reagieren kann. Aber grundsätzlich ist das natürlich die einfachste Vorgehensweise.

mkinzler 10. Jan 2009 20:58

Re: Probleme mit dem Filterstring
 
Wobei ein Filter lokal filtert

aladin60 11. Jan 2009 17:26

Re: Probleme mit dem Filterstring
 
Ich danke Euch allen für Eure Antworten.

Natürlich ist der Format-Befehl eine Alternative, da ich den Fall mit dem Filtern in einem recht umfangreichen Programm mit 4 DataSets und 2 Tabellen lediglich 4 Mal (tlw. auch kombiniert) benötige, sehe ich doch wenig Vorteile diese hier anzuwenden. Es wäre vielleicht für die Lesbarkeit der Quelltexte besser...

Zur Kontrolle gebe ich beim Programmieren immer eine Messagebox mit dem resultierenden string in der Testphase aus, da die "Hochkomma-Orgie" tatsächlich etwas unübesichtlich ist.

Die eigentlich Abfrage so zu formulieren ist dagegen keine Alternative, da die hier gewünschte "Suchfunktion" nur kurzzeitig zur Anzeige kommt, ich wegen der Abfrage dann aber die Daten erneut anfordern und den connect erneuern müsste. Natürlich auch noch zweimal, um wieder die gesamten Daten abzufragen.

Doch zurück zum ungelösten Problem: Filterstrings mit einem oder mehreren AND oder OR Verknüpfungen funktionieren, mischt man AND und OR verbunden mit Klammern kommt der Fehler...

Ich habe keine Idee mehr, falls jemand noch eine hat, her damit. Eine Lösung wäre aus meiner Sicht noch das satzweise durchsuchen, aber dann sind die DS nacheinander anzuzeigen - eigentlich nicht meine gewünschte Funktionalität.

Bernd.

alzaimar 11. Jan 2009 18:13

Re: Probleme mit dem Filterstring
 
Verwende keinen Filter, sondern baue Dir die Query zur Laufzeit zusammen. Du weisst doch, das das SELECT mit dem Filter-String funktioniert.

So mach ich das immer.

MatthiasR 9. Mär 2009 12:44

Re: Probleme mit dem Filterstring
 
Ich hänge mich hier mal ran...

Ich möchte einen DBGrid-Inhalt zur Laufzeit filtern. Und zwar soll ein Bediener über ein Edit-Feld die Möglichkeit haben, ein paar Anfangsbuchstaben einzugeben und der DBGrid-Inhalt passt sich dann direkt an und zeigt nur die Zeilen, bei denen der Inhalt eines bestimmten Feldes mit diesen Buchstaben beginnt (case-insensitiv).

Bisher habe ich es so versucht (Table aus Zeoslib):
Delphi-Quellcode:
Table.Filter := 'spaltenname = ' + QuotedStr(edSuche.Text + '*');
Table.FilterOptions := [foCaseInsensitive];
Table.Filtered := True;
Nur werden dann egal was ich eingebe keinerlei Zeilen aufgelistet, obwohl definitiv einige dem Suchkriterium entsprechen müssten :-/ . Woran kanns liegen?

mkinzler 9. Mär 2009 12:47

Re: Probleme mit dem Filterstring
 
Versuch mal
Delphi-Quellcode:
Table.Filter := 'spaltenname = ' + QuotedStr( UpperCase(edSuche.Text) + '*');

MatthiasR 9. Mär 2009 13:05

Re: Probleme mit dem Filterstring
 
Gleiches Ergebnis, wobei ich auch schon mit großbuchstabigen Eingaben in das Textfeld getestet hatte, was ja letztendlich aufs gleiche rauskommt.

mkinzler 9. Mär 2009 13:11

Re: Probleme mit dem Filterstring
 
Lass dir mal den Filterstring anzeigen

MatthiasR 9. Mär 2009 13:26

Re: Probleme mit dem Filterstring
 
So wie erwartet:
Zitat:

spaltenname = 'R*'

MatthiasR 9. Mär 2009 14:22

Re: Probleme mit dem Filterstring
 
Ich habe nun spaßeshalber mal mit ">=" gesucht, statt "=" und das klappt komischerweise. Es werden bei ">= 'R*'" alle Datensätze ab dem Buchstaben 'R' aufgelistet.

nahpets 9. Mär 2009 15:05

Re: Probleme mit dem Filterstring
 
Hallo,
Zitat:

Zitat von Infect
Ich habe nun spaßeshalber mal mit ">=" gesucht, statt "=" und das klappt komischerweise. Es werden bei ">= 'R*'" alle Datensätze ab dem Buchstaben 'R' aufgelistet.

Bei der Aussage wäre ich mir nicht so sicher, es werden alle Datensätze angezeigt, die >= R* sind, R! wird (vermutlich) nicht gefunden. Von Filter und * weiß ich nur, dass es bei der BDE funktioniert, ob diese Funktionalität auch über ADO gegen MSSQL funktioniert, weiß ich nicht (zumindest führten meine Test nicht zu einem positiven Ergebnis).
Versuch es lieber mal mit
Delphi-Quellcode:
Table.Filter := 'spaltenname like ' + QuotedStr(UpperCase(edSuche.Text) + '%');

MatthiasR 9. Mär 2009 15:55

Re: Probleme mit dem Filterstring
 
Leider liefert mir auch das Filterkriterium eine leere Menge :(


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