Entwickler-Ecke

Datenbanken - Filtern von TClientDataset zur Laufzeit geht nicht


theCylus - So 03.05.09 21:07
Titel: Filtern von TClientDataset zur Laufzeit geht nicht
Hallo!
Ich habe mehrere TDBGrids, die Daten des TClientDataset anzeigen (sollen). Jeder Datensatz enthält unter anderem das Feld "Wagen". Zur Laufzeit wird dem Feld "Wagen" jedes Datensatzes ein variabler Integerwert zugewiesen. Nun möchte ich z.b. In TDBGrid1 alle Datensätze sehen, bei denen "Wagen" den Wert 1 hat. Setze ich einen Filter in der GUI, funktioniert das wunderbar. Setze ich den Wert TClientDataset1.DataSource.Dataset.Filter allerdings zur Laufzeit, bekomme ich eine Exception ... "Zugriffsverletzung beim Lesen".

Das ganze ist folgendermaßen aufgebaut: Form1 -> PageControl -> TabSheets, TDBGrid

Es soll beim Wechsel des TabSheet, das jeweils entsprechende TDBGrid "gefiltert" werden. Wagen 1, Wagen 2 usw. Das Ganze löse ich über OnEnter. Weiß jemand, worauf ich beim Filter setzen zur Laufzeit achten muss? Bzw wie die exakte Syntax ist, wenn das TDBGrid nur die Datensätze anzeigt, die bei "Wagen" den Wert 1 haben?

Vielen Dank schonmal im Voraus!


Chemiker - So 03.05.09 21:26

Hallo theCylus,

TDBGrid? Besser myDBGrid

Bis bald Chemiker


theCylus - So 03.05.09 21:30

Was ist denn der Vorteil von myDBGrid? Ich bin bei meinem Programm nach der Anleitung von http://www.delphi-treff.de/tutorials/datenbanken/einfache-datenbanken-mit-mybase/page/1/ vorgegangen. Das Problem betrifft ja nicht das Grid sondern den TClientDataset.


Chemiker - So 03.05.09 22:00

Hallo theCylus,

das war jetzt nur ein Beispiel. Wenn Du das TDBGrid auf das Form ablegst wird von Delphi automatisch der Name (DBGrid1) vergeben.
In Deinem Beispiel hast Du den Namen auf TDBGrid geändert, das kann zu Problemen führen.

Bis bald Chemiker


theCylus - So 03.05.09 22:05

Sorry, mein Fehler: Ich habe das TDBGrid nur der Verständlichkeit halber hier so genannt. Da gibt es also keine Probleme.

[edit]
TClientDataset1.DataSource.DataSet.Filtered := False; <- Erzeugt eine dieselbe Exception (Fehler beim Lesen von Adresse...)
TClientDataset1.DataSource.DataSet.Filter := 'Wagen = 1'; <- Erzeugt eine dieselbe Exception (Fehler beim Lesen von Adresse...)
Allerdings eben nur bei Verwendung zur Laufzeit. Im Objektinspektor lassen sich die Werte problemlos zuweisen und arbeiten auch korrekt.
[/edit]


Chemiker - So 03.05.09 22:32

Hallo theCylus,

alles klar.

Versuchst nur mit:


Delphi-Quelltext
1:
2:
TClientDataSet1.Filtered:= TRUE;
 TClientDataSet1.Filter := 'Wagen = 1';



Bis bald Chemiker


theCylus - So 03.05.09 22:54

Vielen Dank! Funktioniert genau so wie gewünscht!


Chemiker - So 03.05.09 22:57

Hallo theCylus,

die Namen sind immer noch sehr unglücklich gewählt.

Besser:


Delphi-Quelltext
1:
2:
BestellungClientDataSet: TClientDataSet;
ArtikelClientDataSet: TClientDataSet;

Bis bald Chemiker


theCylus - So 03.05.09 23:06

Wie gesagt, ich habe die Namen nur hier so formuliert, der besseren Verständlichkeit halber. Aber jetzt läuft ja alles so, wie es soll.