sub getMenu(intID)
SQLStmt = "SELECT fldLvl_id FROM tblLevel WHERE fldParentID = " & cLng(intID) & " Order by fldLvl_id ASC"
set rsMenu = connection.execute( SQLStmt )
while not rsMenu.eof
call getMenu(rsMenu(0))
response.write rsMenu(0) & "<br>" [red]rad 13[/red]
rsMenu.movenext
wend
end sub
Ger följande felmeddelande
error '80020009'
Exception occurred.
line 13
Om jag tar bort & "<br>" så blir felmeddelandet istället:
ADODB.Field error '80020009'
Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.
line 0
fältet fldLvl_id är räknare och fältet fldParentID är långt heltal.
Jag använder mig av en accessdatabas.
Jag har även provat att köra med if rsMenu.eof för att bara kolla, men det hjälper inte.
Hmm....jag antar att det är de dynamiska nivåerna du håller på med...
Jag gjorde själv ett test på exakt din kod utan att få något fel.
Hur många gånger anropas metoden "getMenu" totalt (innan du får felet)?
Att du får ett fel när du har lagt dit "<br>" kan ju bero på att den buffrar "response.write" varje gång och att bufferten till slut blir full. (det är ju lite farligt att använda just konkatunering i loop.ar.)...men det beror ju förstås på hur många ggr den går in där.
Sen är det kanske inte helt optimalt att använda recordsets i rekursiva loopar då det är mkt krävande att dra igång så många objekt i varandra (utan att stänga de med...).
När jag byggde min nivå-hanterare så hämtade jag ut all data med en fråga som jag la i en array. Sen skickade jag bara arrayen vidare i metod-anropet tillsammans med en räknare som sa var i arrayen jag var.
Prova att kolla hur många ggr metoden anropas, ta även bort "<br>" samt stäng ditt RS-obj. efter "wend", samt sätt till "nothing".
sub getMenu(intID)
Dim rsMenu
SQLStmt = "SELECT fldLvl_id FROM tblLevel WHERE fldParentID = " & intID
Set rsMenu = connection.execute(SQLStmt)
while not rsMenu.eof
call getMenu(rsMenu(0))
response.write rsMenu(0) & "<br>"
rsMenu.movenext
wend
rsMenu.close
Set rsMenu = Nothing
end sub
Det fungerade fint när jag dimmade rsMenu innanför subben.
Stänga det hade jag provat tidigare, det var alltså initieringen.
Men nu är problemet att den bara radar upp rubbet.
Den loopar igenom hela mitt RS ungefär. Samt den inre loopen.
Subfunktionen anropas 23 gånger
och while-satsen är true 22 gånger, och alltså körs den.
Jo, det fungerar nog bra, men det blir lite svårt att se resultatet i dess egentliga form.
call getMenu(0,0)
sub getMenu(intID,intIndent)
Dim rsMenu
SQLStmt = "SELECT fldLvl_id FROM tblLevel WHERE fldParentID = " & intID
Set rsMenu = connection.execute(SQLStmt)
while not rsMenu.eof
response.write replace(string(intIndent," ")," "," ") & rsMenu(0) & "<br>"
call getMenu(rsMenu(0),intIndent+1)
rsMenu.movenext
wend
rsMenu.close
Set rsMenu = Nothing
end sub
------------------
/emission If you see someone without a smiley, give them your colon.