webForumDet fria alternativet

Rekursiv funktion, hjälp!

ASP

10 svar · 617 visningar · startad av Fredde Mannen

Medlem sedan nov. 20014 054 inlägg
Frågan#1

Har nedanstående rekursiva funktion, dock funkar den bara fram till första barnet.

Den skriver ut avdelningar i ett förtag där topnoden är objektidforalder = NULL

								Sub Recursive(obsRs,ParentId, n)
									Set rs = obsRs
									rs.Filter = "ObjektIdForalder=" & ParentId							
									rs.Sort = "ObjektNamn"
									
									while not rs.eof
											response.write Writestring("&nbsp;",n) & rs.fields("ObjektNamn") & "<br />"
											' Response.Write "<option value=""" & rs.fields("ObjektId") & """>" & Writestring("&nbsp;",n) & rs.fields("ObjektNamn") & "</option>"											
											Recursive obsRs, rs.fields("ObjektId"), n + 1
									

											
											if not rs.eof then
												rs.movenext
											end if
									Wend
								End Sub
								
								' skriv ut avdelningar.
								Recursive obsRs,"NULL",0

Skrev om denna till ASP

function menu($child_of){        
        if (!isset($child_of)){
            $child_of = 0;
        }
        
        $SQL = "SELECT kategoriID, kategori, tkategoriID FROM kategorier WHERE tkategoriID = " . $child_of . "";        
        $result = mysql_query($SQL) or die(mysql_error());
        while ($data = mysql_fetch_array($result)){
            echo $data[1]."<br>";
            menu($data[0]);
        }
 } 
    
echo menu(0);

Med skillnaden att jag skickar med ett recordset som innehåller alla poster, som jag sedan filterar med Filter efter barnen..

Men den funkar inte. Kommenterar jag bort delen:

Recursive obsRs, rs.fields("ObjektId"), n + 1

Så skriver den ut alla barn i första nivån under föräldern med NULL som objektidforalder, dvs företagsnamnet.

Gaargh.. vad säger ni?

Medlem sedan mars 20007 896 inlägg
#2
n = n + 1
Recursive obsRs, rs.fields("ObjektId"), n
Medlem sedan nov. 20014 054 inlägg
#3

det har ingen betydelse i detta fall... den skriver bara ut första barnet, trots att root har fler barn en så... sen har givetvis en del av dessa barn ex. antal barn...

vad missar jag...

Medlem sedan dec. 20025 483 inlägg
#4

Är det inte så att objRs skickas som referens i subanropen, och att då samtliga operationer på det inte sker på någon lokal kopia utan "hänger med", så att säga. T.ex. begränsas väl urvalet i recordsetet mer och mer ju fler gånger du skriver till Filter.

Medlem sedan nov. 20014 054 inlägg
#5

det kan ju iofs stämma.. , tänkte om jag använde:

Set rs = obsRs

Och sedan lägger obsRs som referens i nästa anrop, att den rs skulle vara en lokalkopia av obsRs som jag kan göra filter på, utan att det skadar obsRs så att säga. :OO

Medlem sedan mars 20041 505 inlägg
#6

"Set" skapar bara en pekare till ett objekt i minnet.
Det går tyvärr inte att kopiera ett objekt så det blir två.
rs och obsRs pekar bara på exakt samma objekt.

Medlem sedan nov. 20014 054 inlägg
#7

Troxy skrev:

"Set" skapar bara en pekare till ett objekt i minnet.
Det går tyvärr inte att kopiera ett objekt så det blir två.
rs och obsRs pekar bara på exakt samma objekt.

Ja men då förklarar det biffen... då måste jag modda det lite granna...

Medlem sedan nov. 20014 054 inlägg
#8

Trots moddningen, så ja, det blev inge bättre nu får jag felmeddelande med:

fel '80020009'

, och att den då skriver ut topnoden endast, sen ser man felet.

Och denna gång skickar jag med som referense det objekt som gör att jag kan hämta
recordset på nytt för varje.. men men, det blev ju inte bättre.. :s

Kanske skulle kunna läsa igenom hela recordsetet till en javascript array, och använda javascript för att skriva ut trädet med avdelningarna... för detta blir jag inte klok på.

Nu ser rs ut så här:

Set rs = objStructure.GetStructure("ORGANISATION", organisationcode)

Där objStructure är ett server.objekt som är skrivet i VB och anropar procedurer från en sql-server.

server.objektet är det inget fel på, den returnerar det recordset som jag behöver, men något sker när den används rekursivt.

Nåja.. känns som att det är javascripts tur..

Medlem sedan mars 20007 896 inlägg
#9

Varför kan du inte använda en VBScript-array?

Medlem sedan nov. 20014 054 inlägg
#10

SPiN skrev:

Varför kan du inte använda en VBScript-array?

Nu skulle en smile med en hand som dras över ansiktet passa. :r

Medlem sedan nov. 20014 054 inlägg
#11

Det gick utan att använda en VBscript-array nu...

Sub Recur(parentid,level)
	Set obsRs = objStructure.GetStructure("ORGANISATION", organisationcode)
	obsRs.Filter = "ObjektIdForalder=" & parentid
	obsRs.Sort = "ObjektNamn"									 

	if obsRs.RecordCount > 0 then					
		if not obsRs.eof then
			Do until obsRs.eof									
				Response.Write "<option value=""" & obsRs.fields("ObjektId") & """>" & WriteString(level,"&nbsp;") & obsRs.fields("ObjektNamn") & "</option>"
				Recur obsRs.fields("ObjektId"), level + 1								
				
				if not obsRs.eof then
					obsRs.movenext
				end if
			Loop
		end if
										
	end if
End sub

Call Recur("NULL",0)

Detta funkade.. :e
Plockade bort alla referenser till objekt.

264 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)