webForumDet fria alternativet

Rekursiv function (lite svårare nöt)

ASP

4 svar · 495 visningar · startad av Travoni

Medlem sedan okt. 20041 556 inlägg
Frågan#1

Jag använder denna rekursiva funktion för att skriva ut en trevlig li/ul - meny.

Dim p, cmd, nodes

	' Opens Connection
	connopen
	
	' Preper command
	Set cmd = NewCommand(connection, "SELECT pageid, parent_pageid, linktext FROM pages WHERE pageid = ? ORDER BY parent_pageid")    
	Set p = cmd.CreateParameter("id", 3, 1, , cLng("0" & page_id)) 
	cmd.Parameters.Append p    
	 
	Set nodes = Path(cmd, p)
	 
	cmd.CommandText = "SELECT pageid, parent_pageid, linktext FROM pages WHERE parent_pageid = ? ORDER BY parent_pageid"
	 
	Set rs = Server.CreateObject("ADODB.Recordset")
	rs.open sql, connection, 0, 1
	
	Response.Write "<ul>"& vbCrLf	  
		'WritePath nodes
		WriteMenu rs, rs("pageid"), rs("linktext"), rs("parent_pageid"), nodes, cmd, p
		'Close
		Set cmd = nothing
	Response.Write "</ul>"& vbCrLf
	 
	 

'/// Functions
	 
Function NewCommand(conn,CommandText)
	Dim cmd
   Set cmd = CreateObject("ADODB.Command")
   Set cmd.ActiveConnection = conn 
   cmd.CommandType = 1 
   cmd.CommandText = CommandText
   cmd.Prepared = true 
   Set NewCommand = cmd
End function    

Sub WriteMenu(rs, fldId, fldText, fldParId, Expanded, cmd, p)

    If not rs.EOF Then
	 	Dim rsSub
      Set rsSub = Server.CreateObject("ADODB.Recordset")

	  	Do Until rs.EOF
			
			If Expanded.Exists(CStr(fldId.value)) Then

				If cLng("0"& fldParId) = 0 then
					 Response.Write "<li class=""catlink-active""><a href=""default.asp?id=" & fldId.value & """>" & Server.HTMLEncode(fldText.Value) & "</a>"& vbCrLf &"<ul>"& vbCrLf
				Else
					 Response.Write "<li class=""sublink-active""><a href=""default.asp?id=" & fldId.value & """>" & Server.HTMLEncode(fldText.Value) & "</a>"& vbCrLf &"<ul>"& vbCrLf 
				End if
				p.Value = fldId.value
				rsSub.Open cmd, ,0, 1 
				WriteMenu rsSub, rsSub(fldId.Name), rsSub(fldText.Name), rsSub(fldParId.Name), Expanded, cmd, p
				rsSub.Close 
				
				Response.Write "</ul></li>"& vbCrLf
			Else

				If cLng("0"& fldParId) = 0  then
					 Response.Write "<li class=""catlink""><a href=""default.asp?id=" & fldId.value & """>" & Server.HTMLEncode(fldText.Value) & "</a></li>"& vbCrLf 
				Else
					 Response.Write "<li class=""sublink""><a href=""default.asp?id=" & fldId.value & """>" & Server.HTMLEncode(fldText.Value) & "</a></li>"& vbCrLf	
				End if
			End If

			rs.MoveNext
	  	Loop

    End If
	 
End Sub

Resultatet blir då så här:

<ul>
	<li class="catlink"><a href="default.asp?id=1">Volvo</a></li>
	<li class="catlink-active"><a href="default.asp?id=2">Saab</a>
		<ul>
			<li class="sublink"><a href="default.asp?id=6">Fälgar</a></li>
			<li class="sublink-active"><a href="default.asp?id=7">Motor</a>
				<ul>
					<li class="sublink"><a href="default.asp?id=10">Förgasare</a></li>
					<li class="sublink-active"><a href="default.asp?id=11">Tändsystem</a>
					  [B] <ul>
					</ul>[/B]
					</li>
					<li  class="sublink"><a href="default.asp?id=12">Block</a></li>
				</ul>
			</li>
			<li class="sublink"><a href="default.asp?id=8">Kaross</a></li>
			<li class="sublink"><a href="default.asp?id=9">Belysning</a></li>
		</ul>
	</li>
	<li class="catlink"><a href="default.asp?id=3">BMW</a></li>
	<li class="catlink"><a href="default.asp?id=4">Mercedes</a></li>
	<li class="catlink"><a href="default.asp?id=5">Volkswagen</a></li>
