Just nu i M3-nätverket
Gå till innehåll

Produktkategorier rekursivt


PatrikA

Rekommendera Poster

Jag har en databastabell med produktkategorier som ser ut som foljande:

ProductCategoryID*

ProductCategoryName

ParentProductCategoryID

 

Ett exempel:

23 - Video - 0 (root)

24 - DVD - 23 (child till video)

25 - Comedy - 24 (child till DVD)

 

Jag haller pa med en enkel webshop dar jag har ett produkttrad som meny och om en produktkategori inte har nagra childs sa ar den en lank (showproducts.aspx?catID=XX).

Pa denna sida (showproducts.aspx) ska jag visa produkterna som hor till produktkategorin. jag vill ocksa hogst upp pa sidan visa hela "vagen" fram till den kategorin man klickan pa. Sa tex om en anvandare trycker pa Comedy i produkttradet sa vill jag hogst upp pa showproducts.aspx visa:

Video -> DVD -> Comedy.

Sa med hjalp av productcategoryid for comedi vill jag hamta alla dess parents, i detta fall DVD och Video. Nagon som vet hur man kan fa fram det pa ett smidigt satt?

 

 

Länk till kommentar
Dela på andra webbplatser

SP later vettigt, jag anvander SQL Server 2000.

For det borde val vara effektivare att hamta endast de tva parents direkt an att losa det med klasser i asp.net, typ en produktklass dar man hamtar dess foraldrar inuti klassen. Kanns som om det skulle bli mycket mer anrop till databasen och det vill vi ju inte :)

 

Länk till kommentar
Dela på andra webbplatser

Om det totala antalet kategorier inte är jättestort så skulle jag hellre läsa in alla dessa i en hashtabell där varje post är en instans av ngn Kategori-klass du skapar i .Net. Sedan kan du bara göra dina rekursiva hämtningar i .Net istället. Men det är klart, på en undersida är du väl bara intresserad av just aktuell kategori och dess föräldrar?

 

Länk till kommentar
Dela på andra webbplatser

Ok, här har du en SP som hämtar föräldrarnas Id (inklusive eget kategoriId).

CREATE PROCEDURE ap_GetIDTree
@CatId int
AS
SET NOCOUNT ON
CREATE TABLE #tmp(Id int IDENTITY,CatId int)
DECLARE @Parent int

INSERT INTO #tmp (CatId) VALUES (@CatId)
SELECT @Parent=ParentProductCategoryID FROM Category WHERE ProductCategoryID=@CatId
WHILE @Parent>0
	BEGIN
		INSERT INTO #tmp (CatId) VALUES (@Parent)
		SELECT @Parent=ParentProductCategoryID FROM Category 
			WHERE ProductCategoryID=@Parent

	END
SET NOCOUNT OFF
SELECT * FROM #tmp
DROP TABLE #tmp

 

Länk till kommentar
Dela på andra webbplatser

Tack, den funkar. Men nu forsoker jag fa ut namnet ocksa:

 

CREATE PROCEDURE ap_GetIDTree
@CatId int
AS
SET NOCOUNT ON
CREATE TABLE #tmp(Id int IDENTITY,CatId int, ProductCategoryName varchar(25))
DECLARE @Parent int
DECLARE @ProductCategoryName varchar(25)


SELECT @Parent=ParentProductGroupCategoryID, @ProductCategoryName=fProductCategoryName FROM tProductCategory WHERE ProductCategoryID=@CatId
WHILE @Parent>0
BEGIN
INSERT INTO #tmp (CatId, ProductCategoryName) VALUES (@Parent, @ProductCategoryName)
SELECT @Parent=ParentProductGroupCategoryID, @ProductCategoryName=fProductCategoryName FROM tProductCategory 
WHERE ProductCategoryID=@Parent

END
SET NOCOUNT OFF
SELECT * FROM #tmp
DROP TABLE #tmp
GO

Men den skriver inte ut forsta kategorinamnet, alltsa Video. Men nar jag hamtar alla id'n sa hamtas id't for Video ut...?

 

Länk till kommentar
Dela på andra webbplatser

Du har lyckats slarva bort den inledande inserten (som skall ligga innan den första SELECT:en före loopen

 

Länk till kommentar
Dela på andra webbplatser

Det hade jag visst. Gjorde om den lite och nu ser den ut sa har:

 

CREATE PROCEDURE ap_GetIDTree
@CatId int
AS
SET NOCOUNT ON
CREATE TABLE #tmp(Id int IDENTITY,CatId int, CatName varchar(25))
DECLARE @Parent int
DECLARE @CatName varchar(25)

SELECT @CatName=fProductCategoryName FROM tProductCategory WHERE ProductCategoryID=@CatId
INSERT INTO #tmp (CatId, CatName) VALUES (@CatId, @CatName)
SELECT @Parent=ParentProductGroupCategoryID, @CatName=fProductCategoryName FROM tProductCategory WHERE ProductCategoryID=@CatId
WHILE @Parent>0
BEGIN
INSERT INTO #tmp (CatId, CatName) VALUES (@Parent, @CatName)
SELECT @Parent=ParentProductGroupCategoryID, @CatName=fProductCategoryName FROM tProductCategory 
WHERE ProductCategoryID=@Parent

END
SET NOCOUNT OFF
SELECT * FROM #tmp
DROP TABLE #tmp

Har alltsa en extra select sats som tar ut kategorinamnet for forsta innan forsta insertsatsen. Borde val vara sa? Men det funkar inte

 

Länk till kommentar
Dela på andra webbplatser

Den här skall fungera (lagt till en SELECT i början av loopen)

[log]

CREATE PROCEDURE ap_GetIDTree2
@CatId int
AS
SET NOCOUNT ON
CREATE TABLE #tmp(Id int IDENTITY,CatId int, CatName varchar(25))
DECLARE @Parent int
DECLARE @CatName varchar(25)

SELECT @CatName=fProductCategoryName FROM tProductCategory WHERE ProductCategoryID=@CatId
INSERT INTO #tmp (CatId, CatName) VALUES (@CatId, @CatName)
SELECT @Parent=ParentProductGroupCategoryID, @CatName=fProductCategoryName FROM tProductCategory WHERE ProductCategoryID=@CatId
WHILE @Parent>0
	BEGIN
		SELECT @CatName=fProductCategoryName FROM tProductCategory WHERE ProductCategoryID=@Parent
		INSERT INTO #tmp (CatId, CatName) VALUES (@Parent, @CatName)
		SELECT @Parent=ParentProductGroupCategoryID, @CatName=fProductCategoryName FROM tProductCategory 
		WHERE ProductCategoryID=@Parent

	END
SET NOCOUNT OFF
SELECT * FROM #tmp
DROP TABLE #tmp

[/log]

 

Länk till kommentar
Dela på andra webbplatser

Hmm, nu kommer en fortsattning pa detta problemet.

Nu haller jag pa med admindelen dar jag for tillfallet jobbar med produkteditering. Jag anvander asp.net's datagrid och listar upp alla kategorier. I en kolumn vill jag ha en dropdownlist med alla kategorier, MEN, jag vill att man ska se kategorins foraldrar och bara lista barnet. Detta eftersom ett kategorinamn kan forekomma pa flera stallen men hora till olika saker.

 

Sa som i mitt forsta exempel vill jag att en item i dropdownlisten ska se ut:

Video->DVD->Comedy dar vardet for itemraden ar ID't pa Comedy.

Sa Video->DVD ska alltsa inte vara en item eftersom DVD har en child (Comedy).

 

Hur skulle man kunna gora detta?

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...