webForumDet fria alternativet

Rekursiv funktionshjälp efterlyses

ASP

19 svar · 549 visningar · startad av Jesper T

Medlem sedan nov. 20017 144 inlägg
Frågan#1

Databasstruktur

[b]tbl links[/b]
-----------------------------------------------
l_id | l_parentid | l_linktext | l_linkurl
-----------------------------------------------

Jag skulle vilja få ut det så här:
Först alla länkar utan parentid

1 | 0 | Hem | index.asp
2 | 0 | Länkar | links.asp
3 | 0 | Kontakt | contact.asp

Sedan alla länkar som "pekar" mot ett id.
4 | 1 | Roliga saker | rs.asp
5 | 1 | Köp | buy.asp

6 | 2 | Våra länkar | olinks.asp
7 | 2 | Era länkar | ylinks.asp

osv.
Tips?

Medlem sedan dec. 20003 563 inlägg
#2
select * from tbl_links order by l_parentid asc

Eller har jag missförstått?

Medlem sedan dec. 200012 464 inlägg
#3

  sub tree(connection,parentid,level)
      dim rs
      set rs = connection.execute("select l_id,l_linktext, l_linkurl from tbl_links where parentid = " & parentid)
      while not rs.eof
            response.write replace(spaces(level)," ","-") & ">" & rs(1) & " " & rs(2) & "<br>"
            tree connection,rs(0),level+1
            rs.movenext
      wend 
  end sub
Medlem sedan maj 200010 687 inlägg
#4

Du Lars, ser att du återanvänder connectionobjektet. Tjänar man mycket prestanda på det?

Medlem sedan dec. 200012 464 inlägg
#5

Beror väl på. Det sägs att om man har en väldigt hög belastning så kan man tjäna på att inte återanvända. Det är nog ganska många faktorer som spelar in.

Medlem sedan nov. 20017 144 inlägg
#6

cyprys skrev:

select * from tbl_links order by l_parentid asc

Eller har jag missförstått?

Nästan.
Men jag kan inte loopa ut allt i en hög utan måste in med lite saker i mellan.
Det är till en javascriptmeny och principen är denna:

myMenu = new mainMenu('#FFFFFF', '#DFDFDF');

  myMenu.addMenuLink('Hem', 'index.asp');
  myMenu.addMenuLink('Kontakt', 'contact.asp');
  myMenu.addMenuLink('Länkar', 'links.asp');

myMenu = new subMenu('1', '#FFFFFF', '#888888');
  
  myMenu.addMenuLink('Roliga saker', 'rs.asp');
  myMenu.addMenuLink('Köp', 'buy.asp');  
  
myMenu = new subMenu('3', '#FFFFFF', '#888888');
  
  myMenu.addMenuLink('Våra länkar', 'olinks.asp');
  myMenu.addMenuLink('Era länkar', 'ylinks.asp');

Och det gör att jag inte heller kan använda LarsG´s sub heller, eftersom att den nästlar in "submenyerna" bland "grundlänkarna".

Medlem sedan nov. 20017 144 inlägg
#7

Tips?

Medlem sedan apr. 2001425 inlägg
#8

Kolla in skriptarkivet, där ligger en rekursiv lösning som borde vara till hjälp...

Medlem sedan nov. 20017 144 inlägg
#9

Nej, den du gjort liknar den LarsG visade.

Link 1 
Link 2
---Sub 2:1:1
---Sub 2:1:2
------Sub 2:2:1
Link 3

osv.
Jag skulle villja ha det:

Link 1 
Link 2
Link 3
Sub 2:1:1
Sub 2:1:2
Sub 2:2:1
Medlem sedan dec. 20003 563 inlägg
#10

Är inte min kod så?
Du kanske vill sortera såhär bara?

select * from tbl_links order by l_parentid asc, [b]I_id asc[/b]
Medlem sedan dec. 20003 563 inlägg
#11

Ahaaaa. Nu kanske jag förstår vad du menar.
Du vill jämföra parentID med det från posten innan.
Skulle de vara olika vill du skriva ut en extra rad i ditt javascriptscript?
Tillfälliga variablar känns som en god vän i dessa sammanhang, utifrån min ovanstående sql-sats.

