• User Attivo

    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-sottofiglio3

    ecc....

    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-sottofiglio3

    non solamente:

    ---->sottofiglio3
    ---->sottofiglio4

    da 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 ?


  • Moderatore

    Ciao scura,

    prova a postare la tua funzione, e vediamo cosa si può fare...

    :ciauz:


  • User Attivo

    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


  • User Attivo

    dimenticavo, così la richiamo:

    <%cn.open
    response.write ricorsione(request.QueryString("id"),"sSql","rs",0,request.QueryString("id"))
    cn.close%>


  • User Attivo

    @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-sottofiglio3

    ecc....

    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-sottofiglio3

    non solamente:

    ---->sottofiglio3
    ---->sottofiglio4

    da 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?


  • User Attivo

    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 ?


  • User Attivo

    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).