.NET C# Java Javascript Exception

 | 
Frage stellen Fragen Themen Mitglieder Abzeichen RSS-Feed
2
Edit: Ich hab die Frage mal anders gestellt. Hoffe jetzt ist mein Ziel verständlicher.

Ich möchte eine Art Produkt/Materialdatenbank abbilden.

Jedes Produkt besteht aus N Materialien wobei jedes Material selber auch wieder als Produkte betrachtet wird welches aus N Materialien besteht.

Beispiel:



Um das Produkt 1 Herzustellen, brauche ich das Produkt 2 sowie 3 und 4. Da ich nicht für jedes Produkt und zwischenprodukt die Preis einzeln ausrechnen möchte, möchte ich die Preis pro Ausgangsmaterial eintragen.

1 kg Aluminium = 100 EURO
1 kg PVC-Granulat = 123 EURO
100 Stück Schrauben Typ 32 = 14 EURO
100 Stück Schrauben Typ 43 = 16 EURO
100 Stück Elektroplatinen = 866 EUO
...

Aus dem 2kg Aluminum und dem 1kg PVC Granulat stell ich nun 1 Gehäuse her. Aus 1 Gehäuse + 50 Schrauben + 5 Elektroplatinen kann ich eine Steuereinheit bauen. Aus 5 Steuereinheiten + Ein anderes Gehäuse + Motor + diverse anderes Zeugs stell ich mein Endprodukt her.

Die Frage ist, wie ich das mittels HierarchyId oder Common Table Expressions abbilde.

Zeil ist es, mittels einer SQL-Abfrage zu sagen:
1. Selektiere alle Materialien für Produkt X und gib mir die Gesammtmenge der Matierialien sowie der Kosten dafür aus.
Selectiere alle Materialien für Produkt X und gib mir Name, Preis pro VPE etc. aus für jedes einzelene Zwischenprodukt beginnend von ganz unten aus.

Jedes der 4000 Produkt besteht aus X zwischen Produkten oder ist selbst in einem Produkt enthalten.

Als Beispiel, das Produkt "Werkzeugkoffer" besteht aus der Einzelprodukten "Schraubenzieher X1","Schraubenzieher X2",.., "Maulschlüssel 1", "Maulschlüssel 2",..
Für die Herstellung für jeden Schraubenzieher brauch einen Griff. Der Griff selbst ist wieder ein Produkt das ich für verschiedene Zwecke brauchen kann (z.B. als Griff für einen Schraubenzieher oder als Ersatzteil).

Das geht solange bis wir beim Metall, PVC und allem anderen benötigten ankommen.
24.11.09
Floyd 2,9k 1 7
Floyd 2,9k 1 7
2 Antworten
3
Hab gestern und heute noch ein wenig rumexperimentiert und die Lösung gefunden.

/*Temptabelle löschen die für diese Beispiel gebraucht wird*/
IF OBJECT_ID('tempdb..#T') IS NOT NULL
drop table #T
go

/*Temporäre Tabellen erstellen als Beispiel für die echten Datentabellen*/
IF OBJECT_ID('tempdb..#Items') IS NOT NULL
drop table #Items
IF OBJECT_ID('tempdb..#ItemRelation') IS NOT NULL
drop table #ItemRelation
go

create table #ItemRelation(
ItemRelationID int IDENTITY(1,1) PRIMARY KEY CLUSTERED,
ChildItemID int,
ParentItemID int,
Menge int
)
create table #Items(
ItemID int ,
Name [varchar](100),
PreisProVPE money
)

/*Die Datentabellen befüllen*/
Insert into #Items VALUES (1,'Werkzeugkoffer',null)
Insert into #Items VALUES (2,'CCC',null)
Insert into #Items VALUES (3,'Schraubendeher X1',null)
Insert into #Items VALUES (9,'Schraubendeher X2',null)
Insert into #Items VALUES (4,'AAA',null)
Insert into #Items VALUES (5,'BBB',null)
Insert into #Items VALUES (7,'PVC',30)
Insert into #Items VALUES (8,'Aluminium',23)

Insert into #ItemRelation VALUES (1,3,1)
Insert into #ItemRelation VALUES (1,9,1)
Insert into #ItemRelation VALUES (2,4,1)
Insert into #ItemRelation VALUES (2,5,1)
Insert into #ItemRelation VALUES (3,7,2)
Insert into #ItemRelation VALUES (3,8,5)
Insert into #ItemRelation VALUES (9,7,1)
Insert into #ItemRelation VALUES (9,8,6)
go


