Aufbau Datenmodell für Stücklistenkalkulation

Ron787878

Benutzer
Beiträge
24
Hallo zusammen,

ich habe aktuell folgendes Problem:
Ich bin am modellieren eines Datenmodells für eine Stücklistenkalkulation und weiß nicht wie ich Baugruppen und Unterbaugruppen zueinander zuweisen soll?
Ich möchte am Ende über ein Select Statement wissen wieviel das Produkt bzw. eine einzelne Baugruppe kostet?

Hier meine Idee bzw. Grundgerüst zum Datenmodell:

Beispiel dazu:

Wie würdet ihr am besten die tblBaugruppenzuordnungstabellen miteinander verknüpfen und im Anschluss daraus ein select Statement fahren.

Danke im Voraus.

Grüße
 
Werbung:
Dazu brauchst Du letztendlich rekursive Abfragen, das ist hier im Forum schon mehrfach besprochen worden, z.B. hier:
 
Warum fragst Du im MySQL-Unterforum, wenn es in Access gemacht werden soll? Das klingt ja nicht einmal ähnlich. Und nein, das ist eine klassische Aufgabe für Rekursion, und ob MySQL und/oder Access das können ist zweifelhaft. (aktuelle MySQL kann es wohl)
 
Access ist definitiv das schlechteste Werkzeug dafür, du brauchst ein echtes DBMS. Selbst MySQL/MariaDB wäre da besser, am besten Postgres oder MSSQL, da gibts hier auch das meiste Knowhow. Wenn schon vorhanden geht auch noch Oracle. Das Problem wird aber eher das Frontend werden.

Rekursion ist durchaus denkbar, hängt auch ein bisschen von der Tiefe der Struktur ab. Die klassische Stückliste – Wikipedia kann ja Baugruppen in einander schachteln, theoretisch unbegrenzt tief. Vor dem Hintergrund erschließt sich mir auch dein Tabellenmodell nicht. Klar, wenn du nur 2 oder 3 Ebenen hast ok, Tabelle Gruppe, Untergruppe, Einzelteil oder gleich alles in eine Tabelle, laufen wird das auch. Wenn du es aber richtig organisieren willst kommst du um eine flexible Hierarchie eigentlich nicht drum herum. In MSSQL gibt es dafür sogar eine eigene ID (nicht in Access). Die benutzt zwar irgendwie keiner, das Prinzip ist aber das selbe:
Am Ende kannst du den Baum mit CTE (nicht in Access) rekursiv (nicht in Access) durchlaufen und hast eine Liste aller Komponenten.
 
Servus, ja das wäre mir am liebsten leider lässt unsere IT nur Access zu.... deßhalb die Umsetzung in Access. Hier zwei Beispiele wie die es gemacht haben:

Wie würde aber das SQL-Select Statement dafür aussehen?
 
Also ich habe in Access schon mal ein altes Projekt gehabt, das ist aber sehr lange her. Ich kenne mich mit den ganzen Formularen nicht aus, ich denke aber die bestimmen darüber ob du am Ende für jede Untergruppe wieder eine Tabelle hast oder eventuell doch nur eine Tabelle brauchst die sich selbst referenziert.

Den Select macht man dann mit einem LEFT JOIN für jede Unterebene, das kann auch mehrfach die selbe Tabelle sein. Also Beispiel

tblGruppen
tblZuordnungen (Anzahl...)

Baugruppe A
Untergruppe B
Teil C

SELECT *
FROM tblGruppen e1
LEFT JOIN tblZuordnungen z2
ON e1.PK = z2.FKn
LEFT JOIN tblGruppen e2
ON z2.FKm = e2.PK
LEFT JOIN tblZuordnungen z3
ON e2.PK = z3.FKn
LEFT JOIN tblGruppen e3
ON z3.FKm = e3.PK

Die Anzahl musst du natürlich in jedem Schritt/Join mit berechnen. In diesem Fall kann Untergruppe B 2x in A stecken und C je 3x in B dann hast du
z2.anzahl * z3.anzahl * Teil

Die Details wenn es sich um ein tatsächliches Teil und keine Baugruppe handelt kannst du auch in eine eigene Tabelle packen, erfordert dann aber für jede Ebene einen weiteren Join denn du weist ja nicht ob der Eintrag in tblGruppen jetzt eine Ebene oder das finale Teil ist.
 
