Questo articolo intende mostrare come sia possibile gestire all'interno di
una sola tabella di un database informazioni sufficienti a costruire una struttura di categorie e sottocategorie profonda quanto si voglia, ovvero nella quale ciascuna categoria e sotto categoria possa contenere un numero infinito di sotto categorie di livello più basso.
Il trucco impiegato, se così lo si vuole chiamare, consiste nell'assegnare
nella tabella che ospita i dati di ogni categoria, due informazioni aggiuntive:
a) l'identificativo della categoria padre rispetto a quella che stiamo prendendo in considerazione;
b) il numero di sotto categorie di primo livello che ogni categoria o sotto categoria possiede.
Le tabelle utilizzate nel nostro esempio sono due:
Nella prima tabella, denominata tCat, sono contenute tutte le informazioni alle quali si è fatto cenno nei due punti precedenti:
![Screenshot](https://static.html.it/app/uploads/documenti/articoli/esempi/articoli_asp/228/tCat.jpg)
I singoli campi della tabella indicano quanto segue:
cat_id: contatore delle categorie;
cat_name: nome della categoria/sotto categoria;
cat_parent_id: identificativo della categoria padre;
cat_total_sub: numero di sotto categorie di primi livello.
Nella seconda tabella, denominata tContent, sono riportati invece i dati di dettaglio relativi a ciascuna categoria / sotto categoria quando questa abbia raggiunto il proprio livello più basso (assenza di ulteriori sotto categorie). Può essere mostrato qui, a titolo di esempio, l'elenco degli ipotetici articoli appartenenti ad una delle categorie/ sotto categorie contenute nella tabella precedente:
![Screenshot](https://static.html.it/app/uploads/documenti/articoli/esempi/articoli_asp/228/tContent.jpg)
Gli script necessari al funzionamento del sistema creato, sono racchiusi all'interno di tre pagine .asp.
La prima pagina, common.asp [Listato 1], costituisce il cuore di tutta la procedura.
Al suo interno, infatti, oltre alla connessione al database, trovano spazio altre due importanti sub routine:
· listCat: riceve in input l'identificativo della categoria padre e fornisce in output (tramite la dichiarazione byRef) un array bidimensionale con le informazioni richieste per ogni categoria;
· listContent: riceve in input l'identificativo della categoria e fornisce in output (tramite la dichiarazione byRef) un array bidimensionale con le informazioni di dettaglio associate alla categoria (ad esempio gli articoli
di cui si diceva sopra).
Il sistema inizia l'elaborazione a partire dalla pagina cat.asp [Listato 2], nella quale si scorre il primo array per mostrare le categorie presenti al suo interno.
Possono presentarsi due casi:
- la categoria possiede sotto categorie: in questo caso la stessa risulta
cliccabile e accanto è mostrato il numero delle sotto categorie ad essa relative; il link ricarica la stessa pagina passando questa volta l'identificativo della categoria che, per le sue sotto categorie, rappresenta l'identificativo padre, e così via per le eventuali sotto categorie successive. - la categoria non possiede sotto categorie: in questo caso il link sulla
categoria conduce alla terza ed ultima pagina, content.asp [Listato 3], una pagina di dettaglio che tramite l'identificativo della categoria mostra i dettagli nella scheda finale (secondo l'esempio precedente, i prodotti della categoria).
La semplice pagina cat.asp consente di gestire potenzialmente un numero infinito di categorie e sotto categorie. Esula dalla trattazione del presente articolo la gestione, generalmente effettuata lato amministratore, delle categorie/sotto categorie e delle informazioni di dettaglio.
Merita comunque una menzione particolare la query per l'inserimento di una nuova categoria.
Se si tratta di una categoria di primo livello, ad essa non è associabile
una categoria padre pertanto il relativo identificativo verrà impostato a -1 come mostrato nella query sottostante:
strSqlCat = "INSERT INTO tCat
(cat_name, cat_parent_id, cat_total_sub)
VALUES ('Nome categoria', -1, 0)"
In caso di sotto categoria, indipendentemente dal livello di appartenenza, l'identificativo padre è rappresentato sempre dall'identificativo della categoria del livello appena superiore. In questo senso, se nell'esempio
precedente, volessimo inserire la sotto categoria 'Divani' all'interno della categoria 'Arredamento' (che ha id = 4) scriveremmo una query di questo tipo:
strSqlCat = "INSERT INTO tCat (cat_name, cat_parent_id,
cat_total_sub) VALUES ('Divani', 4, 0)"
L'operazione non è però terminata: è necessario infatti, in corrispondenza della categoria padre, incrementare di 1 il campo cat_total_sub che indica il totale delle sotto categorie ad essa relative:
strSqlCat = "UPDATE tCat SET cat_parent_id =
cat_parent_id + 1 WHERE cat_id = 4"
È disponibile un archivio zip contenente tutti i file necessari alla sua implementazione.