---
title: "Rekursiv funktion?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/asp/98692-rekursiv-funktion"
topic: "ASP"
topic_url: "https://www.webforum.nu/amne/asp"
author: "Jesper T"
published: "2004-03-03T22:42:29.000Z"
updated: "2004-08-16T21:43:00.000Z"
replies: 30
views: 1310
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/asp/98692-rekursiv-funktion"
---

# Rekursiv funktion?

_Sida 1 av 2._

## #1 — Jesper T, 2004-03-03T22:42Z

Försöker att skapa en "ul och li"-lista, men mina hjärnceller står still.
Skulle det inte gå att utgå ifråd detta må någe vis?

```
Sub LinkTree(intParent,intIndent) :	Dim X,Z
		For X = 0 To Ubound(arrLinks,2)		
			If arrLinks(1,X) = intParent then
			
					IF intIndent < 0 then 
				 		Response.Write "<li>"& arrLinks(2,X) &"</ul>"& VbCrlf
					ELSE	
					For Z = 1 To intIndent
					Response.Write Z &" * "& intIndent
					next						
						Response.Write("<li><a href=""javascript:void(0);"">"& arrLinks(2,X)& "</a></li></ul>"& VbCrlf)
					END IF
					
				Call LinkTree(arrLinks(0,X),intIndent + 1)
			End If
		Next 
		
End Sub
```

Permalänk: https://www.webforum.nu/p/98692

## #2 — J.N., 2004-03-04T08:02Z

HEJ!

Menar du riktiga li/ul, dvs jag ser de ej i koden? Eller det är en liknelse för din meny?

I vilket fall, kolla vad som blir resultatet i koden, justera efter det/återkom till oss.

Permalänk: https://www.webforum.nu/p/1289282

## #3 — Jesper T, 2004-03-04T10:32Z

Har satt in några nu men det hjälper ju föga.

Jag satt med detta i fyra timmar i går och har pillat in ul och li-taggar men det funkar inte. Jag förstår att det är något som fattas funktionen. Har googlat: recursive ASP function li ul osv. utan något bra resultat.
För FSO så har jag en sådan funktion. Eventuellt så går den att överföra på ngt smidigt sätt till getrows?!

```
 function GetSubFolders(pfolder)
    Dim sFolders, fldr, fil
    sFolders = "<LI>" & pfolder.Name

    If pfolder.SubFolders.Count > 0 Or pfolder.Files.Count > 0 Then _
        sFolders = sFolders & "<UL>"

    For Each fldr In pfolder.SubFolders
        sFolders = sFolders & GetSubFolders(fldr)
    Next
    
    For Each fil In pfolder.Files
        sFolders = sFolders & "<LI>" & fil.Name & "</LI>"
    Next
    
    If pfolder.SubFolders.Count > 0 Or pfolder.Files.Count > 0 Then _
        sFolders = sFolders & "</UL>"
    
    sFolders = sFolders & "</LI>"

    Set fil = Nothing
    Set fldr = Nothing
    
    GetSubFolders = sFolders
End function
```

Permalänk: https://www.webforum.nu/p/1289352

## #4 — Engine^, 2004-03-04T16:45Z

Hur är listan du vill skriva ut sparad? För att göra en rekursiv funktion som skriver ut en trädsstruktur bör man... hmmm... jag förklarar med ett exempel istället :)

**tblTree**
intNode
intParent
strNamn

Fylld med något i den här stilen

```
[u]intNode[/u] [u]intParent[/u] [u]strNamn[/u]
   1       0       '1'
   2       0       '2'
   3       0       '3'
   4       1       '1.1'
   5       1       '1.2'
   6       2       '2.1'
   7       6       '2.1.1'
   8       6       '2.1.2'
   9       2       '2.2'
   10      3       '3.1'
```

Nu ligger det en snygg liten trädstruktur där och för att skriva ut rasket rekursivt kan man antaglien göra så här

```
Sub PrintTree(intParent)
  Dim objNode, objChild

  strSQL = "SELECT intNode, strNamn FROM tblTree WHERE intParent = " & intParent

  Set objNode = Server.CreateObject("ADODB.Recordset")
  Set objChild = Server.CreateObject("ADODB.Recordset")

  objNode.Open strSQL, objConn

  While Not objNode.EOF
    strSQL = "SELECT 1 FROM tblTree WHERE intParent = " & objNode(0)

    objChild.Open strSQL, objConn

    If objChild.EOF Then
      Response.Write "<li>" & objNode(1) & "</li>"
    Else
      Response.Write "<ul>"

      PrintTree objNode(0)

      Response.Write "</ul>"
    End If

    objChild.Close

    objNode.MoveNext
  Wend

  Set objChild = Nothing
  
  objNode.Close : Set objNode = Nothing
  objConn.Close : Set objConn = Nothing
End Sub

Response.Write "<ul>" & PrintTree(0) & "</ul>"
```

