In diesem Blogbeitrag möchte ich am Beispiel der Kostenstellengruppen zeigen, wie es möglich ist, die Zusammenhänge von SAP-Datenstrukturen zu erkennen und auf Grundlage dieser Erkenntnisse die Daten so zusammen zu führen, um sie für die Aufbereitung eines Datawarehouse nutzen zu können.
Vorab exemplarisch die Struktur, wie in SAP die Darstellung der Kostenstellgruppen aussieht:
Zunächst habe ich die betroffenen Tabellen (SETHEADER, SETHEADERT, SETNODE und SETLEAF) in eine SQL Server Datenbank importiert. SETHEADER enthält den Topknoten. Hier erhält man über den Wert in Settype die Information, ob der Oberknoten (parent) weitere Subknoten (childs) besitzt. Ist dies der Fall, signalisiert das der Buchstabe S. Wenn es keine Subknoten gibt, steht für settype ein B. Über den Wert in SETCLASS kann man die Suchergebnisse einschränken. Für die Kostenstellengruppe wählt man 0101, Kostenartengruppen = 0102 und Profit-Center-Gruppen = 0106.
SELECT DISTINCT
[SAP_SETHEADER].[MANDT]
,[SAP_SETHEADER].[SETCLASS]
,[SAP_SETHEADER].[SUBCLASS]
,[SAP_SETHEADER].[SETNAME]
,[SETTYPE]
,[CREDATE]
,[CRETIME]
,[UPDUSER]
,[UPDDATE]
,[UPDTIME]
,[SAPRL]
,[TABNAME]
,[FIELDNAME]
,[ROLLNAME]
,[DESCRIPT]
FROM [sap_demo_cgl].[dbo].[SAP_SETHEADER]
INNER JOIN SAP_SETHEADERT ON SAP_SETHEADER.SETNAME = SAP_SETHEADERT.SETNAME
where SAP_SETHEADER.SETNAME = ‚C1‘
AND SAP_SETHEADER.SETCLASS = 0101
Anmerkung: Den join auf SETHEADERT führe ich durch, damit ich den genauen Namen der Kostenstellengruppe erhalte.
Möchte man nun mehr über die Subknoten erfahren, begibt man sich mit dem Wert aus Setname in die Tabelle SETNODE.
Das Ergebnis zeigt, dass es für diesen Knoten weitere Subknoten (SUBSETNAME) gibt. Man kann nun entweder in die Tabelle SETHEADER gehen und dort überprüfen ob es weitere Subknoten für den SUBSETNAME gibt, oder man ändert einfach den Wert aus der vorherigen Abfrage.
SELECT DISTINCT
SAP_SETNODE.[MANDT]
,SAP_SETNODE.[SETCLASS]
,SAP_SETNODE.[SUBCLASS]
,SAP_SETNODE.[SETNAME]
,[LINEID]
,[SUBSETCLS]
,[SUBSETSCLS]
,[SUBSETNAME]
,[SEQNR]
,[DESCRIPT]
FROM [sap_demo_cgl].[dbo].[SAP_SETNODE]
INNER JOIN SAP_SETHEADERT ON SAP_SETNODE.SETNAME = SAP_SETHEADERT.SETNAME
WHERE SAP_SETNODE.SETNAME = ‚C1200‘
AND SAP_SETNODE.SETCLASS = 0101
Hat man die letzte Hierarchiestufe erreicht, kann man mit den Wert für SETNAME in der Tabelle SETLEAF alle SETS für die jeweilige Gruppe anzeigen lassen.
Für einen join auf die Tabelle der Kostenstellenstammsätze (CSKS) verwende ich folgendes Statement:
Die Kostenartenstammsätze befinden sich übrigens in der Tabelle CSKA und die Profit Center Stammdaten in der Tabelle CEPC.
Mit Hilfe eines Self-Joins kann man sich die Kostenstellenhierarchie auch übersichtlich mittels einer Abfrage anzeigen lassen.
SELECT DISTINCT
Rootknoten.[SETCLASS] as Kostenstelle
,Rootknoten.[SETNAME] as KST_Key_Level1
,Level1Knoten.[DESCRIPT] as KST_Name_Level1
,Kind_1.[SETNAME] as KST_Key_Level2
,Level2Knoten.[DESCRIPT] as KST_Name_Level2
,Kind_2.[SETNAME] as KST_Key_Level3
,Level3Knoten.[DESCRIPT] as KST_Name_Level3
,Kind_2.[SUBSETNAME] as KST_Key_Level3
,Level4Knoten.[DESCRIPT] as KST_Name_Level4
,VALFROM
,VALTO
,SAP_CSKS.KOKRS
,SAP_CSKS.KOSTL
FROM [sap_demo_cgl].[dbo].[SAP_SETNODE] Rootknoten
INNER JOIN dbo.SAP_SETNODE Kind_1 on Rootknoten.SUBSETNAME = Kind_1.SETNAME
INNER JOIN dbo.SAP_SETNODE Kind_2 on Kind_1.SUBSETNAME = Kind_2.SETNAME
INNER JOIN dbo.SAP_SETLEAF on Kind_2.SUBSETNAME = dbo.SAP_SETLEAF.SETNAME
INNER JOIN dbo.SAP_SETHEADERT Level1Knoten on Rootknoten.SETNAME = Level1Knoten.SETNAME
INNER JOIN dbo.SAP_SETHEADERT Level2Knoten on Kind_1.SETNAME = Level2Knoten.SETNAME
INNER JOIN dbo.SAP_SETHEADERT Level3Knoten on Kind_2.SETNAME = Level3Knoten.SETNAME
INNER JOIN dbo.SAP_SETHEADERT Level4Knoten on Kind_2.SUBSETNAME = Level4Knoten.SETNAME
INNER JOIN dbo.SAP_CSKS on SAP_CSKS.KOSTL between valfrom and valto
WHERE
Rootknoten.SETNAME = ‚C1‘
AND Level1Knoten.LANGU = ‚Z‘
AND Level2Knoten.LANGU = ‚Z‘
AND Level3Knoten.LANGU = ‚Z‘
AND Level4Knoten.LANGU = ‚Z‘
Hier kann man sehr schön sehen, dass die Kostenstellengruppe C1 (KST_KEY_Level1) die Gruppe C1000 (KST_Key_Level2) enthält, welche u.a. die Gruppen C1200, C1300 und C1400 (KST_Key_Level3) besitzt.
Ich habe die Description Language eingeschränkt, damit mir die japanischen und russischen Erklärungen nicht angezeigt werden. Beachten Sie bitte, dass eine Kostenstellengruppe mit obiger Abfrage allerdings auch nicht angezeigt wird, wenn die gewählte Sprache für eine Kostenstellengruppe in der Tabelle SETHEADERT nicht vorhanden ist.
Echt 1 nice Anleitung, hat mir bei meinem Problem geholfen. War aber garnicht so leicht, dass in die ABAP Query zu übersetzen. Danke!
Moin, könnte man das SAP Query evtl. veröffentlichen bzw. teilen? Ich finde das nämlich interessant, würde es aber nicht schaffen es nachzubauen.
Danke!