@ukulele

Servus,
ich habe auch schon darüber nachgedacht für jede einzelne Ebene (maximal 12 unter Ebenen) der Stückliste eine eigene Tabelle anzulegen. Nur ist mir noch nicht ganz klar welche Daten wo rein kommen.... kannst du mir ein konkretes Beispiel machen, für dein Tabellenaufbau?

Meine Idee:

tblEndprodukt:
- EndproduktID
- Bezeichnung

tblEbene1:
- BaugruppeID
- EndproduktID
- Menge

tblEbene2:
- BaugruppeID
- ParentBaugruppeID
- Menge

tblEbene3:
- BaugruppeID
- ParentBaugruppeID
- Menge

tblBaugruppe:
- BaugruppeID
- Bezeichnung
- Menge

tblBaugruppeZuordnung:
- BaugruppeID
- RohstoffID
- Menge

tblRohstoffe:
- RohstoffID
- Preis


Das Problem kst wie bekomme ich den Preis für ein Endprodukt oder eine Baugruppe über ein Select?

Grüße
 
In deinem Fall sehr viele Joins, für die drei gezeigten Ebenenen sind es 12, bei 12 Ebenen wären es 48. Es gibt ein Join Limit, vielleicht findest du es...

tblEndprodukt
LEFT JOIN tblEbene1
LEFT JOIN tblBaugruppe zu Ebene1
LEFT JOIN tblBaugruppeZuordnung zu Ebene1
LEFT JOIN tblRohstoffe zu Ebene1
LEFT JOIN tblEbene2
LEFT JOIN tblBaugruppe zu Ebene2
LEFT JOIN tblBaugruppeZuordnung zu Ebene2
LEFT JOIN tblRohstoffe zu Ebene2
LEFT JOIN tblEbene3
LEFT JOIN tblBaugruppe zu Ebene3
LEFT JOIN tblBaugruppeZuordnung zu Ebene3
LEFT JOIN tblRohstoffe zu Ebene3

Dann rechnest du mit der Menge-Spalte aus jeder dieser gejointen Tabellen:
Menge1 * Menge2 * Menge3 * Preis
und bildest über das Ergebnis eine Summe und hast deinen Endpreis. Natürlich kommen noch eventuell Rohstoffkosten aus den anderen Ebenen dazu, also quasi:
Menge1 * Preis +
Menge1 * Menge2 * Preis +
Menge1 * Menge2 * Menge3 * Preis
 
@ukulele
Servus,
vielen Dank schon mal, aber würdest du bei meinem Beispiel die tblEbene1 auf tblEndprodukt joinen und die tblEbene2 auf tblEndprodukt oder tblEbene1 auf BaugruppenID?

Grüße
 
tblEbene2 würde ich mit ParentBaugruppeID auf tblEbene1.BaugruppeID joinen. Dein Baum sieht quasi wie folgt aus:

tblEndprodukt
--> tblEbene1
----> tblEbene2
------> tblEbene3

In jeder Ebene kommt dann die Möglichkeit per tblBaugruppeZuordnung die tblRohstoffe zu joinen. Also etwa so:

tblEndprodukt
--> tblEbene1
----> tblBaugruppeZuordnung
------> tblRohstoffe
----> tblEbene2
------> tblBaugruppeZuordnung
--------> tblRohstoffe
------> tblEbene3
--------> tblBaugruppeZuordnung
----------> tblRohstoffe

Allerdings wirst du beim zusammen rechnen probleme bekommen wenn Rohstoffe an allen Ebenen hängen können.
 
Werbung:
Screenshot_Ausgabe.png
tblEbene2 würde ich mit ParentBaugruppeID auf tblEbene1.BaugruppeID joinen. Dein Baum sieht quasi wie folgt aus:

tblEndprodukt
--> tblEbene1
----> tblEbene2
------> tblEbene3

In jeder Ebene kommt dann die Möglichkeit per tblBaugruppeZuordnung die tblRohstoffe zu joinen. Also etwa so:

tblEndprodukt
--> tblEbene1
----> tblBaugruppeZuordnung
------> tblRohstoffe
----> tblEbene2
------> tblBaugruppeZuordnung
--------> tblRohstoffe
------> tblEbene3
--------> tblBaugruppeZuordnung
----------> tblRohstoffe

