Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Namen über mehrer Tabellen suchen/geleichzeitig anzeigen (https://www.delphipraxis.net/74654-namen-ueber-mehrer-tabellen-suchen-geleichzeitig-anzeigen.html)

Surrounder 7. Aug 2006 10:15

Datenbank: NexusDB • Version: 2.05 • Zugriff über: Datasource / Query

Namen über mehrer Tabellen suchen/geleichzeitig anzeigen
 
Ich hab für mich ein komplexes Problem wo ich nicht so richtig weiss wie ich es lösen soll. Ich erkläre zuerst einmal meinen Aufbau:

1. Tabelle = Welle
2. Tabelle = Lager

Die zweite Tabelle enthält also "n" Einträge die zu jeweils einem Eintag in der ersten Tabelle gehören. In der Lagertabelle sind viele Parameter und eben auch der Lagername gespeichert. Abhängig davon werden eben Messungen durchgeführt

3. Tabelle = Referenzen

Irgend eine von den vielen Messungen wird als Referenzmessung gekennzeichnet, und diese wird in der Referenztabelle gespeichert. In dieser Referenztabelle soll jetzt aber nicht die Lagernummer sondern der Name der Lagerstelle nachher in meiner Software angezeigt werden. Jetzt könnte ich klar einfach den Namen in der Refernztabelle speichern. Das geht aber leider nicht, denn der Name ändert sich ab und zu ( Kundenwunsch, und der ist Befehl ). Also muss ich in der Referenztabelle mir die Nummer der Welle und des Lagers merken, und würde nun gerne darüber den Namen wieder bekommen.

Mein erste Versuch:

Die Tabelle "Lager" hat als Mastersource die Tabelle "Welle", die Tabelle "Welle" hat als Mastersource die Tabelle "Referenzen". Das funktioniert auch so weit, wenn ich einen Eintrag in der Tabelle "Referenzen" selektiere, dann wird im Grid die richtige Welle und die dazugehörigen Lagerstellen angezeigt. Was ich jetzt noch nicht habe ist, dass die Namen automatisch im Grid der Tabelle "Referenzen" stehen.

Also habe ich über den Fieldetitor der Tabelle ein weiters Feld in der Tabelle eingeführt, und dieses als Lookup ( "Nachschlagen" )Feld definiert. Dort als Schlüsselfeld die Lagernummer der Referenztabelle gewählt, als Datenmenge die Datasource die auf die Lagertabelle zeigt, als Schlüssel die Lagernummer und als Ergebnis den Lagernamen

Das klappt in soweit, dass ich für den ersten Eintrag in der Referenztabelle den richtigen Namen bekomme. Es sieht aber so aus als ob der Lookup nicht durch die Datenbank läuft, denn ich bekomme bei allen Wellen den Namen für die Lager des ersten Wellentyps

Ich hoffe ich habs verständlich erklärt. Hat jemand eine Idee wie ich es schaffe dass für alle Wellen und deren Lager in der Tabelle "Referenzen", die ja alles gleichzeitig anzeigt, die Namen der Lager zu bekommen?

marabu 7. Aug 2006 10:40

Re: Namen über mehrer Tabellen suchen/geleichzeitig anzeigen
 
Hallo,

wenn eine Query den DataSet für dein Referenzen-Grid liefert, dann könntest du die Namen der Wellen und Lager per Join beisteuern:

SQL-Code:
/* WELLEN (ID, NAME, ...) */
/* LAGER (ID, NAME, ...) */
/* REFERENZEN (ID, WELLEN_ID, LAGER_ID, ...) */

SELECT R.*, W.NAME, L.NAME
FROM REFERENZEN R, LAGER L, WELLEN W
WHERE R.WELLEN_ID = WELLEN.ID AND E.LAGER_ID = LAGER.ID
Grüße vom marabu

Surrounder 7. Aug 2006 11:31

Re: Namen über mehrer Tabellen suchen/geleichzeitig anzeigen
 
Das verstehe ich jetzt nicht ganz, ich hab das mal versucht, aber es kommt nicht das raus was ich will.

SELECT Referenz.*, KennDatLager.LagerName
FROM Referenz, KennDatLager, KennDatTyp
WHERE Referenz.WellentypNr = KennDatTyp.WellentypNr AND Referenz.LagerNr = KennDatLager.LagerNr

Ich bekomme dann jede Referenz 6 mal aber der Name der Lagerstelle ist nicht dabei, wo bekomme ich den dann her?

Hier nochmals mein Aufbau der Tabellen:

//* KennDatTyp ( ID, WellenNummer, Parameter ) // das ist das was ich oben als Wellen bezeichnet habe
//* KennDatLager ( ID, IDKennDatTyp, LagerNummer, LagerName, Parameter ) // Lager
//* Referenz ( ID, WellenNummer, LagerNummer, Referenzparameter )

marabu 7. Aug 2006 12:27

Re: Namen über mehrer Tabellen suchen/geleichzeitig anzeigen
 
Vergiss meinen Vorschlag mit JOIN - der taugt nichts - und lass uns noch ein wenig über dein Datenmodell diskutieren, bevor wir zur Lösung kommen. Wenn dein Modell stimmt, dann signalisiert KENNDATLAGER.IDKENNDATTYP, dass es eine 1:n Beziehung von Welle zu Lager gibt - hast du auch so beschrieben. Dann aber gibt es zu jedem Lager nur eine Welle und der Verweis auf ein Lager in Tabelle REFERENZ identifiziert indirekt die Welle. REFERENZ.WELLENNUMMER ist dann ein Normalisierungsfehler. Außerdem solltest du in Tabelle REFERENZ nicht WellenNummer und LagerNummer speichern. Eine Datenbeziehung wird über Schlüsselfelder hergestellt.

marabu

Surrounder 7. Aug 2006 13:00

Re: Namen über mehrer Tabellen suchen/geleichzeitig anzeigen
 
Du hast vollkommen Recht, ich habe dabei nur ein Problem:

Der Bediener hat also eine Welle und die Lagerstellen definiert und macht die Referenz. Das passt dann auch so wie Du es beschreiben hast wenn ich die ID der Lagerstelle bei den Refernzen speichere dann finde ich auch den Namen. Jetzt ist es nur so dass die mir irgendwann Wellen löschen und neu anlegen, so dass diese dann eine neue ID bekommen, die Referenz soll aber die gleiche bleiben. Dann passt aber die ID nicht mehr zwischen Referenztabelle und Lager, deshalb hat mein Vorgänger den Wellentyp und die Lagerstelle in die Referenztabelle abgelegt. Bisher war das auch ok, denn die wollten nur die Lagernummer sehen, jetzt ist aber eben einer auf die Idee gekommen dass der Lagername sinnvoller wäre.

Klar könnte ich jetzt den Namen auch einfach in der Referenztabelle ablegen, nur der ändert sich eben auch wenn die eine Welle löschen und mit der gleichen Nummer neu anlegen und dann hab ich wieder ein Problem.

Ich weiss dass die Lösung wie es jetzt gemacht ist nicht die beste ist, aber ich kanns eben auch nicht einfach ändern, denn dann müssten wir die Datenbank an allen Anlagen auch tauschen.

marabu 7. Aug 2006 13:37

Re: Namen über mehrer Tabellen suchen/geleichzeitig anzeigen
 
Reicht unter diesen Umständen nicht vielleicht doch das hier?

SQL-Code:
select r.*, l.lagername
from referenz r, kenndatlager l
where r.lagernummer = l.lagernummer
marabu

mbamler 7. Aug 2006 13:50

Re: Namen über mehrer Tabellen suchen/geleichzeitig anzeigen
 
Ich bin der Meinung das "union" dir weiterhelfen sollte
(Gibt's bei deinem DB-System auch - habe ich schon nachgeschaut)

Gruß
Matthias

Surrounder 7. Aug 2006 14:59

Re: Namen über mehrer Tabellen suchen/geleichzeitig anzeigen
 
Zitat:

Zitat von marabu
Reicht unter diesen Umständen nicht vielleicht doch das hier?

SQL-Code:
select r.*, l.lagername
from referenz r, kenndatlager l
where r.lagernummer = l.lagernummer
marabu

Leider nein, denn ich hab ca. 100 Wellen und die haben natürlich alle ein Lager mit der Nummer 1 :roll:

Union sagt mir leider gerade nix, aber ich schau mal nach :-)

Surrounder 7. Aug 2006 16:49

Re: Namen über mehrer Tabellen suchen/geleichzeitig anzeigen
 
Zitat:

Zitat von mbamler
Ich bin der Meinung das "union" dir weiterhelfen sollte
(Gibt's bei deinem DB-System auch - habe ich schon nachgeschaut)

Gruß
Matthias

Also ich denke auch es sollte mit Union gehen, aber ich bekomme es nicht hin :-(

Vielleicht kann mir jemand helfen

SQL-Code:
SELECT R.*
FROM Referenz R, KennDatTyp T
WHERE R.WellentypNr = T.WellenTypNr
UNION
SELECT R.*, L.LagerName
FROM Referenz R, KennDatLager L
WHERE R.LagerNr = L.LagerNr
Ich habe die Query auf Basis der Referenztabelle erstellt oder muss die auf die Lagerstellen zeigen?

mkinzler 7. Aug 2006 16:50

Re: Namen über mehrer Tabellen suchen/geleichzeitig anzeigen
 
Bei UNIONS mussen diue felder der Teilabbfragen identisch sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:43 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 by Thomas Breitkreuz