Sind mehrere DataSources, DataSets für ein DBObjekt möglich?
-
Hallo,
ich habe eine grundsätzlich Frage zu DataSource und DataSet. Ich versuche Fall 2 in meinem Programm umzusetzen, bislang erfolglos. Sieht jemand eine Lösung? Ist das überhaupt so möglich?Fall 1: Das funktioniert
(ADODataSet1 + DataSource1) -- DBLookupComboBox1
(ADODataSet2 + DataSource2) -- DBLookupComboBox2
(ADODataSet3 + DataSource3) -- DBLookupComboBox3Fall 2: Kann das funktionieren? Wenn ja, wie?
(ADODataSet1 + DataSource1) \
(ADODataSet2 + DataSource2) -- DBLookupComboBox1
(ADODataSet3 + DataSource3) /
-
Du könntest
-falls es sich um eine Query-Datenanfrage handelt, mit Unions diese drei datenquellen bei der Datenbankabfrage zusammenfassenSELECT * FROM a
UNION
SELECT * FROM b- oder Du kopierst die Datensätze der drei Quellen in eine vierte leere.
In beiden Fällen muss Du Dich aber um die Eindeutigkeit der Sätze kümmern.
-
Hallo @witte_,
danke für Deinen Hinweis. Ich habe das nicht deutlich genug erklärt, worauf ich hinaus will:Fall 1: Das funktioniert
(ADODataSet1 + DataSource1) -- DBLookupComboBox1
(ADODataSet2 + DataSource2) -- DBLookupComboBox2
(ADODataSet3 + DataSource3) -- DBLookupComboBox3Fall 2: Kann das funktionieren? Wenn ja, wie?
..------> ADODataSet1 + DataSource1 \
..|
xor ----> ADODataSet2 + DataSource2 -- DBLookupComboBox1
..|
..------> ADODataSet3 + DataSource3 /Die DBLookupComboBox1 wird beim Anklicken eines DBGrids über die angeklickte Zelle des DBGrids verschoben, wo sie dann in der DropDownliste die zulässigen Einträge anzeigen soll.
Für jede Spalte des DBGrids wird deshalb eine eigene Abfrage benötigt, deren Ergebnis dann in der Dropdownliste der DBLookupComboBox angezeigt werden soll.
Es soll nur eine DBLookupComboBox geben, die über alle Spalten des DBGrids verschoben werden kann.
Ich muß also hier eine Zuweisung (=DataSet, DataSource) durchführen. Geht das?.Spalte1 Spalte2 Spalte3
...DBLookupComboBox1
................xor
..../.............|............\
Zelle11 Zelle21 Zelle31
Zelle12 Zelle22 Zelle32
usw.
-
Immer noch kein Vorschlag? Ist das Problem so schwierig? Es müßte doch eine Antwort zu finden sein.
Hier also noch ein Erklärungsversuch.
Progammaufbau:
DBGrid1..........................DataSource1..ADODataSet1,
TDBLookupComboBox1..DataSource2..ADODataSet2, ADODataSet3Die TDBLookupComboBox wird beim Anklicken einer DBGrid-Zelle vor diese Zelle hinkopiert.
void __fastcall TForm1::Button1Click(TObject *Sender) { [..] //DBGrid1 besteht aus 2 Feldern: "Name" und "Ort" //Name bzw Ort sollen nur mit Daten aus "einem" Lookupfeld geändert/befüllt werden können. DataSource1->DataSet = ADODataSet1; //Das DBGrid erhält d Datensätze einer SQL-Abfrage von ADODataSet1 aus Tabelle name_ort DBGrid1->DataSource = DataSource1; //Abfrage für Nachschlagefeld der DBLookupComboBox1 für das Feld "Name" aus der Tabelle name ADODataSet2->CommandType = cmdText; ADODataSet2->CommandText = "SELECT * FROM name"; ADODataSet2->Open(); //Abfrage aus der Tabelle ort für das Nachschlagefeld der DBLookupComboBox1 für das Feld "Ort" ADODataSet3->CommandType = cmdText; ADODataSet3->CommandText = "SELECT * FROM ort"; ADODataSet3->Open(); [..] //bis hier läuft alles bestens: Die DataSets enthalten die richtigen Datensätze, das DBGrid wird mit Name, Ort befüllt } void __fastcall TForm1::DBGrid1ColEnter(TObject *Sender) { TDBGrid* dbG = dynamic_cast<TDBGrid*>(Sender); switch (dbG->SelectedIndex){ case 0 : DataSource2->DataSet = ADODataSet2; //Zuweisung DataSet für Feld "Name" (Hier tritt die Exception auf) DBLookupComboBox1->DataSource = DataSource1; //Verbindung zum DBGrid DBLookupComboBox1->ListSource = DataSource2; DBLookupComboBox1->DataField = "Name"; DBLookupComboBox1->KeyField = "Name"; DBLookupComboBox1->ListField = "Name"; break; case 1 : DataSource2->DataSet = ADODataSet3; //Zuweisung DataSet für Feld "Ort" (oder hier tritt die Exception auf) DBLookupComboBox1->DataSource = DataSource1; DBLookupComboBox1->ListSource = DataSource2; DBLookupComboBox1->DataField = "Ort"; DBLookupComboBox1->KeyField = "Ort"; DBLookupComboBox1->ListField = "Ort"; break; default : ; }; }**Wenn ich im DBGrid beim Anklicken in der gleichen Spalte bleibe funktioniert die TDBLookupComboBox im Grid.
Sobald ich zwischen den Spalten "Name" und "Ort" hin- u herklicke erhalte ich die Exception:
..ist eine Exception der Klasse EDatabasError aufgetreten. Meldung: 'DBLookupComboBox1: Das Feld 'Name' bzw *'Ort' wurde nicht gefunden'..
(*je nachdem was zuerst angeklickt wurde)Weiß denn keiner, was ich hier falsch mache?**
