Konditionsfindung über Produkthierarchie (analog SAP)

mstadler71

Benutzer
Beiträge
8
Hallo allerseits!
Ich habe ein Thema zu lösen, wo mir dzt. noch die Fantasie für den Lösungsweg fehlt.

Es geht um das Thema Konditionsfindung über eine Produkthierarchie (analog SAP)

Also um die Verknüpfung 2er Tabellen:
-Tabelle 1: Preise auf Teileebene
-Tabelle 2: Kundenrabatte zu Preisen

Bis dato hatte ich immer eine eindeutige 1:n Verknüpfungsmöglichkeit. Also z.B. x% Rabatt für alle Teile der Teilefamilie "US"

Nun gibt es aber eine 5 stufige Produkthierarchie (Suchbaum), welche im Teilestamm hinterlegt ist.
H1 bis H5

Also gibt es keine eindeutig Verknüpfung mehr der beiden Tabellen:
-Tabelle 1: Preise auf Teileebene mit Produkthierarchie
-Tabelle 2: Kundenrabatte zu Preisen, wahlweise auf Ebene H1 bis und/oder H5

H1
H1-H2
H1-H2-H3
H1-H2-H3-H4
H1-H2-H3-H4-H5

in der Rabatte-Tabelle können die Rabatte nun an unterschiedlichen Stufen hängen.

H1*: 5%
H1-H2
H1-H2-H3*: 10%
H1-H2-H3-H4
H1-H2-H3-H4-H5: 25%
(es gibt natürlich ab der 2. Stufe n-Ausprägungen zu der darüber liegenden Hierarchie)

d.h. z.B.:
- alle Teile mit H1 = 'Wert' bekommen allgem. 5% Rabatt (H1*)
- alle Teile ab H1-H2-H3 = 'Wert' bekommen allgem. 10% Rabatt (H1-H2-H3*)
- in der letzten Stufe H5 = 'Wert' bekommt der Kunde 25% Rabatt (H1-H2-H3-H4-H5)

das ist in allen 5 Hierarchieebenen beliebig in jeder Ausprägung spielbar,

also wäre eine Rabattdef.:
-auf H5 die detaillierteste (z.B. Match nur mehr 10 teile)
-auf H1 die allgemeinste (z.B. Match 1.000 Teile)

das ganze soll auf Kundenebene für den ganzen Teilestamm angezeigt werden. also die Kundenrabatte zur Hierarchie des Teiles angezeigt werden

KundNr TeileNr H1 H2 H3 H4 H5
4400 4710 5% => 5% zieht
4400 4711 5% 10% 25% => 25% zieht
4400 4712 5% 10% => 10% zieht
4400 4713 5% 10% => 10% zieht
usw

Mir fällt aktuell nur eine temp. Tabelle ein, welche ich im Vorfeld aufbereite.
das finde ich aber weniger prickelnd, da ich bei Datenänderung dann die neuen Daten in die Stammtabellen rückführen müsste

Hat da jemand eine Lösung?

Danke für Eure Unterstützung!!

lg
Michael

Im Anhang noch ein pdf zur Verdeutlichung meiner Frage
 

Anhänge

  • Bsp_Datenmodell_Hierarchie.pdf
    42,6 KB · Aufrufe: 6
Werbung:
Ich komme jetzt nicht aus dem SAP Umfeld aber für mich sieht das aus wie eine klassische Stückliste, oder was macht die Hirachie zur Hirachie? Jedes Bauteil der Stückliste kann einen Rabatt haben, muss aber nicht, das ist recht simpel. Oder wirkt sich der Rabatt auf mehr als die eine Komponente aus?

Stücklisten sind in sofern tricky, das man ja eigentlich nicht weiß wie viele Ebenen es gibt. Hier sind es ja aber maximal 5, da kann man zur Not auch noch 5 Joins machen. Warum hast du die Access ausgesucht? Ein richtiges DBMS wäre besser, da gibt es dann sowas wie common table expression (CTE).
 
Ich komme jetzt nicht aus dem SAP Umfeld aber für mich sieht das aus wie eine klassische Stückliste, oder was macht die Hirachie zur Hirachie? Jedes Bauteil der Stückliste kann einen Rabatt haben, muss aber nicht, das ist recht simpel. Oder wirkt sich der Rabatt auf mehr als die eine Komponente aus?

Stücklisten sind in sofern tricky, das man ja eigentlich nicht weiß wie viele Ebenen es gibt. Hier sind es ja aber maximal 5, da kann man zur Not auch noch 5 Joins machen. Warum hast du die Access ausgesucht? Ein richtiges DBMS wäre besser, da gibt es dann sowas wie common table expression (CTE).
Hallo Ukulele
danke für die Antwort; Access habe ich mangels Alternative (Software und Skills); Join geht m.E. nicht, da ich ja 'ab' der Hierarchie verknüpfe. dh. Wert für H3 gelten für H3/H4/H5 sofern nicht noch eine detailliertere Definition vorhanden ist: join verbindet mir ja nur z.B. H3 mit H3
 
