Avatar billede thecodeman Nybegynder
15. maj 2003 - 13:36 Der 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
Avatar billede mm12010 Nybegynder
15. maj 2003 - 13:46 #1
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
Avatar billede mortrr Praktikant
15. maj 2003 - 13:58 #2
Jeg ville gætte på en stavefejl.
Kontroller at den intCurrent du sætter til 2 er stavet rigtigt.
Avatar billede thecodeman Nybegynder
15. maj 2003 - 14:07 #3
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.
Avatar billede mortrr Praktikant
15. maj 2003 - 14:13 #4
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

Og det kører uden problemer
Avatar billede mortrr Praktikant
15. maj 2003 - 14:14 #5
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
Avatar billede thecodeman Nybegynder
15. maj 2003 - 14:17 #6
ok, jeg tror i er nødt til at se hele koden:

<%
  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

    objRS.close
    Set objRS = Nothing
  end Function
%>
Avatar billede thecodeman Nybegynder
15. maj 2003 - 14:30 #7
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! :-)
Avatar billede mortrr Praktikant
15. maj 2003 - 15:25 #8
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
Avatar billede mortrr Praktikant
15. maj 2003 - 15:27 #9
I finder tilsyneladende frem til en posts position i et hieraki.
Det er en noget tung metode i bruger til det.

Hvilken database skal det køre på?
Avatar billede thecodeman Nybegynder
15. maj 2003 - 15:28 #10
Så er problemet løst, det var bare lidt string/integer forvirring.

løsningen var at skrive

    intUndock = Int(request.QueryString("undock"))
i stedet for
    intUndock = request.QueryString("undock")

Tak for hjælpen;-)

ps. mortrr hvis du lige tilføjer et svar kan du få lidt point som tak for hjælpen.
Avatar billede thecodeman Nybegynder
15. maj 2003 - 15:31 #11
Det skal køre på en mySQL database.

Har du en nemmere måde at gøre det på?
Avatar billede thecodeman Nybegynder
15. maj 2003 - 15:32 #12
Vi så ikke dit svar før vi fandt vores løsning, men du har da fuldt ud fortjent pointene, så hvis du lige skriver et svar er de dine.
Avatar billede mortrr Praktikant
15. maj 2003 - 15:37 #13
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 *.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester