Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Variablen im String für .Filter-Eigenschaft von TADODataSet (https://www.delphipraxis.net/123552-variablen-im-string-fuer-filter-eigenschaft-von-tadodataset.html)

fragile 4. Nov 2008 10:30

Datenbank: MS SQL Server • Version: 2005 • Zugriff über: ADO

Variablen im String für .Filter-Eigenschaft von TADODataSet
 
Hi,
ich möchte mir dynamisch einen Filter für Daten, die ich über eine TADODataSet-Komponente hole, generieren.
Das Format für diesen Filterstring ist ja die SQL-Syntax, also ein String mit Teilstrings in Hochkomata eingeschlossen.
Wie erzeuge ich aus einem Rückgabe-String einen String der Form '<RückgabeString>', also setze diesen nochmal explizit in Hochkomata ?

Warum dieser Post in Datenbanken ?
Ich suche derzeit nach einer Möglichkeit, mit einer Gridkomponente Daten gefilter auszugeben. Da ich keine Lösung gefunden habe (bisher),
manipuliere ich zur Laufzeit die TADODataSource mit dem Filterargument. Wenn jemand eine elegantere Lösung weiß, immer her damit ;).

Grundsätzliche Aufgabenstellung: Erstelle eine Datenmaske, die neben normalen TDBEdit-Feldern für firmenname etc. eine Grid-Komponente enthält,
die ein Kontaktdaten-"Array" abbildet. (Also eine Tabelle der Form : Email geschäftlich - <wert1> | Email privat - <wert2> usw.)
Kontaktdaten werden in 2 speziellen Tabellen "erzeugt": Eine Tabelle mit der Firmennummer als FK und den Feldern Kontaktart_ID und Kontaktdetail.
Kontaktart_ID wird dann in einer 2. Tabelle mit einer Bezeichnung aufgelöst...

Bin für Tipps und Hilfe dankbar, zwar Datenbank-mäßig recht fit, aber Delphi-Neuling.

Gruß
F. :)

HeikoAdams 4. Nov 2008 10:38

Re: Variablen im String für .Filter-Eigenschaft von TADOData
 
Ich würde mir mal den Format-Befehl von Delphi anschauen. Damit sollte das von Dir gewünschte zu realisieren sein.

fragile 4. Nov 2008 11:14

Re: Variablen im String für .Filter-Eigenschaft von TADOData
 
Jo danke,
das Format-Thema hab ich gelöst - zum Grid-Filter-Thema irgendwelche Ideen :) ?

nahpets 4. Nov 2008 11:35

Re: Variablen im String für .Filter-Eigenschaft von TADOData
 
Hallo,

bin mir nicht ganz sicher, ob ich Deine Gridfragestellung verstanden habe:

Du hast Daten in mehreren Tabellen, die Du zusammen anzeigen möchtest?

sowas:
SQL-Code:
select * from a,b where a.id = b.id
Nimm Dir dafür eine TAdoQuery, versorge sie mit dem für Dich korrekten SQL und öffne sie.
Die TAdoQuery verbindest Du mit einem TDataSource und dieses mit Deinem TDBGrid.
Damit sollten die von Dir gewünschten Daten in dem Grid zu sehen sein.

Die TAdoQuery hat übrigens auch die Filterattribute, hier könntest Du wahrscheinlich per SQL "alle" Daten laden und per Filter analog zum TAdoDataSet auf den gewünschten Teilbereich einschränken.

fragile 4. Nov 2008 12:03

Re: Variablen im String für .Filter-Eigenschaft von TADOData
 
Mein Grundkonstrukt auf Datenbankebene sieht wie folgt aus :

Ich fasse die relevanten Felder für z.B. die Firmen-Eingabemaske mittels JOINs in einer View zusammen (View_Firmensicht).
Dieser enthält eine Menge fast identischer Datensätze, bei denen nur die Felder Kontaktdaten_ID und Kontaktdetails abweichen.

Das Grid soll jetzt genau diese bis auf die beiden Felder zusammengehörigen Datensätze zu einem bestimmten Matchcode anzeigen.

nahpets 4. Nov 2008 12:22

Re: Variablen im String für .Filter-Eigenschaft von TADOData
 
Hallo,

sorry, das verstehe ich nicht:
Zitat:

Zitat von fragile
Mein Grundkonstrukt auf Datenbankebene sieht wie folgt aus :

Ich fasse die relevanten Felder für z.B. die Firmen-Eingabemaske mittels JOINs in einer View zusammen (View_Firmensicht).
Dieser enthält eine Menge fast identischer Datensätze, bei denen nur die Felder Kontaktdaten_ID und Kontaktdetails abweichen.

Das Grid soll jetzt genau diese bis auf die beiden Felder zusammengehörigen Datensätze zu einem bestimmten Matchcode anzeigen.

Du hast also in Deinem Dataset alle Daten zusammen, die Du brauchst?
Im Grid soll' aber nur eine Teilmenge angezeigt werden. Diese Teilmenge besteht aus mehreren Zeilen und soll nicht alle Spalten des Views enthalten?