Allerdings wirst du beim zusammen rechnen probleme bekommen wenn Rohstoffe an allen Ebenen hängen können.

Servus,

wie du gemeint hast die Ausgabe ist ziemlich unübersichtlich, da die Preise und Mengen doppelt vorkommen (siehe Screenshot: tblEinzelteil_1.Einzelteil_ID & 1_tblEinzelteil_Menge sowie bei tblEinzelteil_2.Einzelteil_ID & 2_tblEinzelteil_Menge. Jetzt wäre mein Plan gewesen, die Summe der Spalten Mengen und Preise zu bilden und durch die Anzahl der Vorkommen zu teillen. Also hier 2 also wie eine Art Distinct & Count. Hast du dafür eine Idee? Oder würdest du die Datenbank komplett anders modellieren bzw. aufbauen. Hier noch mein akteuller SQL-Befehl für mein überarbeitetes Datenmodell:


SELECT
tblBaugruppe_erste_Ebene_1.Menge AS 1_Baugruppe_Menge,
tblBaugruppe_zweite_Ebene_2.Menge AS 2_Baugruppe_Menge,
tblEinzelteil_1.Einzelteil_ID,
tblBaugruppe_Einzelteil_1.Menge AS 1_Einzelteil_Menge,
tblEinzelteil_1.Preis AS 1_Preis,
tblEinzelteil_2.Einzelteil_ID,
tblBaugruppe_Einzelteil_2.Menge AS 2_Einzelteil_Menge,
tblEinzelteil_2.Preis AS 2_Preis
FROM
(
(
(
(
(
(
(
tblEndprodukt
LEFT JOIN tblBaugruppe_erste_Ebene AS tblBaugruppe_erste_Ebene_1 ON tblBaugruppe_erste_Ebene_1.Endprodukt_ID = tblEndprodukt.Endprodukt_ID
)
LEFT JOIN tblBaugruppe AS tblBaugruppe_1 ON tblBaugruppe_1.Baugruppe_ID = tblBaugruppe_erste_Ebene_1.Baugruppe_ID
)
LEFT JOIN tblBaugruppe_Einzelteil AS tblBaugruppe_Einzelteil_1 ON tblBaugruppe_Einzelteil_1.Baugruppe_ID = tblBaugruppe_erste_Ebene_1.Baugruppe_ID
)
LEFT JOIN tblEinzelteil AS tblEinzelteil_1 ON tblEinzelteil_1.Einzelteil_ID = tblBaugruppe_Einzelteil_1.Einzelteil_ID
)
LEFT JOIN tblBaugruppe_zweite_Ebene AS tblBaugruppe_zweite_Ebene_2 ON tblBaugruppe_zweite_Ebene_2.Parent_Baugruppe_ID = tblBaugruppe_erste_Ebene_1.Baugruppe_ID
)
LEFT JOIN tblBaugruppe AS tblBaugruppe_2 ON tblBaugruppe_2.Baugruppe_ID = tblBaugruppe_zweite_Ebene_2.Baugruppe_ID
)
LEFT JOIN tblBaugruppe_Einzelteil AS tblBaugruppe_Einzelteil_2 ON tblBaugruppe_Einzelteil_2.Baugruppe_ID = tblBaugruppe_zweite_Ebene_2.Baugruppe_ID
)
LEFT JOIN tblEinzelteil AS tblEinzelteil_2 ON tblEinzelteil_2.Einzelteil_ID = tblBaugruppe_Einzelteil_2.Einzelteil_ID
WHERE
tblBaugruppe_Einzelteil_1.Baugruppe_ID = 1
GROUP BY
tblBaugruppe_erste_Ebene_1.Menge,
tblBaugruppe_zweite_Ebene_2.Menge,
tblBaugruppe_Einzelteil_1.Menge,
tblBaugruppe_Einzelteil_2.Menge,
tblEinzelteil_1.Einzelteil_ID,
tblEinzelteil_1.Preis,
tblEinzelteil_2.Einzelteil_ID,
tblEinzelteil_2.Preis;
 

Anhänge

  • ÜberarbeitetesDatenmodell.png
    ÜberarbeitetesDatenmodell.png
    51,1 KB · Aufrufe: 5
Zurück
Oben