Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Master-Detail-Verknüpfung (https://www.delphipraxis.net/8382-master-detail-verknuepfung.html)

barnti 3. Sep 2003 13:28


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

barnti 3. Sep 2003 14:22

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

Generalissimo 3. Sep 2003 14:35

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

Leuselator 3. Sep 2003 14:36

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...

Generalissimo 3. Sep 2003 14:37

Re: Master-Detail-Verknüpfung
 
Um deine letzte Frage zu beantworten:
die Verbindung wird über Keyfield=Datafield der
DBLookUpComboBox hergestellt

barnti 3. Sep 2003 15:05

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

Generalissimo 3. Sep 2003 15:15

Re: Master-Detail-Verknüpfung
 
:?: :?: :?:

erläutere mir das mal bitte näher, was du damit meinst

Leuselator 3. Sep 2003 15:24

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:
select * from Kunden
und ebenso eine TQuery mit angehangener TDataSource uf Tabelle 2:
SQL-Code:
select * from Kategorie
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

barnti 3. Sep 2003 15:26

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

Generalissimo 3. Sep 2003 15:31

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

barnti 3. Sep 2003 16:20

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

Leuselator 3. Sep 2003 17:38

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:
         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
mit Aliassen sind 'K', 'A' und 'KA' gemeint
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.

barnti 4. Sep 2003 08:09

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:

Daher hier meine 10 Gebote für den faulen Datenbankmenschen
Amen!(Einige dieser 'Regeln' sind sicherlich hilfreich, aber nicht im Interesse der OOP und widersprechen auch dem DB -Design) :wink:

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 05:13 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