15. maj 2003 - 13:36Der er
12 kommentarer og 1 løsning
Uendelig løkke
Jeg har et lile problem med en uendelig løkke, der bliver ved med at være der. Jeg har en tabel med en liste over kategorier. Hver kategori har et "id", et "name" og en "parent". I øjeblikket er der kun to poster i tabellen. Den første post har "id"=1, name="test" og "parent"=999999 Den anden post har "id"=2, name="test2" og "parent"=1
Hvorfor kommer jeg så ind i en uendelig løkke, når jeg kører følgende med intCurrent=2 ???????
while not intCurrent = 999999 objRS.moveFirst While Not objRS.EOF if objRS("id") = intCurrent then intCurrent = objRS("parent") Redim Preserve arrPath(intCount+1) arrPath(intCount) = objRS("name") intCount= intCount + 1 end if objRS.MoveNext Wend wend
objRS.moveFirst while not intCurrent = 999999 While Not objRS.EOF if objRS("id") = intCurrent then intCurrent = objRS("parent") Redim Preserve arrPath(intCount+1) arrPath(intCount) = objRS("name") intCount= intCount + 1 end if objRS.MoveNext Wend wend
umiddelbart ser det ud til at være stavet rigtigt, og med hensyn til at flytte objRS.moveFirst, vil det ikke løse problemet, da vi ønsker at køre recordsettet igennem indtil intCurrent=999999, dvs vi skal starte forfra flere gange.
Jeg lavede lige en lille test med: intCurrent=2 intCount=0 Dim arrpath() while not intCurrent = 999999 objRS.moveFirst While Not objRS.EOF if objRS("id") = intCurrent then intCurrent = objRS("parent") Redim Preserve arrPath(intCount+1) arrPath(intCount) = objRS("name").Value intCount= intCount + 1 end if objRS.MoveNext Wend wend for i=lbound(arrPath) to ubound(arrPath) Response.Write "<br>" & arrPath(i) next
Det kunne selvfølgelig også være noget andet på siden.
Prøv at sætte en tæller ind som stopper den.
i=0 while not intCurrent = 999999 and i<10 objRS.moveFirst While Not objRS.EOF if objRS("id") = intCurrent then intCurrent = objRS("parent") Redim Preserve arrPath(intCount+1) arrPath(intCount) = objRS("name").Value intCount= intCount + 1 end if objRS.MoveNext Wend i=i+1 wend Response.Write i
<% dim strQ, objRS, intUndock, strPath, intCurrent, arrPath(), intCount, intI
Function listCategories() strQ = "SELECT * FROM categories ORDER BY name" Set objRS = objConnect.Execute(strQ)
intUndock = request.QueryString("undock")
intCount = 0 if not intUndock="" then intCurrent = intUndock while not intCurrent = 999999 objRS.moveFirst While Not objRS.EOF if objRS("id") = intCurrent then intCurrent = objRS("parent") Redim Preserve arrPath(intCount+1) arrPath(intCount) = objRS("name") intCount= intCount + 1 end if objRS.MoveNext Wend wend For intI=ubound(arrPath) to lbound(arrPath) Step -1 response.write(arrPath(intI) & "<br>") next else intUndock = 999999 end if
objRS.moveFirst While Not objRS.EOF if objRS("parent") = intUndock then response.write(objRS("id") & " - " & objRS("name") & " - " & objRS("parent") & " - " & objRS("creator") & " - " & objRS("created") & " - " & objRS("description") & " - " & objRS("public") & "<br>") end if objRS.MoveNext Wend
Hvis der ellers er nogen der kan overskue det problem vi forsøger at løse ved hjælp af denne kode, må i meget gerne komme med helt andre forslag til hvordan det kan gøres! :-)
intCurrent starter ikke som et tal, så den vil aldrig være lig indholdet af feltet.
intUndock = request.QueryString("undock") if IsNumeric(intUndock) then intUndock=cLng(intUndock) else intUndock=0 end if intCount = 0 if intUndock<>0 then intCurrent = intUndock while not intCurrent = 999999
mySQL har det ikke godt med sub-selects, og understøtter ikke stored-procedures/triggers (endnu), så den eneste anden løsning ville være at lave en længere række selects. Du kan dog få det til at gå en del hurtigere ved kun at udvælge præcis de felter du skal bruge, i stedet for bare *.
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.