Jag skulle vilja ha hjälp med en funktion för att kunna lista trådar i nivåer. Jag har bara tre steg i undermenyn men så här jag gjort: Jag tror denna löser det så du vill ha det.Rekursion på trådar...
Databasstrukturen är som följer:
t_id | t_relid | t_linktext
Initialt så vill jag att alla "huvuttrådar" (Som saknar relid) skall visas.
Ex.
Bilar
Cyklar
Båtar
Klickar jag ex. på Bilar så skall huvud och -undertrådar till bilar visas
Ex.
Bilar
--Volvo
--Saab
--VW
Cyklar
Båtar
Klickar jag nu på Volvo så skall volvos modeller visas och klickar jag sedan på ex saab så skall volovs modeller döljas och saabs visas osv.
Jag tänker mig inget javascrip-trassel utan att jag skickar med id:t i en querystring på något vis.
Lite roddig föklaring kanske.
Går detta att förstå eller har jag strulat im mig alldeles?
Jag har skapat en rekursiv funktion men den skriver bara ut allt rakt upp å ned.
Sub PrintTree(intParent,intSub)
Dim objRubrik,objNode,sql
sql = "SELECT t_id, t_relid, t_linktext FROM my_table WHERE t_relid = " & intParent
Set objRubrik = connection.Execute(sql)
Do Until objRubrik.EOF
sql = "SELECT t_relid FROM my_table WHERE t_relid = " & objRubrik(0)
Set objNode = connection.Execute(sql)
if intSub = 1 then strSub = "-" else strSub = ""
If NOT objNode.EOF Then
Response.Write("-" & objRubrik(2) &"<br>")
PrintTree objNode(0), 1
Else
Response.Write("-"& strSub & objRubrik(2) & "<br>")
End If
objNode.Close : Set objNode = Nothing
objRubrik.MoveNext
Loop
objRubrik.Close : Set objRubrik = Nothing
End Sub
Sv:Rekursion på trådar...
Jag har kolumner som heter menulevel1 och menulevel2
Jasg hämtar de värderna från raden som requestas och lägger dem i
thisml1 (vilken sida i menyroten den nya sidan skall ligga under) och thisml2 (om den skall ligga under en annan undersida under menyrotsidan)
<code>
Set rsRoot = Conn.Execute("SELECT Id, Namn FROM content WHERE menulevel1 IS NULL AND menulevel2 IS NULL ORDER BY sortindex")
If Not rsRoot.EOF Then
'Set rootmenulevel1 = rsRoot("menulevel1")
'Set menulevel2 = rsRoot("menulevel2")
DO Until rsRoot.EOF
Set rootID = rsRoot("Id")
Set rootName = rsRoot("Namn")
response.write "<div id=""menylankar""><p class=""pillank"">"
if rootID = INT(pageID) OR rootID = INT(thisml1) then
'feta menybilden och hämta undermenyer
response.write ""&rootName &"</p></div>"&VBNewLine
Set rsChild = Conn.Execute("SELECT Id, Namn, menulevel2 FROM content WHERE menulevel1 = "&rootID&" AND menulevel2 IS NULL ORDER BY sortindex")
If Not rsChild.EOF Then
ChildData = rsChild.getrows()
response.write "<div id=""undermenylankar"">"
for i=0 to ubound(ChildData,2)
'Set ChildID = ChildData(0,i)
'Set ChildName = ChildData(1,i)
response.write "<p class=""pilundermenylank"">"
if ChildData(0,i) = INT(pageID) OR ChildData(0,i) = INT(thisml2) then
response.write ""&ChildData(1,i) &""
response.write "</p>"&vbNewLine
Set rsSubChild = Conn.Execute("SELECT Id, Namn FROM content WHERE menulevel1 = "&rootID&" AND menulevel2 = "&ChildData(0,i)&" ORDER BY sortindex")
If Not rsSubChild.EOF Then
SubChildData = rsSubChild.getrows()
for y=0 to ubound(SubChildData,2)
response.write "<p class=""pilunderundermenylank"">"
if SubChildData(0,y) = INT(pageID) then
response.write ""&SubChildData(1,y) &""
else
response.write SubChildData(1,y)
end if
response.write "</p>"&vbNewLine
next
End if
rsSubChild.close
else
response.write ChildData(1,i)
response.write "</A></p>"&vbNewLine
end if
next
rsChild.close
response.write "</div>" & vbNewLine & vbNewLine
else
rsChild.close
End if
else
response.write rootName &"</A></p></div>"&VBNewLine
end if
rsRoot.MoveNext
Loop
end if
rsRoot.Close
</code>
Mycket kan vara lite mumbojumbo men nu ser du vad jag gjort iaf.
sen kan man utöka ännu en nivå och lägga till menulevel3 i tabellen ocksåSv: Rekursion på trådar...
<%
const adOpenForwardOnly = 0
const adLockReadOnly = 1
const adInteger = 3
const adParamInput = 1
Function NewCommand(con,CommandText)
const adCmdText = 1
Dim cmd
Set cmd = CreateObject("ADODB.Command")
Set cmd.ActiveConnection = con
cmd.CommandType = adCmdText
cmd.CommandText = CommandText
cmd.Prepared = true
Set NewCommand = cmd
End function
Sub WriteMenu(rs, fldId, fldText, Expanded, cmd, p)
Dim rsSub
If rs.EOF Then
Else
Set rsSub = CreateObject("ADODB.Recordset")
Response.Write "<ul>"
Do
Response.Write "<li>"
If Expanded.Exists(CStr(fldId.value)) Then
Response.Write "" & Server.HTMLEncode(fldText.Value) & ""
p.Value = fldId.value
rsSub.Open cmd,,adOpenForwardOnly, adLockReadOnly
WriteMenu rsSub, rsSub(fldId.Name), rsSub(fldText.Name), Expanded, cmd, p
rsSub.Close
Else
Response.Write "" & Server.HTMLEncode(fldText.Value) & ""
End If
Response.Write "</li>"
rs.MoveNext
Loop Until rs.EOF
Response.Write "</ul>"
End If
End Sub
Function Path(cmd, p)
Dim node(2)
Dim nodes
' Prepare recordset
Set rs = CreateObject("ADODB.Recordset")
' Prepare nodes dictionary
Set nodes = CreateObject("Scripting.Dictionary")
' Iterate up from the current id
rs.Open cmd
Do Until rs.EOF
node(0) = rs("t_id")
node(1) = rs("t_relid")
node(2) = rs("t_linktext")
' Adds node to list with nodes
nodes.Add CStr(node(0)), node
' Fetch parent node
p.Value = rs("t_relid").Value
rs.Close
rs.Open cmd
Loop
rs.Close
'Return value
Set Path = nodes
End Function
Sub WritePath(nodes)
Dim node
Dim temp
For Each node In nodes.Items
temp = "/ " & Server.HTMLEncode(node(2)) & " " & temp
Next
response.Write "Path: Fordon " & temp
End Sub
Dim p
Dim rs
Dim cmd
Dim con
Dim id
Dim nodes
' Id of current menu item
id = CLng(Request.QueryString("id"))
' Opens Connection
Set con = CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" + _
"Data Source=" + Server.MapPath("menu.mdb") + ";"
' Prepers a comand, which makes querying fast and reliable
Set cmd = NewCommand(con, "SELECT t_id, t_relid, t_linktext" + vbCrLf + _
"FROM my_table" + vbCrLf + _
"WHERE t_id = ?" + vbCrLf)
Set p = cmd.CreateParameter("id", adInteger, adParamInput, , id)
cmd.Parameters.Append p
Set nodes = Path(cmd, p)
cmd.CommandText = "SELECT t_id, t_linktext" + vbCrLf + _
"FROM my_table" + vbCrLf + _
"WHERE t_relid = ?" + vbCrLf
Set rs = CreateObject("ADODB.Recordset")
rs.open "SELECT t_id, t_linktext" + vbCrLf + _
"FROM my_table" + vbCrLf + _
"WHERE t_relid Is Null" + vbCrLf, con, adOpenForwardOnly, adLockReadOnly
WritePath nodes
WriteMenu rs, rs("t_id"), rs("t_linktext"), nodes, cmd, p
rs.Close
con.close
%>
Förvänta dig dock inte att jag förklara den. Då jag anser det är din uppgift att förstå den.