/*Verwendung von Common Table Expressions*/
with Rec(ItemID,Name,PreisProVPE,Menge)
as (
/*Das 1. Select bezieht sich auf das oberste
Element desen Kinder ich recursive Zusammenfassen will*/
select
ItemID,
Name,
PreisProVPE,
1 Menge
from #Items
where ItemID =1 --1 = Werkzeugkoffer

/*Recursiver Select aller Unter-Artikel*/
union all
select
L.ParentItemID as ItemID,
CAT.Name,
CAT.PreisProVPE,
L.Menge
from #ItemRelation L
join Rec c
on c.ItemID = L.ChildItemID
inner join #Items CAT
on L.ParentItemID = CAT.ItemID
)
/*Das Ergebnis in eine Temptabelle kopieren
Die Common Table ist nach der ersten Verwendung nicht mehr Vorhanden*/
select * Into #T from Rec


/*Verarbeiten der Daten*/
select * from #T --Liste der Artikel mit Menge und Preis erstellen
select
ItemID,Name,PreisProVPE,
Sum(Menge) GesammtMengeProWerkstoff,PreisProVPE * Sum(Menge) PreisProWerkstoff
from #T
group by ItemID,Name,PreisProVPE --Preis und Menge pro Werkstoff
select sum(PreisProVPE*Menge) [Gesamtpreise] from #T --Gesamtpreise aller Werkstoffe


Ergebnis:



Vieleicht hilft es ja jemanden anderes auch weiter.

Quellen:
Uncommon Common Table Expressions (CTEs) By Jeremy Likness
25.11.09
Floyd 2,9k 1 7
Floyd 2,9k 1 7
0
Ohh ha, da haste dir ja eine Aufgabe gestellt ;-)

Im Grunde ist es aber mit 3 Tabellen machbar:

Artikel (artikelid, artikelname);
Artikelrelationen (relationid, artikelid, parentid);
Preis (preisid, artikelid, einzelpreis, gesamtpreis);

In der Tabelle Artikel stehen alle Gegenstände und Materialien drin (z.B. Werkzeugkasten, Aluminium usw. ). In der Tabelle Artikelrelationen stehen die Beziehungen der Artikel zueinander drin (z.B. artikelid=3,parentid=6) heißt dann wenn artikelid=3 ein Schraubendreher ist und artikelid=6 ein Werkzeugkasten, dass der Schraubendreher zum Werkzeugkasten gehört. Mit (artikelid=10,parentid=3) kann dann ausgedrückt werden dass der Schraubendreher aus PVC ist und so weiter...

In der Preis Tabelle stehen logischerweise die Preise, wobei man dort noch zw. Gesamtpreis und Einzelpreis unterscheiden könnte, um zum Bsp. ein Verbund von Materialien nicht einzeln ausrechnen zu müssen. D.h. also wenn ein Gesamtpreis für den Gegenstand eingetragen ist, dann nimm diesen, ansonsten nimm den Einzelpreis.

Hoffe das hilft dir ein wenig.

Grüßle
25.11.09
Scout 1,4k 1 7
Hallo Scout, das war auch mein Ansatz, mein Problem ist, das ich dann in ner Schleife alle SubArtikel durchgehen muss, deren SubArtikel und wiederum deren SubArtikel. Da der Werkzeugkasten ja nur indirekt auf das PVC und Aluminium verweißt.
Ich suche also eine Lösung die ohne Schlefe auskommt.
Laut MSDN sollte dies mit den Common Table Expressions gehen (also Recursive-SQL-Statements) wobei ich das Konzept noch nicht ganz verstanden habe.

Das Ergebnis muss Folgendes sein:
1 x Werkzeugkasten =
3 KG PVC zu 400€
1 KG Aluminum zu 300€
...
Floyd 25.11.09
Deine Antwort
Entweder einloggen... ...oder ohne Wartezeit registrieren
Name
Passwort
Passwort wiederholen
E-Mail
Geworben von


Login mit OpenID

Mit einem OpenID-Account kannst Du dich auf allen Webseiten anmelden, die OpenID unterstützen. Du hast bereits ein Benutzerkonto bei einem der folgenden Provider? Dann kannst Du dich direkt hier damit registrieren.


OpenID-Provider anklicken: