- Home
- Categorie
- Coding e Sistemistica
- Altri linguaggi per il web
- funzione ricorsiva ?
-
funzione ricorsiva ?
Salve a tutti
ho delle categorie organizzate in un db mssql in questa maniera:
padre
-->figlio1
---->sottofiglio1
---->sottofiglio2
-->figlio2
---->sottofiglio3
---->sottofiglio4
------>sotto-sottofiglio3
------>sotto-sotto-sottofiglio3ecc....
si tratta di n categorie, i campi della tblcategoria sono / id / nomeCat/ idGenitore /. Vorrei recuperare tutte le sottocategorie per una categoria, ma ho qualche problemino.
Faccio un esempio: per figlio2 dovrei poter recuperare :---->sottofiglio3
---->sottofiglio4
------>sotto-sottofiglio3
------>sotto-sotto-sottofiglio3non solamente:
---->sottofiglio3
---->sottofiglio4da quello che sono riuscita a capire molti consigliano una funzione ricorsiva. ho provato, facendo una funzione che partendo dall'ID di figlio2 seleziona i recordset con IDgenitore = ID di figlio 2 e poi all'interno del ciclo ho richiamato la stessa funzione, ma come dicevo non va, sapete darmi consigli ?
-
Ciao scura,
prova a postare la tua funzione, e vediamo cosa si può fare...
-
questa è la funzione, e a quanto pare fa il suo dovere, ma dovrei migliorarla perchè: sSql e Rs secondo me dovevano essere inutili,(li volevo usare per dare nomi diversi a Rs e sSql giocando magari con il livello, ma non l'ho fatto) ma se non passo + queste due variabili lo script si interrompe alla seconda select; livello e TopID dovrebbero servirmi a calcolare il livello della cat/scat, per ora non li utilizzo.
function ricorsione(catID, sSql, Rs, livello, TopID)
sSql = "Select News.*, Cat.cat FROM (News INNER JOIN Cat on News.catID = Cat.id) WHERE Cat.idGen = "&catID &" Order by Data DESC"
set Rs = cn.Execute(sSql) if not Rs.eof then Do while not Rs.eof str = str&"-"&Rs("cat")&" Data "&Rs("data")&"<br>" nuovaCatID = Rs("id") str = str& ricorsione(nuovaCatID, "sSql", "Rs", livello, "") Rs.movenext loop end if ricorsione = str
end function
-
dimenticavo, così la richiamo:
<%cn.open
response.write ricorsione(request.QueryString("id"),"sSql","rs",0,request.QueryString("id"))
cn.close%>
-
@scura said:
Salve a tutti
ho delle categorie organizzate in un db mssql in questa maniera:
padre
-->figlio1
---->sottofiglio1
---->sottofiglio2
-->figlio2
---->sottofiglio3
---->sottofiglio4
------>sotto-sottofiglio3
------>sotto-sotto-sottofiglio3ecc....
si tratta di n categorie, i campi della tblcategoria sono / id / nomeCat/ idGenitore /. Vorrei recuperare tutte le sottocategorie per una categoria, ma ho qualche problemino.
Faccio un esempio: per figlio2 dovrei poter recuperare :---->sottofiglio3
---->sottofiglio4
------>sotto-sottofiglio3
------>sotto-sotto-sottofiglio3non solamente:
---->sottofiglio3
---->sottofiglio4da quello che sono riuscita a capire molti consigliano una funzione ricorsiva. ho provato, facendo una funzione che partendo dall'ID di figlio2 seleziona i recordset con IDgenitore = ID di figlio 2 e poi all'interno del ciclo ho richiamato la stessa funzione, ma come dicevo non va, sapete darmi consigli ?
Ciao scura Cosa intendi per "non va"?
Ti da errore? Non ottieni quello che vuoi? Cosa ottieni?
-
Ciao madai
nessun errore però non mi convince,per i motivi che ho scritto, comunque sto andando avanti senza fare troppo la perfezionista, approfitto per chiedere una cosa:
con la funzione di sopra recupero solo le news dei figli della cat principale volendo recuperare anche i record legati alla cat principale pensavo bastasse fare una select di questo tipo:
sSql = "Select News.*, Cat.cat FROM (News INNER JOIN Cat on News.catID = Cat.id) WHERE ( cat.idGen = "&catID&" ) OR ( cat.id = "&catID&" ) Order by Data DESC"
ma mi va riccamente in time out ... perchè cosa succede ?
-
La query sembra ok.
Ma perchè non provi ad usare una subquery? Così:
SELECT * FROM News WHERE News.catID IN (SELECT * FROM Cat WHERE cat.idGen = "&catID&" OR cat.id = "&catID&")
Dovrebbe essere meno dispendiosa di una INNER JOIN (ma non sempre è così, testale in Query Analyzer).