Rekursive Abfrage zum auflösen von Stücklisten

JudAD

Fleissiger Benutzer
Beiträge
71
Hallo Zusammen,

ich beiße mir gerade an einer Abfrage die Zähne aus.

Ich soll für jede(n) Artikel (Haupt-Baugruppe) eines bestimmten Kunden alle verwendetet Rohmaterialien (inklusive aller verwendeter Materialien der Subbaugruppen und derer Subbaugruppen,...) ausgeben.

Um alle Artikel (nur Haupt-Baugruppen) eines Kunden inklusiver der ersten Ebene der Subbaugruppen und Materialen auszugeben habe ich folgendes Script erstellt. Was auch soweit korrekt funktioniert (der in der Klammer gesetzte Filter über eine Artikelnummer dient nur zur Veranschaulichung eines Besipiel Artikels)


select beas_stl.itemcode as ArtNr, beas_stl.art1_id as ArtNrSub from beas_stl join OITM on beas_stl.itemcode = OITM.ItemCode where OITM.QryGroup64 = 'Y' and OITM.U_KundenNr = '40065' (and beas_stl.itemcode = '266549')


Mit diesem Script bekommen ich aber wie erwähnt nur die erste Ebene einer Baugruppenstruktur angezeigt.


Als Besipiel habe ich mal einen Artikel hergeneommen (ArtNr. 266549)

ArtNr ArtNrSub
266549 266764
266549 266765
266549 266766
266549 266767
266549 107224
266549 106354


Wie man sehen kann besteht der Artikel (266549) in der ersten Stücklisten-Ebene aus 7 Komponenten (2 Rohmaterialen [ArtNrSub beginnt mit 1] & 4 Subbaugruppen [ArtNrSub beginnt mit 2])

Diese Subbaugruppen (266764, 266765, 266766, 266767) können nun selbst auch wieder aus Subbaugruppen oder/und Rohmaterialien bestehen. Die Subbaugruppe 266767 besteht wiederum aus einem Maertial und einer Subbaugruppe 266768, die wiederum aus einem Material besteht. Alle Verknüpfungen zwischen

Die Anzahl der Ebenen ist somit unendlich - und genau das macht es mir schwer, da ich auch wenn mit mehreren Abfragen hintereinander und mehreren Temporären Tabellen arbeiten würde, niemals die Struktiefe voraussagen kann.


Am Schluss hätte ich gerne folgendes Ergebnis:

Baugruppe Subbaugruppe Material
266549 266549 107224
266549 266549 106354
266549 266764 101905
266549 266765 100939
266549 266766 100921
266549 266767 101013
266549 266768 107353


Baugruppe entspricht immer der Artikelnummer der Hauptbaugruppe die sich aus der ersten Abfrage ergibt und sollte nachher für die Ausgabe als Gruppierungsmerkmal dienen. Subbaugruppe ist immer die Artikelnummer der (Sub-)Baugruppe zu der ein (Roh-)Material (artNr mit beginnend mit 1) zugeordnet ist.
 
Werbung:
Hmm, irgendwie wurden meine ganzen formattierungen die Ausgaben durcheinander geworfen. Erste Ausgabe sind 2 Spalten, Zielausgabe sind 3 Spalten.
 
Hi ukulele,

Ich versuche es gerade - aber mit wenig Erfolg. Ich habe mal die Abfrage genommen und auch mit einem festen Artikel getestet und den Namen weggelassen. Jedoch bekomme ich keine Ergebnisse. Habe es auch die zwei Felder vertauscht, aber auch kein Ergebnis. Ein weiteres Problem wird sein, dass ja mein "Parameter" auch wieder aus einer Abfrage kommen soll (select beas_stl.itemcode from beas_stl join OITM on beas_stl.itemcode = OITM.ItemCode where OITM.QryGroup64 = 'Y' and OITM.U_KundenNr = '40065') das mehr als ein Ergebnis liefert.


Test1:
with Hierachy(itemcode, art1_id, Level)
as
(
select itemcode, art1_id, 0 as Level
from beas_stl c
where c.itemcode = '266549'
union all
select c.itemcode, c.art1_id, ch.Level + 1
from beas_stl c
inner join Hierachy ch
on c.art1_id = ch.itemcode
)
select itemcode, art1_id
from Hierachy
where Level > 0

Test2
with Hierachy(art1_id, itemcode, Level)
as
(
select art1_id, itemcode, 0 as Level
from beas_stl c
where c.art1_id = '266549'
union all
select c.art1_id, c.itemcode, ch.Level + 1
from beas_stl c
inner join Hierachy ch
on c.itemcode = ch.art1_id
)
select art1_id, itemcode
from Hierachy
where Level > 0
 
Nach etwas Recherche habe ich glaube entdeckt warum ich bei meiner(n) CTE Abfrage(n) keine Ergebnisse erhalte. In meiner Tabelle bes_stl stecken nur die Datensätze, die auch eine Subkomponente haben. Einen Datensatz mit der Subkomponente "NULL" gibt es bei mir nicht, und somit werden wohl aus meiner Tabelle auch keine Ergebnisse angezeigt. Aber habe noch keine Idee das zu umgehen.
 