Jag säger antagligen, eftersom jag inte har testat detta mer än i huvudet... ;) Och detta kanske inte passar ditt behov heller :)

Permalänk: https://www.webforum.nu/p/1289551

## #5 — Jesper T, 2004-03-04T17:53Z

Ja, det ser ju ut att likna det jag söker. 
Dock får jag "Type Mismatch", här: --\>Response.Write "\<ul\>" & **PrintTree**(0) & "\</ul\>"

Permalänk: https://www.webforum.nu/p/1289601

## #6 — Jesper T, 2004-03-04T17:56Z

Tabellen ser ut som i ditt exempel.

Permalänk: https://www.webforum.nu/p/1289602

## #7 — Engine^, 2004-03-04T18:07Z

Öhh... jag som tänkte knasigt där...

```
Reponse.Write "<ul>"
PrintTree 0
Response.Write "</ul>"
```

Permalänk: https://www.webforum.nu/p/1289608

## #8 — Jesper T, 2004-03-04T18:28Z

Tack, nu rullar den. Men fel....

Permalänk: https://www.webforum.nu/p/1289614

## #9 — Jesper T, 2004-03-04T18:32Z

Det är denna form av struktur jag slulle vilja ha:
<http://member.webforum.nu/Jesper%20T/liul.htm>
...och det verkar vara svårt att åstakomma, eller?

Permalänk: https://www.webforum.nu/p/1289618

## #10 — Engine^, 2004-03-04T18:39Z

Nädå... det är bara att lägga in en extra parameter för funktionen

```
Sub PrintTree(intParent[b], intDepth[/b])
  Dim objNode, objChild

  strSQL = "SELECT intNode, strNamn FROM tblTree WHERE intParent = " & intParent

  Set objNode = Server.CreateObject("ADODB.Recordset")
  Set objChild = Server.CreateObject("ADODB.Recordset")

  objNode.Open strSQL, objConn

  While Not objNode.EOF
    strSQL = "SELECT 1 FROM tblTree WHERE intParent = " & objNode(0)

    objChild.Open strSQL, objConn

    If objChild.EOF Then
      Response.Write [b]Space(intDepth * 4) & [/b]"<li>" & objNode(1) & "</li>"
    Else
      Response.Write "<ul>"

      PrintTree objNode(0, [b]intDepth + 1[/b])

      Response.Write "</ul>"
    End If

    objChild.Close

    objNode.MoveNext
  Wend

  Set objChild = Nothing
  
  objNode.Close : Set objNode = Nothing
  objConn.Close : Set objConn = Nothing
End Sub

Reponse.Write "<ul>"
PrintTree 0, 0
Response.Write "</ul>"
```

Inga större förändringar med andra ord :)

Permalänk: https://www.webforum.nu/p/1289624

## #11 — Jesper T, 2004-03-04T18:48Z

space() verkar bara trixa till tomrum i källkoden.

Permalänk: https://www.webforum.nu/p/1289632

## #12 — Engine^, 2004-03-04T18:52Z

Ahh... det är ju förmodligen därför att \<li\>-elementen stör till det antar jag. Om du byter ut list-elementen mot ett tecken eller en liten bild så får du nog se vad jag hade tänkt att det skulle se ut som.

**red.**
Det Space(x) gör är returnerar en sträng med *x* mellanslag.

Permalänk: https://www.webforum.nu/p/1289635

## #13 — Jesper T, 2004-03-04T19:18Z

Åhhh, det var inte lätt detta. Jag är tebax på ruta ett. Om det inte blir li och ul taggar enligt strukturen på denna sida:
<http://member.webforum.nu/Jesper%20T/liul.htm>
så kommer inte javascriptet att funka.
"Jag" gjorde en variant med getrows, och den ritar ju ut strukturen rätt iaf. :)

```
Sub LinkTree(intParent,intIndent) :	Dim X,Z
		For X = 0 To Ubound(arrLinks,2)		
			
			If arrLinks(1,X) = intParent then
					
					For Z = 1 To intIndent
					Response.Write "-----"
					next
					
					IF len(arrLinks(3,X)) > 3 then
						Response.Write("<span><a href="""& arrLinks(3,X) &""">"& arrLinks(2,X)& "</a></span><br>"& VbCrlf) 
					ELSE	
						Response.Write "<span>"& arrLinks(2,X) &"</span><br>"& VbCrlf
					END IF
				Call LinkTree(arrLinks(0,X),intIndent + 1)
			End If
		
		Next 
End Sub
```

Permalänk: https://www.webforum.nu/p/1292626

## #14 — Sebbe, 2004-03-04T21:35Z