</ul>

Som ni ser så är det en <ul></ul> för mycket. (fetmarkerat)Vet inte varför det blir så. Hjälp önskas.

Medlem sedan maj 200010 687 inlägg
#2

Låt WriteMenu spotta ut <ul> / </ul>. Där i kan du då skippa att göra det om rs.EOF.

Medlem sedan okt. 20041 556 inlägg
#3

Ursäkta men jag fattar inte.
Är det inte det jag gör här?
Kan du visa lite är du bussig. :f

Medlem sedan maj 200010 687 inlägg
#4

Nåt åt det här hållet borde funka.

Dim p, cmd, nodes

	' Opens Connection
	Call connOpen
	
	' Preper command
	Set cmd = NewCommand(connection, "SELECT pageid, parent_pageid, linktext FROM pages WHERE pageid = ? ORDER BY parent_pageid")    
	Set p = cmd.CreateParameter("id", 3, 1, , cLng("0" & page_id)) 
	cmd.Parameters.Append p    
	 
	Set nodes = Path(cmd, p)
	 
	cmd.CommandText = "SELECT pageid, parent_pageid, linktext FROM pages WHERE parent_pageid = ? ORDER BY parent_pageid"
	 
	Set rs = Server.CreateObject("ADODB.Recordset")
	rs.open sql, connection, 0, 1
	  
		'WritePath nodes
		WriteMenu rs, rs("pageid"), rs("linktext"), rs("parent_pageid"), nodes, cmd, p
		'Close
		Set cmd = nothing : rsClose : connClose
	 
	 

'/// Functions
	 
Function NewCommand(conn,CommandText)
	Dim cmd
   Set cmd = CreateObject("ADODB.Command")
   Set cmd.ActiveConnection = conn 
   cmd.CommandType = 1 
   cmd.CommandText = CommandText
   cmd.Prepared = true 
   Set NewCommand = cmd
End function    

Sub WriteMenu(rs, fldId, fldText, fldParId, Expanded, cmd, p)

    If not rs.EOF Then
	Response.Write "<ul>"
	
	Dim rsSub
 	Set rsSub = Server.CreateObject("ADODB.Recordset")

	  	Do Until rs.EOF
			
			If Expanded.Exists(CStr(fldId.value)) Then

				If cLng("0"& fldParId) = 0 then
					 Response.Write "<li class=""catlink-active""><a href=""default.asp?id=" & fldId.value & """>" & Server.HTMLEncode(fldText.Value) & "</a>"& vbCrLf
				Else
					 Response.Write "<li class=""sublink-active""><a href=""default.asp?id=" & fldId.value & """>" & Server.HTMLEncode(fldText.Value) & "</a>"& vbCrLf
				End if
				p.Value = fldId.value
				rsSub.Open cmd, ,0, 1 
				WriteMenu rsSub, rsSub(fldId.Name), rsSub(fldText.Name), rsSub(fldParId.Name), Expanded, cmd, p
				rsSub.Close 
				
				Response.Write "</li>"& vbCrLf
			Else

				If cLng("0"& fldParId) = 0  then
					 Response.Write "<li class=""catlink""><a href=""default.asp?id=" & fldId.value & """>" & Server.HTMLEncode(fldText.Value) & "</a></li>"& vbCrLf 
				Else
					 Response.Write "<li class=""sublink""><a href=""default.asp?id=" & fldId.value & """>" & Server.HTMLEncode(fldText.Value) & "</a></li>"& vbCrLf	
				End if
			End If

			rs.MoveNext
	  	Loop
	
	Response.Write "</ul>"
    End If
	 
End Sub

Function Path(cmd, p)
Dim node(4)
Dim nodes
    ' Prepare recordset
    Set rs = Server.CreateObject("ADODB.Recordset")
    ' Prepare nodes dictionary
    Set nodes = Server.CreateObject("Scripting.Dictionary")
    
    ' Iterate up from the current id
    rs.Open cmd
    Do Until rs.EOF 
	
        node(0) = rs("pageid")
        node(1) = rs("parent_pageid")
        node(2) = rs("linktext")
        
        ' Adds node to list with nodes
        nodes.Add CStr(node(0)), node
        
        ' Fetch parent node
        p.Value = rs("parent_pageid").Value 
        rs.Close 
        rs.Open cmd    
    Loop
    rs.Close 
    'Return value
    Set Path = nodes
End Function
Medlem sedan okt. 20041 556 inlägg
#5

Snyggt (y)

279 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
143 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
139 ms — ändringar (db)