Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Grundsätzliches zu TClientDataSet, TDataSource,... (https://www.delphipraxis.net/95374-grundsaetzliches-zu-tclientdataset-tdatasource.html)

thabaker 5. Jul 2007 21:21

Datenbank: MyBase • Zugriff über: Delphi Programm

Grundsätzliches zu TClientDataSet, TDataSource,...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich lese schon den ganzen Tag hier und im Internet zu Datenbanken mittels TClientDataSet als Mybase.
Aber noch ist mir nicht alles klar...
1)Wenn ich dem Tutorial "MyBase" auf dsdt folge, erstelle ich in Schritt 2 die Datenbank wenn ich den Menüpunkt "DataSet erstellen" nutze. Als sonst nur MySQL über PHP Benutzer frage ich mich jetzt, was habe ich eigentlich erzeugt? Anscheinend eine Datenbank MIT Tabelle? Die dann sinnigerweise dann die davor definierte Struktur aufweist. Ist es dann richtig zu sagen für jede Tabelle brauche ich ein eigenes TClientDataSet?

2)Dann stelle ich über ein TDataSource Verbindung mit einem TDBGrid her. Funktioniert. Nur, wozu brauche ich das TDataSource? Effektiv macht es in dem Beispiel ja "nichts". Was kann ich damit machen?

3)Weiter gehts mit dem Auswählen der Daten. Dazu kann ich ja das Property "Filter" von TClientDataSet verwenden und mit Filtered := TRUE aktivieren. Soweit so klar.

Nun das Problem:

4)Die Daten aus dem TClientDataSet sind immer nur direkt verfügbar, d.h. eine Filter-Eigenschaft verändert die "effektive" Datenmenge der Tabelle (für z.B. TDBGrid). Ich bin aus MySQL/PHP gewöhnt eine Abfrage zu senden und eine NEUE Datenmenge als Ergebnis zu bekommen.
Gibt es etwas analoges hier?
(TQuery funktioniert nicht weil ich die BDE nicht installieren will.)

konkret will ich so etwas haben:
TClientDataSet stellt Basismenge, danach eine beliebige Anzahl "Filter"-Objekte, die jeweils wieder für sich in DBGrids angezeigt werden können.

Sonst würde ich ja die Daten aus dem TClientDataSet für jeden parallelen Filter duplizieren müssen, was nicht im Sinne der Logik ist.

daddy 6. Jul 2007 09:27

Re: Grundsätzliches zu TClientDataSet, TDataSource,...
 
Willkommen in der DP

1. Ja.

2. TDataSource kümmert sich darum, dass Änderungen an den zugrundeliegenden Daten (nach dem Editieren, Scrollen etc.) in die verknüpften Anzeigekomponenten übernommen werden.

3. + 4. Du solltest nicht mit der Filter-Eigenschaft arbeiten, sondern das Select, das dem ClientDataSet zugrunde liegt, so formulieren, dass Du nur die Daten erhältst, die Du benötigst (also filtern willst).

Gruß Daddy

thabaker 6. Jul 2007 11:22

Re: Grundsätzliches zu TClientDataSet, TDataSource,...
 
Liste der Anhänge anzeigen (Anzahl: 1)
1) und 2): ok

3) und 4): Habe nun doch nochmal mit den Komponenten gespielt und siehe da, genau was ich wollte funkioniert jetzt.
Siehe dazu den Anhang.
- Ein TClientDataSet lädt die lokalen Daten.
- Die nächste Komponente ist ein TDataSetProvider (hatte keine Ahnung dass genau das das fehlende Bindeglied ist) und verbinden diesen mit dem ClientDataSet.
- Nun folgt pro "Kanal" ein weiteres ClientDataSet (*) und setzen das Property "ProviderName" auf den DataSetProvider.
- weiteres ist Standard, ein TDataSource und DBGrid.

Nun kann man unabhängig voneinander die "Kanal"-ClientDataSets filtern (Filter setzen und Filtered auf TRUE). Super :)

Zitat:

Du solltest nicht mit der Filter-Eigenschaft arbeiten, sondern das Select, das dem ClientDataSet zugrunde liegt, so formulieren, dass Du nur die Daten erhältst, die Du benötigst (also filtern willst).
Wie machen? ich habe mit dem obigen Aufbau versucht den CommandText zu setzen und Execute; aufzurufen, aber es kommt die Exception "Ausführung nicht unterstüzt: %s".

noidic 6. Jul 2007 11:41

Re: Grundsätzliches zu TClientDataSet, TDataSource,...
 
Statt mit dem DatasetProvider kannst du auch einem zweiten ClientDataset mittels CloneCursor die Daten zur Verfügung stellen, dieses zweide ClientDataset (und beliebig viele weitere) können dann auch unabhängig voneinder Filtern und Sortieren, arbeiten aber alle auf der selben Datenmenge.

daddy 6. Jul 2007 11:50

Re: Grundsätzliches zu TClientDataSet, TDataSource,...
 
Der Nachteil des nachträglichen Filterns ist, dass sich das ClientDataSet je erst einmal die komplette Datenmenge lädt. Normalerweise werden 3 Komponenten verwendet:
ClientDataSet -> DataSetProvider -> SQLDataSet
Beim SQLDataSet muss dann CommandType auf ctQuery gesetzt und CommandText mit dem Select-Befehl (inkl. where-Klausel) versehen werden.

Gruß Daddy

Hansa 6. Jul 2007 11:54

Re: Grundsätzliches zu TClientDataSet, TDataSource,...
 
Hier ist noch ein Artikel zum Prinzip :

http://dn.codegear.com/article/28876

thabaker 7. Jul 2007 12:33

Re: Grundsätzliches zu TClientDataSet, TDataSource,...
 
@niodic: Perfekt! habe auch gemerkt dass mit jedem ClientDataSet die Daten ja dorthinein kopiert werden (siehe Post 1 unerwünscht).

@daddy: ClientDataSet -> DataSetProvider -> SQLDataSet geht bei mir nicht, SQLDataSet braucht eine DataSource oder eine SQLConnection. Jedoch wenn ich keine SQLConnection habe kann ich kein SQL ausführen, dafür ist SQLConnection wohl unbedingt erforderlich?! wenn ich -> DataSource -> DBGrid weiterbaue kommt der Fehler "Die Operation ist bei einer unidirektionalen Datenmenge nicht gestattet" wenn ich im DBGrid DataSource auf das DataSource nach dem SQLDataSet setze.

@Hansa: habe ich auch gefunden gehabt aber nur überflogen, werde ihn jetzt mal richtig lesen ;)


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