webForumDet fria alternativet

Skriv ut trädstruktur?

ASP

20 svar · 1 017 visningar · startad av jimpa

Medlem sedan jan. 2001361 inlägg
Frågan#1

Hej

Jag har två tabeller med följande struktur:

Categori
-------
CatID
CatName

Forum
--------
ForumID
ForumParentID
CatID
ForumName

Meningen är att man ska kunna ha obegränsat kategorier och forum och för varje forum ska man även kunna lägg till ett eller flera underforum

Problemet blir ju nu hur man ska kunna lista alla kategorier med tillhörande forum och underforum.

Är det någon som har provat på något liknande o har en lösning på detta?

MVH,
Jimpa

Medlem sedan dec. 2004736 inlägg
#2

Börja med att loopa igenom alla kategorier, och för varje kategori plockar du ut alla knutna forum, Forum.CatID = Category.CatID. Sen, för varje forum, plockar du ut alla forum där ForumParentID = ForumID.

Medlem sedan jan. 2001361 inlägg
#3

Tack för dit svar!

Men jag förstår inte riktigt hur det ska gå till... har du nåt exempel?

Resultatet ska exempelvis bli:

Categori 1
 -Forum1
    -Sub Forum
       -Sub sub forum
       -Sub sub forum
          -Sub sub sub forum
 -Forum2
    -Sub Forum
       -Sub sub forum
       -Sub sub forum
          -Sub sub sub forum
Categori 2
 -Forum3
    -Sub Forum
       -Sub sub forum
       -Sub sub forum
          -Sub sub sub forum
 -Forum4
    -Sub Forum
       -Sub sub forum
       -Sub sub forum
          -Sub sub sub forum
Medlem sedan nov. 20017 144 inlägg
#4

Hej,
sök på rekursiv eller rekursion i detta forum så kommer du hitta det du söker.

Medlem sedan aug. 20039 340 inlägg
#5

Ledel skrev:

Börja med att loopa igenom alla kategorier, och för varje kategori plockar du ut alla knutna forum, Forum.CatID = Category.CatID. Sen, för varje forum, plockar du ut alla forum där ForumParentID = ForumID.

Men, går det att göra i en och samma SQL-fråga? Om man måste köra en fråga per förgrening kan det ju bli ganska slött i längden.

Medlem sedan juni 20008 205 inlägg
#6

nitro2k01 skrev:

Men, går det att göra i en och samma SQL-fråga?

Nej, men man kan plocka fram alla rader ur tabellen, och sedan bygga upp ett träd i sitt program.

Medlem sedan jan. 2001361 inlägg
#7

Jesper T skrev:

Hej,
sök på rekursiv eller rekursion i detta forum så kommer du hitta det du söker.

Jag sökte på det och läste igenom trådarna men jag fattar inte... Ingen som har ett lite exempel kod hur man göra detta?

Medlem sedan juni 20019 519 inlägg
#8

jimpa skrev:

Jag sökte på det och läste igenom trådarna men jag fattar inte... Ingen som har ett lite exempel kod hur man göra detta?

http://www.webforum.nu/showthread.php?p=1060933#post1060933 där är ett kod exempel när jag sökte på 'rekursiv' så hittade jag ett exempel.

Medlem sedan jan. 2001361 inlägg
#9

voigtann1 skrev:

http://www.webforum.nu/showthread.php?p=1060933#post1060933 där är ett kod exempel när jag sökte på 'rekursiv' så hittade jag ett exempel.

Tack! Den tråden missade jag!

Jag utgick från den koden o ändra lite. Jag har fått det att funka ganska bra :) Dock ett problem! Jag får inte indragen att stämma riktigt.

Någon som har en idé om hur man kan få till det?

Utskriften blir så här:

Category 1
Main Forum 1 (Category 1)
 Sub Forum 1 (Main Forum 1)
  Sub Sub Forum 1 (Sub Forum 1)
   Sub Sub Sub Forum 1 (Sub Sub Forum 1)
    Sub Sub Forum 2 (Sub Forum 1)
Category 2
Main Forum 2 (Category 2)
 Sub Forum 2(Main Forum 2)

Jag vill ha det så här:

Category 1
Main Forum 1 (Category 1)
 Sub Forum 1 (Main Forum 1)
  Sub Sub Forum 1 (Sub Forum 1)
   Sub Sub Sub Forum 1 (Sub Sub Forum 1)
  Sub Sub Forum 2 (Sub Forum 1)  <--------------------
Category 2
Main Forum 2 (Category 2)
 Sub Forum 2(Main Forum 2)
sub check(parentID,indrag)
  set rs1 = Conn.execute("SELECT ForumID, fName FROM tblForums WHERE fParentID = " & parentID & " ORDER BY fOrder ASC")
  do until rs1.eof
indrag = indrag + 1

   str = string(indrag, " ")
   str = replace(str, " ", "&nbsp;")
       response.write str
     response.write "" & rs1("fName") & "</a><br>"

    check rs1("ForumID"), indrag
  rs1.movenext
  loop
end sub

