AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Grundsätzliches zu TClientDataSet, TDataSource,...
Thema durchsuchen
Ansicht
Themen-Optionen

Grundsätzliches zu TClientDataSet, TDataSource,...

Offene Frage von "thabaker"
Ein Thema von thabaker · begonnen am 5. Jul 2007 · letzter Beitrag vom 7. Jul 2007
Antwort Antwort
thabaker

Registriert seit: 1. Jul 2007
50 Beiträge
 
Turbo Delphi für Win32
 
#1

Grundsätzliches zu TClientDataSet, TDataSource,...

  Alt 5. Jul 2007, 22:21
Datenbank: MyBase • Zugriff über: Delphi Programm
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.
Miniaturansicht angehängter Grafiken
schema_484.png  
  Mit Zitat antworten Zitat
daddy

Registriert seit: 9. Sep 2005
Ort: Köln
126 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Grundsätzliches zu TClientDataSet, TDataSource,...

  Alt 6. Jul 2007, 10:27
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
  Mit Zitat antworten Zitat
thabaker

Registriert seit: 1. Jul 2007
50 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Grundsätzliches zu TClientDataSet, TDataSource,...

  Alt 6. Jul 2007, 12:22
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".
Miniaturansicht angehängter Grafiken
schema2_874.png  
  Mit Zitat antworten Zitat
noidic

Registriert seit: 21. Nov 2005
Ort: Mönchengladbach
25 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Grundsätzliches zu TClientDataSet, TDataSource,...

  Alt 6. Jul 2007, 12:41
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.
The light at the end of the tunnel may be an oncoming dragon.
  Mit Zitat antworten Zitat
daddy

Registriert seit: 9. Sep 2005
Ort: Köln
126 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Grundsätzliches zu TClientDataSet, TDataSource,...

  Alt 6. Jul 2007, 12:50
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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

Re: Grundsätzliches zu TClientDataSet, TDataSource,...

  Alt 6. Jul 2007, 12:54
Hier ist noch ein Artikel zum Prinzip :

http://dn.codegear.com/article/28876
Gruß
Hansa
  Mit Zitat antworten Zitat
thabaker

Registriert seit: 1. Jul 2007
50 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Grundsätzliches zu TClientDataSet, TDataSource,...

  Alt 7. Jul 2007, 13:33
@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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:18 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