webForumDet fria alternativet

Rekursiv funktion för länkar...

ASP

6 svar · 372 visningar · startad av Jesper T

Medlem sedan nov. 20017 144 inlägg
Frågan#1

Vill skapa en länknavigering, tänkte en liknande rekursiv funktion/sub. Men problemet är att länkarna hamnar i fel ordning. Måste man slänga in allt i en array och vända på ordningen i den eller funkar det att göra det "direkt" i subben?

sub linktree(connection,parentid)
Dim rs : Set rs = connection.execute("SELECT relid, linktext FROM links WHERE id = " & parentid)
      Do While Not rs.eof
            Response.Write rs(1) & " » "
            linktree connection, rs(0)
            rs.movenext
      Loop 
end sub 

linktree connection, 4

Tabell links

id | linktext | relid
-----------------------
1 Vägarbeten 0
2 Beläggningar 1
3 Asfalt 2
4 Oljegrus 2

Min sub listar ju i ordningen:
Oljegrus » Beläggningar » Vägarbeten »

Vilket är bakvänt...

Tips?

Medlem sedan juni 20008 205 inlägg
#2

Byt plats på Response.Write och det rekursiva anropet på raden under.

Medlem sedan nov. 20017 144 inlägg
#3

Såklart, spring inte över ån...
Tack! :)

Medlem sedan juni 2004533 inlägg
#4

Oj, vad många recordset du har glömt att stänga.

Ifall du hämtar alla länkar och lägger in resultatet i en array med GetRows, så att du kan loopa igenom arrayen istället för att ställa en databasfråga för varje länk, så blir koden avsevärt mycket snabbare.

Medlem sedan nov. 20017 144 inlägg
#5

Jag skapar ju inga nya recordset jag återanvänder det.
Det borde väl gå bra om man stänger det efteråt.
Eller har jag missuppfattat något?

Visst, funkar det med getrows så gärna för mig, men likväl så måste väl posterna hämtas rekursivt.

Hur tänker du dig likande funktion med getrows?

Medlem sedan juni 2004533 inlägg
#6

Jesper T skrev:

Jag skapar ju inga nya recordset jag återanvänder det.

Nej, det gör du inte. När du anropar Execute så skapas ett nytt recordset.

Jesper T skrev:

Visst, funkar det med getrows så gärna för mig, men likväl så måste väl posterna hämtas rekursivt.

Nej, de behöver inte hämtas rekursivt, de behöver bara visas rekursivt.

Jesper T skrev:

Hur tänker du dig likande funktion med getrows?

Hämta alla länkarna innan du anropar subrutinen. I subrutinen loopar du igenom arrayen och visar de länkar som ska visas på den nivån, istället för att ställa en databasfråga som hämtar länkarna för den nivån.

Medlem sedan nov. 20017 144 inlägg
#7

Visst, du har rätt.
Gjorde så här i stället:

Dim arrLinks
arrLinks = GetRows("SELECT id, relid, linktext FROM links")

Sub navTree(intParent) : Dim X
		For X = 0 to Ubound(arrLinks, 2)
			If arrLinks(0,X) = intParent then
			Call navTree(arrLinks(1,X))
					Response.Write arrLinks(2,X) & " » "
			End If
		Next 
End Sub

If IsArray(arrLinks) Then Call navTree(4)
260 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)