Doch doch, joinen kann man das. Deine Beispiel PDF müsste ca. das hier sein:
Code:
SELECT *
FROM Teilestamm TL
LEFT JOIN Kundenrabatte RAB
ON RAB.hierachie = TL.hierachie
OR TL.hierachie LIKE '%*'
AND left(TL.hierachie,len(TL.hierachie)-1) = left(RAB.hierachie,len(TL.hierachie)-1)
 
Hallo Ukulele
danke erst mal herzlichst für Deine Antwort; es passiert was, aber (noch) nicht das richtige... ;-)

Deine Vorlage mit den richtigen Daten kommt Fehlermeldung "Datentypenkonflikt in Kriterienausdruck"
SELECT TL_Nr, TL_Bez, TL_Hierarchie, SK_Hierarchie, SK_HierarchieE, SK_Rab_akt
FROM TL LEFT JOIN KD_SK ON KD_SK.SK_Hierarchie = TL.TL_Hierarchie OR TL.TL_Hierarchie LIKE '%*' AND Left(TL.TL_Hierarchie, len(TL.TL_Hierarchie)-1) = Left(KD_SK.SK_Hierarchie,len(TL.TL_Hierarchie)-1);

wenn ich die Längenformel testweise durch Fixwerte ersetze (z.b. 6)
SELECT TL_Nr, TL_Bez, TL_Hierarchie, SK_Hierarchie, SK_HierarchieE, SK_Rab_akt
FROM TL LEFT JOIN KD_SK ON KD_SK.SK_Hierarchie = TL.TL_Hierarchie OR TL.TL_Hierarchie LIKE '%*' AND Left(TL.TL_Hierarchie,6) = Left(KD_SK.SK_Hierarchie,6);
kommt offensichtlich bis zu der Hierarchiestufe ein richtiger Wert, aber nicht alle.

Allerdings erschließt sich mir die Verknüpfung mit der Längenangabe noch nicht.
wenn in der Rabatttabelle z.B. folgendes hinterlegt ist:
  • Hierarchie_Rabatt: 314HZ = 5%
  • Hierarchie Rabatt: 314HZKH = 7%
muss in der Teilestammtabelle alles gefunden werden mit:
  • Hierarchie Teile 314HZ* (bis zu 12 Stellen Länge) => 5%
  • Hierarchie Teile 314HZKH* (bis zu 12 Stellen Länge) => 7%
d.h. hierbei wird gejoint zwischen z.B: 5 Stellen zu 12 Stellen?
hab's nicht kapiert; deine LEN() liefert ja für beide Seiten das gleiche Ergebnis
lg
Michael
 
Also 314HZ* ist jetzt in deiner PDF nicht enthalten, wir sollten vielleicht nicht mit zu vielen Beispielen hantieren ich stecke in den Daten nicht so drin. Mein Code basiert auf der PDF wobei ich nicht weiß welche Datentypen deine Spalten haben. Außerdem ist das MSSQL Syntax, Access ist zwar ähnlich aber tickt auch manchmal anders.

Ich hab das jetzt nochmal auf MSSQL getestet und habe wohl in der Join-Condition in den letzten beiden Zeilen Rab_Hierarchie und TL_Hierarchie vertauscht, so läuft es bei mir (MSSQL):
Code:
WITH Teilestamm(TL_Nr,TL_Hierarchie) AS (
    SELECT 210202,'312ZSSRSOO' UNION ALL
    SELECT 205469,'313ZSDKDKG'
    ), Kundenrabatte(Rab_Hierarchie,Rabatt) AS (
    SELECT '312ZSSRSOO','20%' UNION ALL
    SELECT '313*','5%'
    )
SELECT    *
FROM    Teilestamm TL
LEFT JOIN Kundenrabatte RAB
ON        RAB.Rab_Hierarchie = TL.TL_Hierarchie
OR        RAB.Rab_Hierarchie LIKE '%*'
AND        left(RAB.Rab_Hierarchie,len(RAB.Rab_Hierarchie)-1) = left(TL.TL_Hierarchie,len(RAB.Rab_Hierarchie)-1)
Dabei wird beiden Einträgen aus Teilestamm der passende Rabatt zugeordnet.

Wenn jetzt natürlich zu einem Teilestamm-Eintrag mehrere Rabatte passen (z.B. bei 31*) dann wird Teilestamm zweimal zurück gegeben, einmal mit 20% und einmal mit 5%, das muss natürlich klar sein.
 
Werbung:
Hallo Ukulele
Sorry für meine späte Reaktion, ich war ein paar Tage anderwärtig beschäftigt.
Danke für Deine Ausführungen, werde mich in den nächsten Tagen in das Thema 'reinknien'

lg
 
Zurück
Oben