Wobei das wesentliche erst am Ende steht:
How do I create a recursive query in MSSQL 2005?
Mit WITH musst du zu eine Tabelle erzeugen die zu jeder Haupt-Baugruppe die Baugruppen durchläuft. Das kann man dann weiter verarbeiten, also z.B. alle Einzelteile aggregieren.

Wenn du das nicht hin kriegst muss ich da morgen mal ein Beispiel schreiben :)

Hi, jetzt habe ich noch weiter recherchiert und nun habe ich schon mal mein Konstrukt das funktioniert. Jetzt möchte ich die folgende Abfrage um 2 Dinge erweitern und bin dabei auf Probleme gestoßen. Das ist das Script das die korrekten Daten für genau einen Artikel ausgibt.

WITH ABCDE (itemcode, art1_id) AS
( SELECT itemcode, art1_id FROM beas_stl WHERE itemcode = '266549'
UNION ALL
SELECT A.itemcode,A.art1_id FROM beas_stl A
INNER JOIN ABCDE B ON A.itemcode = B.art1_id )
SELECT * FROM ABCDE where art1_id like '1%'

1. Ich hätte gerne dass der Artikel der obersten Ebene - sprich in diesem Fall "266549" immer als separate Spalte für eine spätere Gruppierung/Summierung mit ausgegeben wird
2. Ich würde gerne die einzelne Artikelnummer durch eine SQL-Abfrage ersetzen (select beas_stl.itemcode from beas_stl join OITM on beas_stl.itemcode = OITM.ItemCode where OITM.QryGroup64 = 'Y' and OITM.U_KundenNr = '40065')

Das Problem ist nun:
1. Ich habe keine Ahnung wie ich die Erweiterung Punkt 1. einbauen soll.
2. Ich habe das ganze mal mit 2 Artikelnummer versucht (siehe folgendes Beispiel) - dabei werden aber nicht gleiche Menge an Datensätzen ausgegeben als wenn ich die Abfrage für jeden Artikel einzel ausführen würde

WITH ABCDE (itemcode, art1_id) AS
( SELECT itemcode, art1_id FROM beas_stl WHERE itemcode in ('266649', '268356')
UNION ALL
SELECT A.itemcode,A.art1_id FROM beas_stl A
INNER JOIN ABCDE B ON A.itemcode = B.art1_id )
SELECT * FROM ABCDE where art1_id like '1%'

Ein Artikel bringt 158 Datensätze, der Andere 7. Wenn ich beide Artikel in die Abfrage nehme, bekomme ich als Ergebnis nur 159 Datensätze.

Vielleicht liegt es ja am UNION?


Danke nochmals für Deine/Eure Mühe
 
War ein Zahlendreher - die einzelnen Abfragen hatte ich mit den Artikeln '266549' & '268356' gemacht und dieAbfrage mit beiden Artikel leider mit ('266649', '268356'). :oops:

Somit bleibt nur die Frage, wie ich den Artikel der obersten Ebene immer als Spalte mitführen kann.

Sorry für die Verwirrung :)
 
OK, Alles gelöst!

WITH ABCDE (itemcode, art1_id, vater, ebene) AS
(SELECT itemcode, art1_id, itemcode as vater, 1 as ebene FROM beas_stl WHERE itemcode in (select beas_stl.itemcode from beas_stl join OITM on beas_stl.itemcode = OITM.ItemCode where OITM.QryGroup64 = 'Y' and OITM.U_KundenNr = '40065')
UNION ALL
SELECT A.itemcode, A.art1_id, vater , b.ebene +1 FROM beas_stl A
INNER JOIN ABCDE B ON A.itemcode = B.art1_id )
SELECT * FROM ABCDE where art1_id like '1%' order by vater, ebene, itemcode, art1_id
 
Werbung:
So, jetzt habe ich leider doch noch ein Problem ;-)

Ich musste diese Abfrage machen um die Soll-Mengen vom Rohmaterial und damit den Forecast an Materialverbrauch für einen bestimmten Kunden zu errechnen.

Jetzt stehen allerdings immer nur die verbauten Menge je Stüklisten-Ebene in der Tabelle. Um das Material das auf Ebene 5 verbraucht wird errechnen zu können müsste ich irgendwie die Multiplikatoren aus den übergeordneten Ebenen mitführen bzw. Multiplizieren. Artikelnmummern mit 2 sind Baugruppen mit 1 sind Rohmaterialien

Als Beispiel:
Ebene | ArtNr | Anzahl
1 | 268356 |
2 | 265696 | 3 (Stück)
3 | 265781 | 2 (Stück)
4 | 252684 | 5 (Stück)
5 | 100921 | 2,5 (Meter)

Um Jetzt 1 Stück von 268356 herzustellen, werden 3 * 2 * 5 *2,5 Meter vom Material (100921) benötigt

Datenliegen in folgender Form vor

ArtN r | ArtNrSub | Menge
268356 | 265696 | 3
265696 | 265781 | 2
265781 | 252684 | 5
252684 | 100921 | 2,5

Gewünschte Ausgabe:
ArtNr | ArtNrSub | Multiplikator | Menge
268356 | 100921 | 30 | 2,5


Irgenwie komm ich nicht drauf
 
Zurück
Oben