Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   TADODataSet.Filter Syntax Fehler (https://www.delphipraxis.net/155081-tadodataset-filter-syntax-fehler.html)

hmb 7. Okt 2010 15:34

Datenbank: SQLServer • Version: 2000 • Zugriff über: dbGo

TADODataSet.Filter Syntax Fehler
 
Hallo,
habe ein Problem mit der TADODataSet Komponente im speziellen
mit dem Syntax des Filters:
Dieses Phänomen ist leicht zu reproduzieren:
Man nehme:
1. eine beliebige Tabelle mit diversen Integer - Spalten hier X,Y und Z
2. formuliere einen Ausdruck wie
Code:
(X > 10) AND (Y > 10 OR Z > 100)
2.1 alternativ
Code:
(X > 10) AND ((Y > 10) OR (Z > 100))
Es kommt der Fehler: Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereiches oder sind miteinander Unvereinbar!
3. Verändert man den Ausdruck nach
Code:
(X > 10) AND (Y > 10) OR (Z > 100)
ist das OK, jedoch stimmt dann das Ergebnis nicht mehr.
4. Das Problem taucht auf bei BCB5, RAD Studio 2007 C++ Builder und Delphi

5. Das Workaround, am SQL-Ausdruck den WHERE-Bereich zu erweitern ist nicht so toll, da im Fall wo es produktiv auftritt die Performance dann in die Knie geht. So werden die Daten ein mal geladen und dann lokal der Filter gesetzt...


Irgend eine Idee?

omata 7. Okt 2010 18:21

AW: TADODataSet.Filter Syntax Fehler
 
Wie wäre es, wenn du in deinem DataSet ein neues Feld (boolean) einfügst und über das Calc-Ereignis deine Formel hinterlegst und dann im Filter nur dieses eine neue Feld verwendest?

Sir Rufo 7. Okt 2010 18:32

AW: TADODataSet.Filter Syntax Fehler
 
Die Abfrage im Filter darf eine gewisse Komplexität nicht überschreiten ... das packt der halt nicht

Andreas Schilling 8. Okt 2010 06:05

AW: TADODataSet.Filter Syntax Fehler
 
Ich arbeite immer mit OnFilterrecord bei TADODataset
Delphi-Quellcode:
procedure TForm1.TADODataset1FilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
begin
  accept := ((TADODatasetx.asinteger > 10)and ((TADODatasety.asinteger > 10)
                                               or (TADODatasetz.asinteger > 100)));
end;

omata 8. Okt 2010 18:47

AW: TADODataSet.Filter Syntax Fehler
 
Schöner ist allerdings...
Delphi-Quellcode:
procedure TForm.TADODatasetFilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
begin
  accept := (    (Dataset.FieldByName('x').AsInteger > 10)
             and (   (Dataset.FieldByName('y').AsInteger > 10)
                  or (Dataset.FieldByName('z').AsInteger > 100)));
end;


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