![]() |
Master-Detail-Verknüpfung
Hallo,
ich Versuche eine Master-Detail-Verknüpfung hinzubekommen, habe aber so meine Verständnisprobleme. Dazu folgendes: 2 Tabellen: eine mit Kunden, die andere mit dessen Standorten. Eine 1 zu n Beziehung. Mein Anliegen ich möchte in einer DBLookupComboBox die Kunden stehen haben. Bei Auswahl eines Kunden dann dessen Standorte in einem DBGrid anzeigen lassen. Frage: lässt sich das mit Query Komponenten lösen? denn ich möchte nicht immer alle Inhalte verwenden. Und weiter: wie lässt sich ein Kunde und dessen Standorte beim OnShow-Event voreinstellen? Ich glaub ich habe eine Blockade!? Danke für einen Denkanstoß... Gruß, Barnti |
Re: Master-Detail-Verknüpfung
Hallo,
Nachtrag: Die Einstellungen sind bisher: QueryKunden: Database: Meine DB SQL: Select * from Kunden Query Standorte: Datenbank: Meine DB SQL: Select * from Standorte Das Grid ist über die Datasource mit der QueryStandorte verbunden Die DBLookUpComboBox über die DatasourceKunden mit der QueryKunden Noch gibt es aber keine Verbindung zwischen beiden Querys! Wo setze ich diese Eigenschaft? In der Datasource der einen Query? Please help Grüße, Barnti |
Re: Master-Detail-Verknüpfung
Hi,
du brauchst erstmal 2 Query 2 DataSource + die Restelemente für die Verbindung. 1. Query1_getKundenNamen: alle Kunden ermitteln die es gibt DS1_getKundenNamen: dazugehörige DS 2. DS1_getKundenNamen in DBLookUpComboBox als ListSource definieren 3. ListField bestimmen (das was in Combo angezeigt werden soll) 4. Query2_getStandorte: alle Standorte inkl. der NamenID (zu welchem Kunden der Standort gehört. 5. Ds_getStandorte (DataSource von Query2) als Datasource der DBComboBox definieren und Datafield auf die NamenID setzen 6. KeyField des DBCombo auf das Feld setzen das in Datafield angeben ist ich glaub so müsste es funktionieren. Probiers mal |
Re: Master-Detail-Verknüpfung
Liste der Anhänge anzeigen (Anzahl: 1)
Man nehme:
Table: Kunden Felder: IdKunden,Name Tabelle: Standorte Felder: IdStandorte,Ortsname Tabelle: KundenStandorte Felder: IdKunden,IdStandorte Dann Projekt i.A. öffnen und ein bisser auf die Propertys gucken. Der Geck ist, das die Query2 als DataSource die DataSource1 hat, welch an Query1 gebunden ist. immer, wenn sich nun in Query1 der Datensatzzeiger verändert (durch cklicken auf DbComboBox) wird der Query2 der Parameter IdKunden (erkennbar am Doppelpunkt im SQL-Text) übergeben und die Ergebnismenge der Query2 aktualisiert. hoffe, es hülft... |
Re: Master-Detail-Verknüpfung
Um deine letzte Frage zu beantworten:
die Verbindung wird über Keyfield=Datafield der DBLookUpComboBox hergestellt |
Re: Master-Detail-Verknüpfung
hi,
@ Generalissimo: Das kann nicht funktionieren, da Datasource eine Tabelle beschreibt... @ Leuselator: Das klingt doch schon sehr vielversprechend! Ich werde gleich mal basteln. Bedeutet das, ich muss eine DBComboBox nutzen nicht eine DBLookUp...? Danke erst mal, ich probier erst mal. Gruß, Barnti |
Re: Master-Detail-Verknüpfung
:?: :?: :?:
erläutere mir das mal bitte näher, was du damit meinst |
Re: Master-Detail-Verknüpfung
Liste der Anhänge anzeigen (Anzahl: 1)
DbLoockUp benutzt Du in folgender Situation: (Beispiel)
Tabelle1: Kunden Felder: IdKunden,Name,idKategorie Tabelle2: Kategorie Felder: idKategorie,Bezeichnung Inhalt Tabelle 1: 1,'Meier' ,1 2,'Schulze',2 3,'Müller' ,1 4,'Schmidt',3 Inhalt Tabellle 2: 1,'Toller Kunde' 2,'Ganz toller Kunde' 3,'Unglaublich supertoller Kunde' (nent man glaube ich Master-Detail-Verknüpfung) dann würdest Du eine TQuery mit anhängiger TDatasource auf Tabelle 1 setzen:
SQL-Code:
und ebenso eine TQuery mit angehangener TDataSource uf Tabelle 2:
select * from Kunden
SQL-Code:
auf deinem TForm platzierst Du nun DbEdits, die auf TDataSource1 gelinkt sind und eine DbLookUpComboBox, die auf DataSource1 gelinkt ist. Als DataField gibst Du dort idKategorie an, als ListSource die DataSource2, als KeyField das Feld IdKategorie und als ListField das Feld Bezeichnung - fertig
select * from Kategorie
|
Re: Master-Detail-Verknüpfung
Hallo nochmal,
ich habe jetzt mal die Einstellungen wie im Beispiel übernommen. Dazu folgendes: QueryKunde: Select * from Kunde QueryStandort: SELECT DISTINCT Standort.*, Kunde.* FROM Standort Standort, Kunde Kunde where Standort.Kunde_ID= :Kunde_ID Bei den Parametern der QueryStandort habe ich einen Parameter Kunde_ID angelegt. Jetzt erscheint beim Start immer die Fehlermeldung: QueryKunde: Field Kunde_ID not found Was kann ich tun (außer, dass ich mal ne Pause machen sollte)? Barnti |
Re: Master-Detail-Verknüpfung
genau wie Leuselator es erklärt hat meinte ich es auch
@barnti: schau mal nach ob der ":" wirklich davor ist |
Re: Master-Detail-Verknüpfung
Hallo,
Generalissimo: da haben wir uns falsch verstanden. Sorry. Das klappt natürlich mit einer DBCombo. Ich hatte anfangs eine DBLookupC. benutzt. Der Doppelpunkt ist in dem Statement vorhanden... Ich muss erst mal eine Pause einlegen. Ich melde mich spätestens morgen noch einmal. Danke für eure Anteilnahme bis hier, Gruß, Barnti |
Re: Master-Detail-Verknüpfung
Also für Zukunft:
Mach Dir das Leben nicht unnötig schwer! Programmierer (meint man) sind faul und gehen immer den Weg des geringsten Widerstandes (bzw. der geringstnötigen Gedächtnisleistung:)) Daher hier meine 10 Gebote für den faulen Datenbankmenschen: 1. Benenne Deine Tabellen nach ihrem Hauptinhalt 2. verwende den Plural (Kunden nicht: Kunde) - macht später die Querys leichter lesbar 3. Benenne Zwischentabellen (auch Verknüpfungstabellen genannt) nach den Tabellen, auf die sie verweisen und verwende einen Unterstrich zur Trennung z.B. Tabellen: Kunden,Standorte Zwischentabelle: Kunden_Standorte 4. Benenne das Schlüsselfeld des Primärschlüssels genauso wie die Tabelle, nur setze ein 'Id' davor also: 'IdKunden' 5. denke Dir einen 1-Stelligen Code für den DatenTyp aus und stelle diesen jedem Feldnamen voran, es sei denn es ist ein Id-Feld z.B. iFarbe (Integer), cNummer (char oder Varchar) lAktiv (Logisch/Boolean/Bit) tBeschreibung (Text) - das erleichtert Dir in Delphi die korrekte Ansprache der Felder (AsInteger,AsString etc) 6. verwende immer wieder die gleichen FeldNamen für die gleichartige Dinge (zb. Tabelle: Funktionen / Felder: IdFunktionen,cBezeichnung | Tabelle: Taetigkeiten / Felder: IdTaetigkeiten,cBezeichnung) 7. Wenn eine Eigenschaft eines Dinges, das Du in eine Tabelle stopfen möchtest mehr Werte annehmen kann, als Deine MausHand an freien Fingern hat, wenn alle Tasten gedrückt sind, dann pack es in eine Detailtabelle (Z.B. Tabelle: Rufnummern Feld: idRufnummernTyp / Tabelle: RufnummernTyp Felder: idRufnummernTyp,cBezeichnung Werte: 'Festnetz privat','Festnetz Büro','Funk privat','Funk dienstlich','Fax privat','Fax Büro','Pager privat','Pager dienstlich') 8. verwende Aliasse in Selects, die sich auf mehr als eine Tabelle beziehen, nutze für Haupttabellen wenn's geht 1 Buchstaben, für ZwischenTabellen 2 z.B. Tabellen: Kunden, Adressen,Kunden_Adressen dann :
SQL-Code:
mit Aliassen sind 'K', 'A' und 'KA' gemeint
select K.cVorname,
K.cName, A.cStrasse, A.cNummer, A.cPlz, A.cOrt from Kunden K left outer join Kunden_Adressen KA on KA.idKunden = K.idKunden left outer join Adressen A on A.idAdressen = KA.idAdressen where K.iGenus = 0 9. Nutze wenn immer möglich joins statt Unterabfragen. Unterabfragen (Subselects) sind zwar oft schneller vom Programmierer zu formulieren, meist jedoch deutlich weniger performant und nicht in allen db-Systemen verfügbar (MySQL bis dato soviel ich weis z.B. unterstützt keine Subselects). 10. Wenn Du kannst bleibe so ANS-SQL-konform wie möglich - erleichtert ungemein den Wechsel des Datenbanksystems. (Die einzige Versuchung der ich beim MS-SQL-Server meist nicht widerstehen kann sind die dort möglichen case-STatements in Selectanweisungen - sau-bequem :oops:) Ende der Gebote:) Also, Dein select von 16:26 Uhr "verstößt" gegen Faulheitsregel Nummer 8 ausserdem machst Du einen Cross-join (verknüpfe alle Datensätze aus Tabelle Kunde mit allen aus Tabelle Standorte) um ihn anschließend mit Distinct wieder einzugrenzen = ZuHause>Sydney>Tokio>NewYork>Tokio>Sydney>KneipeAn DerEcke Wenn Delphi (nicht BDE oder DatenbankSystem) diese Meldung bringt, dann hast Du wahrscheinlich doppelt auf Deine TQuery-Komponente geklickt, im daraufhin erscheinenden Dialog Felder hinzugefügt (möglicherweise auch alle), anschließend die Tabellenstruktur in Datenbank geändert (Feld hinzugefügt) und vergessen in Feldliste der TQuery dieses Feld hinzuzufügen. dann findet die TDatasSource das Feld nicht und meckert. So. Genug jetzt. |
Re: Master-Detail-Verknüpfung
Hallo ihr!
Das Problem hat sich folgendermassen gelöst: Die DBLookUpCombobox hatte in ihren Properties "ReadOnly" eingestellt. Dann kann das nicht funktionieren! Dort geändert - schwups - jetzt funktioniert es. Zitat:
Das Problem bei Ansi-SQL ist, das mysql es nicht überall unterstützt. Damit ist die Frage des DB -Wechsels überflüssig. ES GEHT! Nach einem Tag wurde das auch Zeit. Ich denke hier ist noch eine wichtige Regel, die der beherzte Programmierer zu achten hat (was sich grad wieder bestätigt): 11. Mach mal ne Pause! Danke für eure Unterstützung, auch wenn nicht immer die direkte Problemlösung in diesem Forum gewährt ist, ist es absolut erfreulich sich mal mit "Gleichgesinnten" auszutauschen! 8) Vielen Dank für das Interesse, Barnti |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz