21. februar 2005 - 08:54Der er
42 kommentarer og 1 løsning
rekursiv løkke
Hej Eksperter...
Jeg står overfor et kæmpe problem...
Jeg er igang med at lave noget projektarbejde til skolen, og i dette er jeg gået i gang med at lave siderne i database.
I min base har jeg en tabel der hedder page og den ser sådan ud: id - menu - context - order - sub - placering
Dem jeg skal bruge er dog id, menu og sub. Feltet sub bruger jeg til at skrive et id på en side, som den aktuelle side skal ligge sig til, men hvis den side også er en underside, så viser den det ikke på min sitemap
Jeg er så igang med at lave en sitemap, men kan ikke få den til at virke.. Den viser kun et niveau og ikke alle de niveauer som der er.. hvordan gør jeg det ?
Hvis du tager udgangspunkt i den funktion, jeg viste dig, så kan du omskrive den sådan og dermed få styr på indrykningen:
Function Threads(intID, AntalIndryk) AntalIndryk = AntalIndryk + 1 For m = 1 to Ubound(arrID) ' Hvis svar til det indlæg som funktionen er kaldt med If Cint(arrRE(m)) = Cint(intID) Then ' Tilføj til liste og kald funktionen for at undersøge for svar Threads = Threads & "<br>" For i = 0 To AntalIndryk Threads = Threads & " " Next Threads = Threads & arrSU(m) & "<br>" & Threads(arrID(m), AntalIndryk) End If Next AntalIndryk = AntalIndryk - 1 End Function
Du kan slet ikke bruge din kode, hvis det skal være en rekursiv funktion. Du skal have ombygget din tabel lidt til at indeholde minimum følgende kolonner (igen med udgangspunkt i HTML's eksempel:
ID (id på denne side) RID (id på overliggende side - hovedsiderne sættes til 0) Subject (navn på side)
Nu antager jeg så, at tabellen "page" er designet som i eksemplet. Prøv følgende:
' Hent data fra databasen Set rsEntries = Rs.Execute("SELECT ID, sub, menu FROM page ORDER BY [order]")
Do ' Gem data som kommasepareret liste arrID = arrID & "," & rsEntries("ID") arrRE = arrRE & "," & rsEntries("sub") arrSU = arrSU & "," & rsEntries("menu") rsEntries.MoveNext Loop while not rsEntries.eof
' Lav arrays med data arrID = Split(arrID,",") arrRE = Split(arrRE,",") arrSU = Split(arrSU,",")
Rs.Close
' Funktion som undersøger for svar Function Threads(intID, AntalIndryk) AntalIndryk = AntalIndryk + 1 For m = 1 to Ubound(arrID) ' Hvis svar til det indlæg som funktionen er kaldt med If Cint(arrRE(m)) = Cint(intID) Then ' Tilføj til liste og kald funktionen for at undersøge for svar For i = 0 To AntalIndryk Threads = Threads & " " Next Threads = Threads & arrSU(m) & "<br>" & Threads(arrID(m), AntalIndryk) End If Next AntalIndryk = AntalIndryk - 1 End Function
' Kald funktionen med alle hovedindlæg Response.Write Threads(0, 0)
strSQL = "SELECT ID, sub, menu FROM page ORDER BY [order]" Set rsEntries = connection.Execute(strSQL)
Do ' Gem data som kommasepareret liste arrID = arrID & "," & rsEntries("ID") arrRE = arrRE & "," & rsEntries("sub") arrSU = arrSU & "," & rsEntries("menu") rsEntries.MoveNext Loop while not rsEntries.eof
' Lav arrays med data arrID = Split(arrID,",") arrRE = Split(arrRE,",") arrSU = Split(arrSU,",")
' Funktion som undersøger for svar Function Threads(intID, AntalIndryk) AntalIndryk = AntalIndryk + 1 For m = 1 to Ubound(arrID) ' Hvis svar til det indlæg som funktionen er kaldt med If Cint(arrRE(m)) = Cint(intID) Then ' Tilføj til liste og kald funktionen for at undersøge for svar For i = 0 To AntalIndryk Threads = Threads & " " Next Threads = Threads & arrSU(m) & "<br>" & Threads(arrID(m), AntalIndryk) End If Next AntalIndryk = AntalIndryk - 1 End Function
' Kald funktionen med alle hovedindlæg Response.Write Threads(0, 0)
Der er lige to ting jeg gerne vil have rettet :-) 1: Den rykker hovedsiderne ind også.. det skal kun være undersiderne der skal rykkes ind 2: Den skriver ikke "-" ud for undersiderne
sitemappen skal se sådan ud: Hovedside Hovedside - Underside - Underside - Underside på underside - Underside - Underside på underside - Underside på underside på underside - Underside Hovedside Hovedside
' Funktion som undersøger for svar Function Threads(intID, AntalIndryk) AntalIndryk = AntalIndryk + 1 For m = 1 to Ubound(arrID) ' Hvis svar til det indlæg som funktionen er kaldt med If Cint(arrRE(m)) = Cint(intID) Then ' Tilføj til liste og kald funktionen for at undersøge for svar If Cint(intID) > 0 Then For i = 1 To AntalIndryk Threads = Threads & " - " Next End If Threads = Threads & arrSU(m) & "<br>" & Threads(arrID(m), AntalIndryk) End If Next AntalIndryk = AntalIndryk - 1 End Function
' Funktion som undersøger for svar Function Threads(intID, AntalIndryk) AntalIndryk = AntalIndryk + 1 For m = 1 to Ubound(arrID) ' Hvis svar til det indlæg som funktionen er kaldt med If Cint(arrRE(m)) = Cint(intID) Then ' Tilføj til liste og kald funktionen for at undersøge for svar If Cint(intID) > 0 Then For i = 1 To AntalIndryk Threads = Threads & " " Next Threads = Threads & "- " End If Threads = Threads & arrSU(m) & "<br>" & Threads(arrID(m), AntalIndryk) End If Next AntalIndryk = AntalIndryk - 1 End Function
Jeg har i min base en kolonne som hedder placering. I den har jeg en tal værdi. Meningen er at hvis du kigger her: http://smykker.nielsenmand.dk så er der to menuer.. hvis placering=1 er menuen i toppen og er placering=2 så er den i midten... Jeg prøvede at eksperimentere lidt men det gik ikke så godt.. jeg ville gerne have den til at lave min sitemap sådan her:
strSQL = "SELECT ID, sub, menu, placering FROM page ORDER BY [order]" Set rsEntries = connection.Execute(strSQL)
Do ' Gem data som kommasepareret liste arrID = arrID & "," & rsEntries("ID") arrRE = arrRE & "," & rsEntries("sub") arrSU = arrSU & "," & rsEntries("menu") arrPL = arrPL & "," & rsEntries("placering") rsEntries.MoveNext Loop while not rsEntries.eof
' Lav arrays med data arrID = Split(arrID,",") arrRE = Split(arrRE,",") arrSU = Split(arrSU,",") arrPL = Split(arrPL,",")
' Funktion som undersøger for svar Function Threads(intID, AntalIndryk, Placering) AntalIndryk = AntalIndryk + 1 For m = 1 to Ubound(arrID) ' Hvis svar til det indlæg som funktionen er kaldt med If Cint(arrRE(m)) = Cint(intID) And Cint(arrPL(m)) = Cint(Placering) Then ' Tilføj til liste og kald funktionen for at undersøge for svar If Cint(intID) > 0 Then For i = 2 To AntalIndryk Threads = Threads & " " Next Threads = Threads & "- " End If Threads = Threads & arrSU(m) & "<br>" & Threads(arrID(m), AntalIndryk, Placering) End If Next AntalIndryk = AntalIndryk - 1 End Function
' Funktion som undersøger for svar Function Threads(intID, AntalIndryk, Placering) AntalIndryk = AntalIndryk + 1 For m = 1 to Ubound(arrID) ' Hvis svar til det indlæg som funktionen er kaldt med If (Cint(arrRE(m)) = Cint(intID) And Cint(intID) > 0) Or (Cint(arrPL(m)) = Cint(Placering) And Cint(intID) = 0) Then ' Tilføj til liste og kald funktionen for at undersøge for svar If Cint(intID) > 0 Then For i = 2 To AntalIndryk Threads = Threads & " " Next Threads = Threads & "- " End If Threads = Threads & arrSU(m) & "<br>" & Threads(arrID(m), AntalIndryk, Placering) End If Next AntalIndryk = AntalIndryk - 1 End Function
Fejltype: Der opstod en Microsoft VBScript-kørselsfejl (0x800A01C2) Antallet af argumenter er forkert eller egenskabstildelingen er ugyldig: 'Threads' /modul/sitemap.asp, line 44
' Hent data fra databasen strSQL = "SELECT ID, sub, menu FROM page ORDER BY [order]" Set rsEntries = connection.Execute(strSQL)
Do ' Gem data som kommasepareret liste arrID = arrID & "," & rsEntries("ID") arrRE = arrRE & "," & rsEntries("sub") arrSU = arrSU & "," & rsEntries("menu") rsEntries.MoveNext Loop while not rsEntries.eof
' Lav arrays med data arrID = Split(arrID,",") arrRE = Split(arrRE,",") arrSU = Split(arrSU,",")
' Funktion som undersøger for svar Function Threads(intID, AntalIndryk, Placering) AntalIndryk = AntalIndryk + 1 For m = 1 to Ubound(arrID) ' Hvis svar til det indlæg som funktionen er kaldt med If (Cint(arrRE(m)) = Cint(intID) And Cint(intID) > 0) Or (Cint(arrPL(m)) = Cint(Placering) And Cint(intID) = 0) Then ' Tilføj til liste og kald funktionen for at undersøge for svar If Cint(intID) > 0 Then For i = 2 To AntalIndryk Threads = Threads & " " Next Threads = Threads & "- " End If Threads = Threads & arrSU(m) & "<br>" & Threads(arrID(m), AntalIndryk, Placering) End If Next AntalIndryk = AntalIndryk - 1 End Function
' Kald funktionen med alle hovedindlæg Response.Write Threads(0, 0)
' Hent data fra databasen strSQL = "SELECT ID, sub, menu FROM page ORDER BY [order]" Set rsEntries = connection.Execute(strSQL)
Do ' Gem data som kommasepareret liste arrID = arrID & "," & rsEntries("ID") arrRE = arrRE & "," & rsEntries("sub") arrSU = arrSU & "," & rsEntries("menu") rsEntries.MoveNext Loop while not rsEntries.eof
' Lav arrays med data arrID = Split(arrID,",") arrRE = Split(arrRE,",") arrSU = Split(arrSU,",")
' Funktion som undersøger for svar Function Threads(intID, AntalIndryk, Placering) AntalIndryk = AntalIndryk + 1 For m = 1 to Ubound(arrID) ' Hvis svar til det indlæg som funktionen er kaldt med If (Cint(arrRE(m)) = Cint(intID) And Cint(intID) > 0) Or (Cint(arrPL(m)) = Cint(Placering) And Cint(intID) = 0) Then ' Tilføj til liste og kald funktionen for at undersøge for svar If Cint(intID) > 0 Then For i = 2 To AntalIndryk Threads = Threads & " " Next Threads = Threads & "- " End If Threads = Threads & arrSU(m) & "<br>" & Threads(arrID(m), AntalIndryk, Placering) End If Next AntalIndryk = AntalIndryk - 1 End Function
' Kald funktionen med alle hovedindlæg Response.Write Threads(0, 0, 1) Response.Write "<br><br>" Response.Write Threads(0, 0, 2)
closeConn() %>
Min fejl: Fejltype: Der opstod en Microsoft VBScript-kørselsfejl (0x800A000D) Typer stemmer ikke overens: 'arrPL' /modul/sitemap.asp, line 29
strSQL = "SELECT ID, sub, menu, placering FROM page ORDER BY [order]" Set rsEntries = connection.Execute(strSQL)
Do ' Gem data som kommasepareret liste arrID = arrID & "," & rsEntries("ID") arrRE = arrRE & "," & rsEntries("sub") arrSU = arrSU & "," & rsEntries("menu") arrPL = arrPL & "," & rsEntries("placering") rsEntries.MoveNext Loop while not rsEntries.eof
' Lav arrays med data arrID = Split(arrID,",") arrRE = Split(arrRE,",") arrSU = Split(arrSU,",") arrPL = Split(arrPL,",")
' Funktion som undersøger for svar Function Threads(intID, AntalIndryk, Placering) AntalIndryk = AntalIndryk + 1 For m = 1 to Ubound(arrID) ' Hvis svar til det indlæg som funktionen er kaldt med If (Cint(arrRE(m)) = Cint(intID) And Cint(intID) > 0) Or (Cint(arrPL(m)) = Cint(Placering) And Cint(intID) = 0) Then ' Tilføj til liste og kald funktionen for at undersøge for svar If Cint(intID) > 0 Then For i = 2 To AntalIndryk Threads = Threads & " " Next Threads = Threads & "- " End If Threads = Threads & arrSU(m) & "<br>" & Threads(arrID(m), AntalIndryk, Placering) End If Next AntalIndryk = AntalIndryk - 1 End Function
' Funktion som undersøger for svar Function Threads(intID, AntalIndryk, Placering) AntalIndryk = AntalIndryk + 1 For m = 1 to Ubound(arrID) ' Hvis svar til det indlæg som funktionen er kaldt med If (Cint(arrRE(m)) = Cint(intID) And Cint(intID) > 0) Or (Cint(arrPL(m)) = Cint(Placering) And Cint(intID) = 0) Then ' Tilføj til liste og kald funktionen for at undersøge for svar If Cint(intID) > 0 Then For i = 2 To AntalIndryk Threads = Threads & " " Next Threads = Threads & "- " End If Threads = Threads & "<a href=""default.asp?pId=" & intID & """>" & arrSU(m) & "</a><br>" & Threads(arrID(m), AntalIndryk, Placering) End If Next AntalIndryk = AntalIndryk - 1 End Function
' Funktion som undersøger for svar Function Threads(intID, AntalIndryk, Placering) AntalIndryk = AntalIndryk + 1 For m = 1 to Ubound(arrID) ' Hvis svar til det indlæg som funktionen er kaldt med If (Cint(arrRE(m)) = Cint(intID) And Cint(intID) > 0) Or (Cint(arrPL(m)) = Cint(Placering) And Cint(intID) = 0) Then ' Tilføj til liste og kald funktionen for at undersøge for svar If Cint(intID) > 0 Then For i = 2 To AntalIndryk Threads = Threads & " " Next Threads = Threads & "- <a href=""default.asp?pId=" & intID & """>" & arrSU(m) & "</a><br>" & Threads(arrID(m), AntalIndryk, Placering) Else Threads = Threads & arrSU(m) & "<br>" & Threads(arrID(m), AntalIndryk, Placering) End If End If Next AntalIndryk = AntalIndryk - 1 End Function
Kan du hjælpe mig videre med denne funktion for flere point ? skal have lagt den ind i en tabel...
Synes godt om
Ny brugerNybegynder
Din løsning...
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.