![]() |
Wie filtern in TClientDataSet ?
Hallo,
ich habe ein TCDS mit 2 String Felder sStadt und sLand. ich will wie folgt filtern und es klappt nicht an der else zweig ???????????
Delphi-Quellcode:
mfg
var s : string;
cds: TClientDataSet; cds.Filter:= 'sLand=Deutschland'; cds.Filtered:= true; s:= 'Berlin'; while cds.eof=false do begin if cds.locate(sStadt, 'Berlin', ...) then begin if (MessageBox('wollen Sie ändern' ..., Yes)) then begin cds.edit; cds['sStadt']:= 'Hamburg' cds.post; end else begin // neu Filter setzen ohne die städte im MessageBox Zweig-Nein ?????????????????? s:= s+cds['sStadt']; cds.Filter := 'sLand=Deutschland and sStadt <> s'; //'sLand=Deutschland and sStadt <> (Berlin, München, ..) s:= s+','; cds.Filtered:= true; end; end end; |
Re: Wie filtern in TClientDataSet ?
Moin :)
Mich wundert, dass das cds sich nicht über den Filter(string) beschwert, weil so wie der da steht, werden Deutschland und Berlin als Felder interpretiert und nicht als Stringwerte... :gruebel: Wenn ich mich irre, dann müsste der FilterString so aufgebaut sein:
Delphi-Quellcode:
ACHTUNG!: '' entspricht 2mal Shift-# und NICHT Shift-2 !! Vereinfacht kann man den Filterstring auch mithilfe der Format()-Funktion gestalten, da spart man sich die Hochkomma-Orgie:
cds.Filter:= '(sLand=''Deutschland'') and (sStadt=''Berlin'')';
Delphi-Quellcode:
Entsprechend dem oben gesagten kann das hier
cds.Filter:= Format('(sLand=%s) and (sStadt=%s)', ['Deutschland', 'Berlin']);
Zitat:
Delphi-Quellcode:
getippt und nicht getestet
cds.Filter := Format('(sLand=%s) and (sStadt <> %s)', ['Deutschland', s]);
|
Re: Wie filtern in TClientDataSet ?
Hallo,
1. leider klappt diese Zeile nicht:
Delphi-Quellcode:
2. machen wir es einfach, wie kann ich Filtern:
cds.Filter:= Format('(sLand=%s) and (sStadt <> %s)', ['Deutschland', s]);
ist OK:
Delphi-Quellcode:
soll NOK:
cds.Filter:= 'sStadt<>'+Quotedstr('Berlin')+' or stadt<>'+Quotedstr('Hamburg');
Delphi-Quellcode:
cds.Filter:= 'sStadt<>'+Quotedstr('Berlin, 'Hamburg', ...);
|
Re: Wie filtern in TClientDataSet ?
arrghh... sorry, ich dussel hab bei der ersten Variante mit der Format()-Funktion nicht richtig nachgedacht...da fehlen ja trotzdem die Quotes für den Filterwert...
Wenn du auf Datensätze filtern möchtest, in denen die Städte Berlin und Hamburg NICHT enthalten sind, musst du die Filterbedingung mit AND verknüpfen:
Delphi-Quellcode:
;)
cds.Filter:= 'sStadt<>'+Quotedstr('Berlin')+' AND sStadt<>'+Quotedstr('Hamburg');
|
Re: Wie filtern in TClientDataSet ?
Hallo,
so lautet meine Frage: wie kann ich diese Filterung ohne OR oder AND formulieren d.h nicht so
Delphi-Quellcode:
sondern etwa so:
cds.Filter:= 'sStadt<>'+Quotedstr('Berlin')+' or stadt<>'+Quotedstr('Hamburg');
Delphi-Quellcode:
schreiben variable.
s: string;
s:= 'Berlin, Hamburg, ...'; cds.Filter:= 'sStadt<>'+Quotedstr(s); mfg |
Re: Wie filtern in TClientDataSet ?
Willst Du mehrere Städte ausschließen? Das wird so nicht so einfach gehen, ich würde den Umweg über eine Stringliste nehmen.
Delphi-Quellcode:
So in der Art (ungetestet).
sl := TStringList.Create;
s := ''; try sl.Add('Berlin'); sl.Add('Hamburg'); sl.Add('München'); ... for i := 0 to Pred(sl.Count) do s := s + QuotedStr(sl[i]) + ','; Delete(s,Length(s),1); cds.Filter:= 'sStadt NOT IN('+s+')'; finally sl.Free; end; |
Re: Wie filtern in TClientDataSet ?
Hallo,
vielen Dank es funktioniert. Ich hätte gerne gewußt wie ich folgende Source mit dem FORMAT() schreiben kann:
Delphi-Quellcode:
.
sl := TStringList.Create;
s := ''; try sl.Add('Berlin'); sl.Add('Hamburg'); sl.Add('München'); ... for i := 0 to Pred(sl.Count) do s := s + QuotedStr(sl[i]) + ','; Delete(s,Length(s),1); cds.Filter:= 'sStadt NOT IN('+s+')'; finally sl.Free; end; mfg |
Re: Wie filtern in TClientDataSet ?
Delphi-Quellcode:
Wobei der Format-Befehl hier keine wesentliche Erleichterung bringt.
cds.Filter:= Format('sStadt NOT IN(%s)',[s]);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 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