dim sql, i, tmpParent
tmpParent = "0"
sql = "select * from tbl_links order by l_parentid asc, I_id asc"
set rs = conn.execute(sql)
i = 1
do until rs.eof

  if not tmpParent = "0" then
    ' Inte första raden
    if tmpParent = rs("l_parentId") then
      ' Den här posten tillhör samma parentId som posten innan
      ' Så den kan man kanske bara skriva ut
    else
      ' Denna post tillhör ett nytt parentId
      ' Här kanske vi lägger in en ny [i]new submenu[/i] samt skriver ut posten
    end if
  else
    ' Whohooooo Första raden!
    ' Lägga in vår [i]myMenu = new mainMenu('#FFFFFF', '#DFDFDF');[/i] här kanske?
  end if

i = i - -1
tmpParent = rs("l_parentId")
rs.moveNext
loop

Nu har jag lagt med en i-variabel som adderar 1 för varje loop. Du kan styra dess värde att överensstämma med det tal du behöver i new subMenu('1', '#F...

Medlem sedan nov. 20017 144 inlägg
#12

Ok, men det ända som händer är att denna del skrivs ut:

' Whohooooo Första raden!
    ' Lägga in vår myMenu = new mainMenu('#FFFFFF', '#DFDFDF'); här kanske?

(Lika många gånger som poster i menyn)

Medlem sedan dec. 20003 563 inlägg
#13
tmpParent = cInt(rs("l_parentId"))
Medlem sedan nov. 20017 144 inlägg
#14

Gjorde ingen skillnad.

Medlem sedan dec. 20003 563 inlägg
#15

Då låter vi den vara "id" istället.
Typen variant är väl underbar. :)

se redigering

Medlem sedan nov. 20017 144 inlägg
#16

Ok, funkar även med cInt nu.

Kvarstår nu ett problem...
Om det nu skall skrivas ut en submeny så skall även "positionen" anges.

(1)Båtar
(2)Bilar
(3)Flyg

Om det nu skall vara en submeny till "Bilar" så skall submenyn börja med 2
Är det sedan fler submenyer så skall det hela separeras med ett "i" med efterföljande position i submenyn. osv.
Tips?

Medlem sedan dec. 20003 563 inlägg
#17

Du kan ju stoppa in fler räknarvariabler.
subI som nollställs varje gång du byter submeny.
subICount som adderas + 1 för varje gång du byter submeny t.ex.

Vet inte riktigt hur du vill ha det men du har ju if-satserna klara i loopen för att styra flera olika variabler och räkna hur du vill egentligen.

Medlem sedan nov. 20017 144 inlägg
#18

Ok, här är ett exempel.
Jag har skrivit ut menyordningen(som även finns i källan).
Jag har lite svårt att få till submenyerna, antar att det inte är helt lätt... :)

Medlem sedan nov. 20017 144 inlägg
#19

Ok, jag skippar denna variant.
Tillbaka till ruta 1:

Går det med LarsG:s sub...

 sub tree(connection,parentid,level)
      dim rs
      set rs = connection.execute("select l_id,l_linktext, l_linkurl from tbl_links where parentid = " & parentid)
      while not rs.eof
            response.write replace(spaces(level)," ","-") & ">" & rs(1) & " " & rs(2) & "<br>"
            tree connection,rs(0),level+1
            rs.movenext
      wend 
  end sub

...att skapa ett litet system för att skriva ut hierarkien dynamiskt?
(Alltså så att det fetmarkerade skrivs ut.)
ex.

Länk[b]1[/b]
Länk[b]2[/b]
    Länk [b]2_1[/b]
    Länk [b]2_2[/b]
    Länk [b]2_3[/b]
        Länk [b]2_3_1[/b]
        Länk [b]2_3_2[/b]
Länk[b]3[/b]
    Länk [b]3_1[/b]
Länk[b]4[/b]
Medlem sedan nov. 20017 144 inlägg
#20

Fick lite hjälp på annat håll.

Sub tree(connection,parentid,level,ByVal numbers)
    Dim rs, count
    Set rs = connection.Execute("select l_id,l_linktext, l_linkurl from tbl_links where parentid = " & parentid)
    If Len(numbers)>0 Then numbers = numbers & "_"
    count = 1
    Do Until rs.EOF
        Response.Write String(level,"-") & ">" & rs(1) & " " & rs(2) & " " & numbers & count & "<br>"
        tree connection, rs(0), level + 1, numbers & count
        rs.Movenext
        count = count + 1
    Loop
End Sub
266 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)