Det varkar ju som om Engine^s kod inte funkar riktigt, så jag kan väl bidra med den jag skrev nu i brist på annat?
Har bytt ut namnet på tabellen till tblNodes och kolumnerna till nodeId, nodeParent och nodeText, annars är det ingen skillnad i databasdesignen.

```
<%
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("db.mdb")

Sub PrintTree(intParent)
  strSQL = "SELECT nodeId, nodeParent, nodeText FROM tblNodes WHERE nodeParent = " & intParent
  Set objRubrik = objConn.Execute(strSQL)

  Response.Write("<ul>" & vbCrLf)

  Do Until objRubrik.EOF
    Response.Write("<li>" & objRubrik(2) & "</li>" & vbCrLf)
    strSQL = "SELECT nodeParent FROM tblNodes WHERE nodeParent = " & objRubrik(0)
    Set objNode = objConn.Execute(strSQL)

    If NOT objNode.EOF Then
      PrintTree objNode(0)
    End If

    objNode.Close : Set objNode = Nothing
    objRubrik.MoveNext
  Loop

  objRubrik.Close : Set objRubrik = Nothing
  Response.Write("</ul>")
End Sub

PrintTree 0

objConn.Close : Set objConn = Nothing
%>
```

Permalänk: https://www.webforum.nu/p/1292690

## #15 — Jesper T, 2004-03-05T15:49Z

Jag fick till Engine^s sub. Men ul och li-taggarna hamnar ändå på fel ställe.

Permalänk: https://www.webforum.nu/p/1292952

## #16 — Engine^, 2004-03-05T16:09Z

> **Jesper T skrev:**
>
> Jag fick till Engine^s sub. Men ul och li-taggarna hamnar ändå på fel ställe.

Hur ser det ut då? Det kanske är enkelt att fixa till.

Permalänk: https://www.webforum.nu/p/1292960

## #17 — Jesper T, 2004-03-05T16:18Z

Ja det blir ju bara: 

```
<ul>
<li></li>
<li></li>
</ul>
```

Och i det [inflikade exemplet](http://member.webforum.nu/Jesper%20T/liul.htm) så är det lite mer komplext:

```
      <ul>
        <li class="toggle">Games
        <ul>
          <li class="toggle">Commodore 64
          <ul>
            <li class="toggle">Adventure
            <ul>
              <li>Curse of Sherwood, the</li>
              <li>Defender of the Crown</li>
              <li>Last Ninja, the</li>
            </ul>
            </li>
            <li class="toggle">Platform
            <ul>
...osv
```

 :)

Permalänk: https://www.webforum.nu/p/1292966

## #18 — Sebbe, 2004-03-05T17:09Z

**/red** Missuppfattade allt. ;) Glöm bort!

Permalänk: https://www.webforum.nu/p/1292988

## #19 — Engine^, 2004-03-05T17:13Z

Jag brukar aldrig använda mig av list-element, men skriver du ut rasket såhär kanske det blir bättre. Om inte så är det ju bara att testa flytta runt lite bland \<li\>- och \<ul\>-taggarna :)
Med min bristande kunskap om dessa listelement skulle jag kunna gissa på att det är helt onödigt att använda Space()-funktionen.

```
Sub PrintTree(intParent, intDepth)
  Dim objNode, objChild

  strSQL = "SELECT intNode, strNamn FROM tblTree WHERE intParent = " & intParent

  Set objNode = Server.CreateObject("ADODB.Recordset")
  Set objChild = Server.CreateObject("ADODB.Recordset")

  objNode.Open strSQL, objConn

  While Not objNode.EOF
    strSQL = "SELECT 1 FROM tblTree WHERE intParent = " & objNode(0)

    objChild.Open strSQL, objConn

    If objChild.EOF Then
      Response.Write Space(intDepth * 4) & "<li>" & objNode(1) & "</li>"
    Else
      Response.Write "<li>" & Space(intDepth * 4) & "<ul>" & objNode(1)

      PrintTree objNode(0), intDepth + 1

      Response.Write "</ul></li>"
    End If

    objChild.Close

    objNode.MoveNext
  Wend

  Set objChild = Nothing
  
  objNode.Close : Set objNode = Nothing
  objConn.Close : Set objConn = Nothing
End Sub

Reponse.Write "<ul>"
PrintTree 0, 0
Response.Write "</ul>"
```

Permalänk: https://www.webforum.nu/p/1292990

## #20 — Jesper T, 2004-03-05T17:13Z

Ehhh....

```
"<li>" & objRubrik(2) & "</li>"
```

Kan ju knappast bli : 

```
<li>Games 
<ul>
```

 ;)

Permalänk: https://www.webforum.nu/p/1292992

---

Tråden på webben: https://www.webforum.nu/amne/asp/98692-rekursiv-funktion  
Nästa sida: https://www.webforum.nu/amne/asp/98692-rekursiv-funktion/page2.md