set rs2 = Conn.execute("SELECT CategoryID, CatTitle FROM tblCategories ORDER BY CatOrder ASC")
  arrRS = rs2.GetRows() 
 
For i = 0 To Ubound(arrRS, 2)
 
 Response.write "<b>" & arrRS(1,i) & "</b><br>"

set rs = Conn.execute("SELECT ForumID, fName FROM tblForums WHERE fParentID = 0 AND fCategoryID = " & arrRS(0,i) & " ORDER BY fOrder ASC")
do until rs.eof

   response.write rs("fName") & "</a><br>"

  check rs("ForumID"),0 
rs.movenext
loop

Next
Medlem sedan juni 20008 205 inlägg
#10

Tycker det är vettigare att använda nästlade listor istället.

sub check(parentID)
  set rs1 = Conn.execute("SELECT ForumID, fName FROM tblForums WHERE fParentID = " & parentID & " ORDER BY fOrder ASC")
  if rs1.RecordCount <> 0 then: 
    response.write "<ul>"
    do until rs1.eof
      response.write "<li><a href=""..."">" & Server.HTMLEncode(rs1("fName")) & "</a>"
      check rs1("ForumID")
      response.write "</li>" 
      rs1.movenext
    loop
    response.write "</ul>"
  endif
end sub
Medlem sedan jan. 2001361 inlägg
#11

Mycket bättre :)

Tusen tack för hjälpen!

Medlem sedan jan. 2001361 inlägg
#12

Dock en följd fråga!

Finns det något vettigt sett att skriva ut resultatet med indrag i en select lista? Misstänker att <ul> o <li> inte stöds då...

Medlem sedan juni 20019 519 inlägg
#13

<select> och <ul> är som du själv skriver helt skilda ting. ;) Du får använda koden du skrev ovan för en select + lite mer kod... ska se om man kan hitta en en lösning...

Medlem sedan juni 20019 519 inlägg
#14
sub check2(parentID)
	set rs1 = Conn.execute("SELECT ForumID, fName FROM tblForums WHERE fParentID = " & parentID & " ORDER BY fOrder ASC")
	If Not rs.EOF Then
		Do Until rs1.EOF
			If parentId > 0 Then
				Execute("indrag" & rs1("ForumID") & " = 1 + indrag" & parentId)
			End If
			str = string(eval("indrag" & parentId), " ")
			str = replace(str, " ", "-")
			Response.Write "<option value=""" & rs1("ForumID") & """>" & str & " " & Server.HTMLEncode(rs1("fName")) & "</option>"
			check2(rs1("ForumID"))
			rs1.MoveNext
		Loop
	End If
End Sub

(heter dock check2 så du kan behålla check-sub funktionen).

set rs2 = Conn.execute("SELECT CategoryID, CatTitle FROM tblCategories ORDER BY CatOrder ASC")
arrRS = rs2.GetRows()

Response.Write "<select name=""forum"">"
For i = 0 To Ubound(arrRS, 2)
	set rs = Conn.execute("SELECT ForumID, fName FROM tblForums WHERE fParentID = 0 AND fCategoryID = " & arrRS(0,i) & " ORDER BY fOrder ASC")
	do until rs.eof
 		check2 rs("ForumID")
		rs.movenext
	loop
Next
Response.Write "</select>"
Medlem sedan jan. 2001361 inlägg
#15

Snyggt!
Går det även att få med 'Main Forum' och kategorierna i listan?

Medlem sedan juni 20019 519 inlägg
#16

ja... ovanför set rs.... kan du skriva:

Response.Write "<option value="" & arrRS(0,i) & "">" & arrRS(1,i) & "</option>"

Det är ju inte så svårt att läsa av koderna från samtliga som har postat i denna tråd att snickra ihop det själv dock ;)

Dock så vet jag inte riktigt hur du har tänkt att lösa det i ett längre flöde när du ska spara data. då "huvud-topic" IDt kan vara samma id som en av dina forum.

Medlem sedan jan. 2001361 inlägg
#17

Nej, det sista borde jag ju klarat själv :x

Dock så vet jag inte riktigt hur du har tänkt att lösa det i ett längre flöde när du ska spara data. då "huvud-topic" IDt kan vara samma id som en av dina forum.

Hur menar du nu :P

Medlem sedan juni 20019 519 inlägg
#18

tblCategorys har 3 poster med ID:
1, 2 och 3
och tblForums har 11 poster med IDn:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 och 11.
DVS det kommer att bli en liten konflikt med tanke av 3x2 av dina totala poster av 11+3 = 14 st som har samma "value" i sin option. Du får komma på en lösning som behandla tblCategorys och tblForums vval.

Ett förslag är kanske ha för tblCategorys idn: value="cat_<nummer från tblCategory>"...

Medlem sedan jan. 2001361 inlägg
#19

För tillfället kommer jag inte få något problem med det då kategorierna bara står som en <optgroup>
Bara forumen kommer att kunna bli valda och dom har ju unika idn!

Medlem sedan juni 20019 519 inlägg
#20

ta bort value saken från kategori då ;) så löser det sig.

259 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)