Verbinde in der Entwicklungsumgebung Dein Dataset mit einer Datasource und diese mit dem DBGrid.
Öffne den Dataset (Active = True) im Objektinspektor.
Nun sollten im DBGrid alle Spalten der Ergebnismenge zu sehen sein.
Mache einen Doppelklick auf das DBGrid. Es erscheint ein leerer Propertyeditor.
Oben ist der dritte Button von links aktiviert.
Klicke drauf.
Es sollte nun eine Liste der zur verfügungstehenden Spalten erscheinen.
Entferne alle die Spalten, die Du im Programm nicht sehen möchtest.
Schließe den Propertyeditor und schließe das Dataset.

Hoffentlich liege ich jetzt mit meiner Spekulation nicht vollständig daneben.

fragile 4. Nov 2008 12:39

Re: Variablen im String für .Filter-Eigenschaft von TADOData
 
Hehe,
ja ich weiß, ist nicht ganz so trivial - ich möchte nicht einzelne Spalten ausblenden, sondern quasi einzelne Reihen ;)...

Grundsätzlich :

Wie oben schon beschrieben habe ich eine ganz normale Firmendatentabelle, die aber zu 3 anderen Tabellen in Beziehung steht.
Eine Beziehung , in der der Firmentabellen-Datensatz als Fremdschlüssel auftaucht, ist die Tabelle "Kontaktdetails".

Ich kanns nicht anders erklaeren, ich habe halt eine dynamisch wachsende Struktur der Kontaktdaten "Email, Telefon,Telefax" etc. erzeugt.
Dies eben mit einem Auslagern der entsprechenden Datenfelder der Firmentabelle in eigene Tabellen - übliche Vorgehensweise denke ich.

Auf Datenbank-Ebene habe ich einen View, der mir dieses Konstrukt wieder zusammenführt, sprich die FK-Felder entsprechend aufschlüsselt, so daß ein Datensatz
wie folgt aussieht : <Firmentabelle_Matchcode>,<Firmentabelle_Name>,... ,<Kontaktart>,<Kontaktdetail>.
Soweit so gut.

Hat eine Firma also z.b. Email, Telefax, Telefon, Handynrn stehen in diesem View mehrere Datensätze zur gleichen Firma, die sich nur in den Feldern "Kontaktart" und "Kontaktdetail" unterscheiden, also:

Müller GmbH , Müller ,.....,Email 1,fff@ddd.de
Müller GmbH , Müller ,.....,Telefon,02293485857
Müller GmbH , Müller ,.....,Telefax, 02293485858

Soweit klar ? Diese Struktur möchte ich in Delphi in eine Formulartab zur Anzeige bringen....

nahpets 4. Nov 2008 12:54

Re: Variablen im String für .Filter-Eigenschaft von TADOData
 
Hallo,

meiner Meinung nach, sollte das mit dem von mir beschriebenen Weg funktionieren. Du nimmst halt eben keine Spalten weg.

Oder bin ich hier immer noch auf dem falschen Dampfer?

Malen wir mal virtuell eine Maske.

Links sind die Detailfelder zu Deinem Datensatz Müller zu sehen, alles DBEdit's ....
Irgendwo ist ein DBNavigator, mit dem man zum nächsten Satz kommt.
Rechts ist das DBGrid mit den Kontaktdetails.

In Deiner Ergebnismenge kommt Müller dreimal vor, weil er halt drei Kontaktdetails hat.

Im Grid sieht's Du aber alles was vor und nach Müller kommt, der kleine schwarze Pfeil links am Grid steht halt auf dem Detail, das als erstes zum Müller passt.

Letztlich brauchst Du 'nen Filter auf die Kontaktdetails von Müller. Also nichts weiter als 'ne klassische 1:n-Beziehung, nur mit dem Haken, dass alle Daten in einer Ergebnismenge hintereinander stehen.

Ach, das wird mir zu kompliziert. Häng doch bitte mal 'nen Screenshot von Deiner Maske hier rein, sonst reden wir noch Jahre aneinander vorbei. :wink:

fragile 4. Nov 2008 14:13

Re: Variablen im String für .Filter-Eigenschaft von TADOData
 
Die Maske ist genauso, wie von dir beschrieben.
Und ja ich brauche im Grid einen Filter - wie mach ich das am besten ?

nahpets 4. Nov 2008 14:27

Re: Variablen im String für .Filter-Eigenschaft von TADOData
 
Hallo,

Du musst der Datasource des DBGrids einen Filter verpassen, vermutlich sowas:

Delphi-Quellcode:
DataSource.Filtered := False;
DataSource.Filter := 'Kontaktdaten_ID = müllers_id';
DataSource.Filtered := True;
Wenn Du allerdings die Daten für das Grid und für die "restliche" Anzeige in einer Ergebnismenge hast, hast Du hier vermutlich ein Problem.

Solltest Du die Daten (so wie ich vermute) in einer Ergebnismenge haben, so löse das bitte wieder auf.
Arbeite mit zwei Ergebnismengen, eine für Müllers Details und eine für Müllers Kontakte.

Wenn Du nun in der Detailtabelle einen Satz vor oder zurück gehst, setzt Du für die Kontaktdaten einen neuen Filter auf die entsprechende ID. Dafür kannst Du das AfterScroll-Ereignis der Detailmenge nutzen. Das Ereignis wird nach jeder Änderung des Datensatzzeigers ausgelöst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:40 Uhr.
Seite 1 von 2  1 2      

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