Så kan du lave hele menuen i en SQL ved at JOINe alle tabellerne sammen.:
SQL = "SELECT hovedmenu.navn, submenu1.navn1, submenu2.navn2, submenu3.navn3 FROM hovedmenu LEFT JOIN ((submenu1 LEFT JOIN submenu2 ON submenu1.ID1 = submenu2.ID1) LEFT JOIN submenu3 ON submenu2.ID2 = submenu3.ID2) ON hovedmenu.ID = submenu1.IDh;"
Du kan lave en tabel med felterne id, parentid og name:
id parentid name 1 0 Mobil --> Mobil er et rodelement, dvs. parentid = 0 2 0 Hardware --> Hardware er også et rodelement 3 1 Nokia --> Nokias hører under Mobil, dvs. parentid = 1 4 3 U/ Abon --> U/ Abons hører under Nokia, dvs. parentid = 3 osv.
Parentid er en anden posts id. Hvis en post har parentid = 0 er det et rodelement - og ellers er det altså et element under et andet element.
Så kan du lave en rekursiv procedure, der udskriver alle elementer:
Sub writeElements(pid,level) Dim rs, strSql strSql = "SELECT * FROM table WHERE parentid=" & pid Set rs = Conn.Execute(strSql) If Not rs.Eof Then Do While Not rs.Eof Response.Write "<div style=""margin-left:" & 15 * level & "px"">" Response.Write rs("name") Response.Write "</div>" WriteElements rs("id"), level + 1 'udskriv alle elementer under dette rs.MoveNext Loop End If rs.Close Set rs = Nothing End Sub
Kald proceduren sådan her:
<body> <% Dim Conn Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sti_til_din_db writeElements 0,0 Conn.Close Set Conn = Nothing %> </body>
Næh, det er skam meget nemmere. Sciptet ovenfor laver et "træ" med alle elementer, men hvis man skal klikke sig igennem, gøres det sådan her:
Sub writeElements(pid) Dim rs, strSql strSql = "SELECT * FROM table WHERE parentid=" & pid Set rs = Conn.Execute(strSql) If Not rs.Eof Then Do While Not rs.Eof Response.Write "<a href=""denne_sides_navn.asp?showsub=" & rs("id") & """>" Response.Write rs("name") & "</a><br>" rs.MoveNext Loop End If rs.Close Set rs = Nothing End Sub
Kald proceduren sådan her:
<body> <% Dim Conn, intSub If IsEmpty(Request("showsub")) Then intSub = 0 Else intSub = Request("showsub") End If Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sti_til_din_db writeElements intSub Conn.Close Set Conn = Nothing %> </body>
edutasia> Altså det var tæt på, men det jeg ville have vare man som standard ser alle 0 grupper.
Når man så trykker på dem kommer næste undergrupper, og trykker man så en af dem kommer dens undergrupper osv osv osv... så man hele tiden kan se hvor man er henne af i grupperne.
Så ikke lige din kommentar - men skidt, det tog heller ikke så lang tid. Her er et komplet eksempel. Det eneste, du skal ændre, er de to konstanter STR_DB og STR_TB, som er hhv. navnet på databasen og navnet på tabellen.
Håber, det er noget i denne dur, du efterspørger:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <% Const STR_DB = "db.mdb" Const STR_TB = "tbElements"
Sub writeElements(pid,level) Dim rs, rs2, intCount, strSql, boolHasChildren strSql = "SELECT * FROM " & STR_TB & " WHERE parentid=" & pid Set rs = Conn.Execute(strSql) If Not rs.Eof Then Do While Not rs.Eof boolHasChildren = False strSql = "SELECT Count(*) AS intCount FROM " & STR_TB & " WHERE parentId=" & rs("id") Set rs2 = Conn.Execute(strSql) If rs2("intCount") > 0 Then boolHasChildren = True rs2.Close Set rs2 = Nothing If boolHasChildren Then Response.Write "<a href=""#"" onclick=""toggleNode(" & rs("id") & ")"">" & rs("name") & "</a><br>" Response.Write "<div id=""cont" & rs("id") & """ style=""margin-left:" & 15 * (level+1) & "px; display:none"">" WriteElements rs("id"), level + 1 'udskriv alle elementer under dette Response.Write "</div>" Else Response.Write rs("name") & "<br>" End If rs.MoveNext Loop End If rs.Close Set rs = Nothing End Sub %> <HTML> <HEAD> <TITLE>Tælletræ</TITLE> <SCRIPT LANGUAGE="JavaScript"> function toggleNode(intNd) { var srcElm = event.srcElement; var coll = document.getElementsByTagName('a'); for (var i=0; i<coll.length;i++) { if (coll[i] == srcElm) srcElm.style.fontWeight = 'bold'; else coll[i].style.fontWeight = 'normal'; } var elm = document.getElementById('cont' + intNd); elm.style.display = (elm.style.display == 'none') ? 'block' : 'none'; } </SCRIPT> </HEAD> <BODY> <% Dim Conn Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(".") & "\" & STR_DB writeElements 0,0 Conn.Close Set Conn = Nothing %> </HTML>
Nu gik dit spørgsmål sådan set på, hvordan man laver uendelige grupper i en MS Access database - og det fik du svar på. Hvad der i øvrigt skal være af funktionalitet i løsningen, før den kan accepteres, bør du fremover sørge for at beskrive allerede i dit spørgsmål - ellers spilder du folks tid :@
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.