webForumDet fria alternativet

Rekursiv subfunktion ger felmeddelande '80020009'

ASP

4 svar · 269 visningar · startad av Brimba

Medlem sedan dec. 19995 874 inlägg
Frågan#1
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.

Någon som har några tips på lösningar?

------------------
Mvh
Patrik aka Brimba

Medlem sedan dec. 19991 072 inlägg
#2

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".

------------------
Fredrik Klarqvist
f.klarqvist@spray.se
http://server.webwerkstaden.se/fredde/

Medlem sedan dec. 19995 874 inlägg
#3
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.

Någon som har lite tips?

------------------
Mvh
Patrik aka Brimba

[Redigerat av Brimba den 04 feb 2002]

Medlem sedan dec. 19996 721 inlägg
#4

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," ")," ","&nbsp;") & 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.

[Redigerat av emission den 04 feb 2002]

Medlem sedan dec. 19995 874 inlägg
#5

tråden stängs :)

Tack för alla tips

------------------
Mvh
Patrik aka Brimba

267 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)