Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wie filtern in TClientDataSet ? (https://www.delphipraxis.net/115738-wie-filtern-tclientdataset.html)

madina 17. Jun 2008 08:00


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:
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;
mfg

raiguen 17. Jun 2008 09:25

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:
cds.Filter:= '(sLand=''Deutschland'') and (sStadt=''Berlin'')';
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:
Delphi-Quellcode:
cds.Filter:= Format('(sLand=%s) and (sStadt=%s)', ['Deutschland', 'Berlin']);
Entsprechend dem oben gesagten kann das hier
Zitat:

cds.Filter := 'sLand=Deutschland and sStadt <> s';
so auch nicht funktionieren... aber so:
Delphi-Quellcode:
cds.Filter := Format('(sLand=%s) and (sStadt <> %s)', ['Deutschland', s]);
getippt und nicht getestet

madina 18. Jun 2008 07:34

Re: Wie filtern in TClientDataSet ?
 
Hallo,

1. leider klappt diese Zeile nicht:
Delphi-Quellcode:
cds.Filter:= Format('(sLand=%s) and (sStadt <> %s)', ['Deutschland', s]);
2. machen wir es einfach, wie kann ich Filtern:
ist OK:
Delphi-Quellcode:
cds.Filter:= 'sStadt<>'+Quotedstr('Berlin')+' or stadt<>'+Quotedstr('Hamburg');
soll NOK:
Delphi-Quellcode:
cds.Filter:= 'sStadt<>'+Quotedstr('Berlin, 'Hamburg', ...);

raiguen 18. Jun 2008 08:48

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');
;)

madina 18. Jun 2008 08:57

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:
cds.Filter:= 'sStadt<>'+Quotedstr('Berlin')+' or stadt<>'+Quotedstr('Hamburg');
sondern etwa so:

Delphi-Quellcode:
s: string;

s:= 'Berlin, Hamburg, ...';
cds.Filter:= 'sStadt<>'+Quotedstr(s);
schreiben variable.

mfg

DeddyH 18. Jun 2008 09:08

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:
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;
So in der Art (ungetestet).

madina 19. Jun 2008 09:11

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

DeddyH 19. Jun 2008 09:23

Re: Wie filtern in TClientDataSet ?
 
Delphi-Quellcode:
cds.Filter:= Format('sStadt NOT IN(%s)',[s]);
Wobei der Format-Befehl hier keine wesentliche Erleichterung bringt.


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