eine weitere Variante, dieses mal ohne Preise, jedoch mit der kompletten Rezeptur-Struktur, wobei im Druck-Layout darauf wert gelegt wurde, die Baumstruktur darzustellen, was durch unterschiedliche Datenzeilen mit unterschiedlichen Layouts mit Hilfe des Werts "Level" gemacht werden kann. Die Möglichkeiten sind alle da.
Code:
CREATE Procedure UserQueryRezepturKüche
@100_100 varchar(20), @Artikel#HandelsArtikel#Einheit smallint
as
/*
declare @100_100 varchar(20)
declare @Artikel#HandelsArtikel#Einheit smallint
set @100_100 ='090006'
set @Artikel#HandelsArtikel#Einheit=0
*/
SET NOCOUNT OFF ;
WITH RecursionCTE ( UArtikelNr, UEinheit, UFarbe, UGrösse, ArtikelNr, Einheit, Farbe, Grösse, Menge, Row, Hierarchy )
AS ( SELECT ArtikelNr AS UArtikelNr ,
Einheit AS UEinheit ,
Farbe AS UFarbe ,
Grösse AS UGrösse ,
Artikelnr ,
Einheit ,
Farbe ,
Grösse ,
CAST(0 AS MONEY) AS Menge ,
CAST(0 AS BIGINT) AS Row ,
CONVERT(VARCHAR(100), '') Hierarchy
FROM HandelsArtikel
WHERE ArtikelNr = @100_100
AND Einheit = @Artikel#HandelsArtikel#Einheit
AND Farbe = 0
AND Grösse = 'NULL'
UNION ALL
SELECT R1.UArtikelNr ,
R1.UEinheit ,
R1.UFarbe ,
R1.UGrösse ,
R1.Artikelnr ,
R1.Einheit ,
R1.Farbe ,
R1.Grösse ,
R1.Menge ,
ROW_NUMBER() OVER ( PARTITION BY R1.Artikelnr,
R1.Einheit, R1.Farbe, R1.Grösse ORDER BY R1.Artikelnr, R1.Einheit, R1.Farbe, R1.Grösse, R1.UArtikelNr, R1.UEinheit, R1.UFarbe, R1.UGrösse ) AS Row ,
CASE WHEN DATALENGTH(R2.Hierarchy) > 0
THEN CONVERT(VARCHAR(100), R2.Hierarchy + '.'
+ CAST(ROW_NUMBER() OVER ( PARTITION BY +R1.Artikelnr,
R1.Einheit,
R1.Farbe,
R1.Grösse ORDER BY +R1.Artikelnr, R1.Einheit, R1.Farbe, R1.Grösse, R1.UArtikelNr, R1.UEinheit, R1.UFarbe, R1.UGrösse ) AS VARCHAR(10)))
ELSE CONVERT(VARCHAR(100), CAST(ROW_NUMBER() OVER ( PARTITION BY R1.ArtikelNr,
R1.Einheit,
R1.Farbe,
R1.Grösse ORDER BY R1.Artikelnr, R1.Einheit, R1.Farbe, R1.Grösse, R1.UArtikelNr, R1.UEinheit, R1.UFarbe, R1.UGrösse ) AS VARCHAR(10)))
END AS TOC
FROM Stückliste AS R1
JOIN RecursionCTE AS R2
ON R1.Artikelnr = R2.UArtikelNr
AND R1.Einheit = R2.UEinheit
AND R1.Farbe = R2.UFarbe
AND R1.Grösse = R2.UGrösse
)
SELECT top 100 percent UArtikelNr,Einheit.Bezeichnung,Menge,case when Hierarchy='' then '0' else Hierarchy end as Hierarchy, Artikel.Kurztext, Herstellung, ArtikelBild.DateiName
FROM RecursionCTE
INNER JOIN Artikel ON RecursionCTE.UArtikelNr=Artikel.ArtikelNr
LEFT OUTER JOIN
--subselect für die Herstellungsanweisung
(SELECT ArtikelNr, Feldnummer, CONVERT(varchar(500), Memofeld) AS Herstellung FROM ArtikelHatMultiFeld WHERE (Feldnummer = 103))
as UserAHM103 ON @100_100 = UserAHM103.ArtikelNr
--Bild
LEFT OUTER JOIN
ArtikelBild ON @100_100 = ArtikelBild.ArtikelNr
INNER JOIN Einheit
ON Einheit.Einheit=UEinheit
order by convert(bigint,case when CHARINDEX('.',Hierarchy,1) <> 0 then LEFT(Hierarchy,CHARINDEX('.',Hierarchy,1)-1) else Hierarchy end), convert(bigint,replace(Hierarchy,'.',''))