ciao,
doppiomango ha scritto:
Ad ogni modo mi era sembrato di capire che fosse il campo ordinamento a gestire l'ordinamento gerarchico dei risultati
E' così, anche se - a scanso di equivoci - il campo 'ordinamento'
non deve trovarsi nella tabella ma è creato al volo dalla query, concatenando gli ID delle categorie. Per pura curiosità: ciò che si ottiene è una notazione simile a quella usata nella
classificazione Dewey. Come vedi lì, le categorie con ID più basso hanno degli zeri alla loro sinistra, affinché tutti i numeri siano sempre composti da 3 cifre, in modo che anche l'ordinamento alfabetico possa funzionare in maniera consistente. Una cosa analoga succede con il casting a Binary.
doppiomango ha scritto:
basterà aggiungere il campo dopo ordinamento nell'order by, giusto?
Purtroppo no perché, essendo 'ordinamento' una composizione dei campi ID, saranno i valori degli ID a determinare l'ordine di apparizione all'interno dello stesso livello. Aggiungere il campo nell'ORDER BY non produrrà effetto perché due categorie nello stesso ramo sono già state discriminate dai loro valori di 'ordinamento', che sono diversi.
Quindi devi andare a modificare la logica con cui il valore di 'ordinamento' viene creato. La soluzione è comunque facile perché basta sostituire l'ID con un campo Priorità. Ammettiamo che tu l'abbia creato come campo Tinyint (0-255 è un range sufficiente) dove le categorie con i valori più bassi appaiono in alto nella lista. Modifica così la logica di creazione dell'ordinamento, coinvolgi solo il campo Priorità.
CAST(cte.ordinamento + CAST(cat.Priorità AS BINARY(1)) AS VARBINARY(900))
doppiomango ha scritto:
I risultati sono sempre gli stessi...
mmh, non riesco a riprodurre il problema, da me sta funzionando. Prova ad eseguire questo script in un db di test. Lo script creerà la tabella, aggiungerà dei dati ed eseguirà la query.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Categorie](
[Id] [int] IDENTITY(1,1) NOT NULL,
[IdPadre] [int] NULL,
[Nome] [nvarchar](50) NOT NULL,
[Percorso] [nvarchar](50) NOT NULL,
[Priorità] [tinyint] NOT NULL,
CONSTRAINT [PK_Categorie] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Categorie] ON
GO
INSERT INTO [dbo].[Categorie] (Id, IdPadre, Nome, Percorso, Priorità) VALUES
(1, NULL, 'Home', '/', 0),
(2, 1, 'Prodotti', '/prodotti', 10),
(3, 1, 'Azienda', '/azienda', 5),
(4, 3, 'Chi siamo', '/azienda/chi-siamo', 20),
(5, 3, 'Dove siamo', '/azienda/dove-siamo', 50),
(6, 2, 'Sedie', '/prodotti/sedie', 50),
(7, 2, 'Divani', '/prodotti/carrelli', 20),
(9, 6, 'Legno', '/prodotti/sedie/legno', 10),
(10, 6, 'Rattan', '/prodotti/sedie/rattan', 20),
(11, 7, 'Pelle', '/prodotti/divani/pelle', 20),
(12, 7, 'Tessuto', '/prodotti/divani/tessuto', 50),
(13, 7, 'Ecopelle', '/prodotti/diviani/ecopelle', 10);
GO
WITH cteCategorie AS
(
SELECT Id, IdPadre, Nome, 0 as Livello, Percorso, Priorità, CAST(Priorità AS VARBINARY(900)) AS Ordinamento
FROM Categorie
WHERE (IdPadre IS NULL)
UNION ALL
SELECT cat.Id, cat.IdPadre, cat.Nome, Livello + 1, cat.Percorso, cat.Priorità, CAST(cte.ordinamento + CAST(cat.Priorità AS BINARY(1)) AS VARBINARY(900))
FROM Categorie AS cat INNER JOIN cteCategorie AS cte ON cte.Id = cat.IdPadre
)
SELECT Id, IdPadre, Nome, Percorso, Priorità, Livello FROM cteCategorie ORDER BY Ordinamento;
doppiomango ha scritto:
Ho già implementato sia il menù custom che il codice che mi hai fornito, adeguatamente modificato, con successo =)
benissimo :) manca solo la questione della query allora.
ciao
Modificato da BrightSoul il 13 novembre 2012 22.14 -