webForumDet fria alternativet

while not-sats

20 svar · 545 visningar · startad av johannaloke

johannalokeMedlem sedan apr. 200393 inlägg
#1

Är det någon som vet vad det är för fel på nedanstående kod?

while not rs.Fields("fornamn") = "johanna"

Får detta felmeddelande:
Item cannot be found in the collection corresponding to the requested name or ordinal.

//Johanna

@ndersMedlem sedan juni 200032 969 inlägg
#2

Det brukar betyda att fältet du refererar till inte finns i recordsetet.

Mvh

johannalokeMedlem sedan apr. 200393 inlägg
#3

Det trodde jag också men det finns.
Är det inget fel i själva satsen syntax mässigt?
//Johanna

@ndersMedlem sedan juni 200032 969 inlägg
#4

Jag är osäker på om man kan skriva så, och det beror också på var någonstans i koden raden är placerad.

Kan du berätta lite mer vad du vill göra?

mvh

m_soderlundMedlem sedan sep. 20026 425 inlägg
#5

Ska koden göra ungefär detta: "så länge som ingen post där kolumnen Fornamn = Johanna finns, så loopar vi vidare och skriver ut massa grejor"?
I så fall är denna SQL-sats att föredra:

SELECT Fornamn,Efternamn,Alder FROM din_tabell WHERE Fornamn NOT = 'Johanna'
johannalokeMedlem sedan apr. 200393 inlägg
#6

Ska försöka förklara ;)

while-slingan tar fram ett antal strängar med förnamn och efternamn som tillsammans bildar en sökväg till där jag befinner mig i ett organisationsschema.
Varje namn i sökvägen ska sen vara en länk som snabbt tar mig tillbaka till en annan plats i organisationsschemat. Det är därför jag ställer nya frågor i while-satsen men använder samma recordSet. Jag vill loopa igenom tills jag kommer till den post som är överst i hierarkin (johanna).

SQLfraga = "SELECT fornamn, efternamn FROM tblOrg WHERE ID = " & valtID
set svar2 = Server.CreateObject("ADODB.Recordset") 
svar2.open SQLfraga, connection 

while not svar2.Fields("fornamn") = "johanna" 
   SQLfraga = "SELECT parentID FROM tblParents WHERE ID = " & nyvaltID
   svar2.close 'måste stängas för att kunna öppnas igen
   svar2.open SQLfraga, connection
   if not svar2.Fields("parentID").Value = empty then
      intParentID = svar2.Fields("parentID")
      SQLfraga = "SELECT fornamn, efternamn FROM tblOrg WHERE ID = " & intParentID
      svar2.close 'måste stängas för att kunna öppnas igen
      svar2.open SQLfraga, connection
      lank = svar2.Fields("fornamn") & " " & svar2.Field("efternamn") & " > " & lank 
      nyvaltID = intParentID
   end if
wend

Hoppas att det är ganska bra förklarat :q
//Johanna

mrblondeMedlem sedan aug. 20012 349 inlägg
#7

Du kna inte stänga ditt recordset för då funkar det inte, bättre att använda flera recordset då, det går ju utmärkt.

Jag har dock inte analyserat din kod, men den känns lite omständig...

SQLfraga = "SELECT fornamn, efternamn FROM tblOrg WHERE ID = " & valtID
set svar2 = Server.CreateObject("ADODB.Recordset") 
svar2.open SQLfraga, connection 

set svar3 = Server.CreateObject("ADODB.Recordset") 

while not svar2.Fields("fornamn") = "johanna" 
   SQLfraga = "SELECT parentID FROM tblParents WHERE ID = " & nyvaltID
   
   svar3.open SQLfraga, connection
   if not svar3.Fields("parentID").Value = empty then
      intParentID = svar3.Fields("parentID")
      SQLfraga = "SELECT fornamn, efternamn FROM tblOrg WHERE ID = " & intParentID
      svar3.close 'måste stängas för att kunna öppnas igen
      svar3.open SQLfraga, connection
      lank = svar3.Fields("fornamn") & " " & svar3.Field("efternamn") & " > " & lank 
      nyvaltID = intParentID
   end if
wend
svar2.close
johannalokeMedlem sedan apr. 200393 inlägg
#8

Tycker också den känns omständig. Men hittar ingen lösning just nu. Det som är om jag använder nya recordSet i whilen är att villkoret i whilen inte förändras. Och det måste det ju.

Anledningen till att jag stänger svar2 är för att jag inte får öppna det igen och ställa en ny fråga annars. Hittar ingen funktion för att ställa en ny fråga och använda samma recordSet utan att stänga och öppna. Men det finns kanske?

Jag har provat att lägga whilens villkor i en if-sats först i whilen men den hakar upp sig på samma sak då. Verkar som själva villkoret är fel *funderar*

//Johanna

johannalokeMedlem sedan apr. 200393 inlägg
#9

Det är kanske någon som har någon bra kod för att skriva ut sökvägar som länkar?

Vill tex kunna skriva så här:
Johanna > Kalle > Olle > Åsa

Varje namn ska vara en länk. Om jag klickar på Kalle ska sökvägen Johanna > Kalle bara visas.

Så som jag gjort det så laddar jag om samma fil och skickar med sökvägen in. Får problem när jag ska skapa den långa strängen för sökvägen.

//Johanna

mrblondeMedlem sedan aug. 20012 349 inlägg
#10

exakt hur ser tabellerna ut? Jag tror du måste skriva en rekursiv funktion, jag kan nog knåpa ihop något, men jag måste se tabellern och hur de hänger ihop.

UlfTMedlem sedan maj 20018 027 inlägg
#11

-> Johanna

Jag tror jag har hittat felet.

Varje gång du har kört "select fornamn, efternamn......" funkar "while not"-villkoret, eftersom fältet "fornamn" finns.

Men vad finns när du har kommit till den översta föräldern i din sökväg? Ja, där frågar du "select parentID...", och konstaterar att parentID är empty. Därmed ställer du ingen fler "select fornamn...."-fråga. Alltså finns inte fältet "fornamn" sista gången som du testar i "while not"-villkoret.

En liten nödlösning som skulle komma tillrätta med ditt problem, är att bryta sig ur "while"-loopen när du har fått att parentID=empty.

mrblondeMedlem sedan aug. 20012 349 inlägg
#12

Du får skriva en rekursiv funktion som gör detta till dig.

I det här exemplet förutsätter jag att johanna inte finns i tabellen tblparents. Jag har inte testat koden men principen borde fungera. Det hela är snabbt byggt med globala variabler vilket kanske inte är det vackraste....

dim rs, strOutput
set rs = Server.CreateObject("ADODB.Recordset")  'måste stängas för att kunna öppnas igen

Foo id 'id på den person som är längst ner i listan t ex Åsa i ditt exempel

Response.write strOutput 'här finns länkarna

Sub Foo(id)

sql = "select * from tblorg where id = " & id
set rs.open SQL, connection 
if not rs.eof then 
strOutput = " > " & rs("fornamn") & strOutput 'du får lägga till <a href mm själv
sql = "SELECT * from tblparents where id = " & id
rs.close
set rs.open SQL, connection 
if not rs.eof then
 Foo rs("parentid")
end if
end if
rs.close
end sub
johannalokeMedlem sedan apr. 200393 inlägg
#13

Tack allihopa!
Nu ska ja kika på era förslag så återkommer jag om jag har fler frågor ;)
//Johanna

johannalokeMedlem sedan apr. 200393 inlägg
#14

mrblonde!

Ett problem jag ser med <a href är att jag vill skicka med: sida.asp?sokvag=strOutput .
Men strOutput måste ju innehålla hela sökvägen innan jag vill skickar med den *tänker*
Har du någon idé på hur man löser det? Om du förstår vad jag menar *ler osäkert*
//Johanna

mrblondeMedlem sedan aug. 20012 349 inlägg
#15

nej du vill sända med id nummret för den personen som skall visas, du får rita upp den på nytt på nästa sida... *ler* Hur gammla är du och vart kommer du ifrån ;)

nog tramsat, så här borde det se ut, tycker jag

strOutput = " > <a href""sida.asp?id=" & rs("id") & """>" & rs("fornamn") & "</a>" & strOutput
johannalokeMedlem sedan apr. 200393 inlägg
#16

Jag vill rita upp hela sökvägen fram till där jag är i organisationsschemat. Med ditt exempel nu så får jag bara med en persons fornamn väl?

Jag vill att det ska funka som webforums sökväg! Kom jag på!
webForum > Webbrelaterade forum > Webbutveckling > ASP, VBScript > while not-sats

om jag nu klickar på Webbrelaterade forum så återstår bara:
webForum > Webbrelaterade forum

Kan man inte få den koden?! ;)
//Johanna

ps. var jag bor eller hur gammal jag är hör väl inte till asp *skrattar*

mrblondeMedlem sedan aug. 20012 349 inlägg
#17

Mitt exempel är en rekursiv funktion som anropar sig själv och skapar en sträng som blir precis som du vill ha den ända tills den kommer till en person som inte har någon post med ett parentid i tabbeln tblparents. Det är det fina med fisken att rekursiva funktioner gör just så :)

Jag har iofs inte testat koden, men tanken är att du låter funktionen anropa sig själv tills den inte kommer längre.

johannalokeMedlem sedan apr. 200393 inlägg
#18

Godmorgon mrblonde!

Hoppas jag får ställa fler frågor?!

Har provat att använda din rekursiva funktion. Med lite ändringar så har jag fått den att fungera nästan precis som jag vill.
Det som blir fel nu är att strängen med alla namnen blir baklänges. Istället för Johanna > Kalle > Olle > Åsa som jag vill ha det blir det Åsa > Olle > Kalle > Johanna.
Jag har provat att ändra hit och dit men ser inte hur jag ska få den att skriva den på det håll som jag vill.
Är inte så duktig på rekursiva funktioner så jag vet var felet ligger. Kan du möjligtvis hjälpa med det också?

Skickar med koden som jag har ändrat till nu. Recordsetet spökar lite också. Du ser var jag har kommenterat bort. Det gick inte att skapa det utanför funktionen. Och det vill inte riktigt stängas heller.

dim rs, str
'set rs = Server.CreateObject("ADODB.Recordset")  'måste stängas för att kunna öppnas igen
nyvaltID = valtID 
Foo nyvaltID 'id på den person som är längst ner i listan t ex Åsa i ditt exempel

Response.write ("str: " & str) 'här finns länkarna

sub Foo(nyvaltID)
	SQLfraga = "SELECT * FROM tblOrg WHERE ID = " & nyvaltID
	set rs = Server.CreateObject("ADODB.Recordset")
	'rs.close
	rs.open SQLfraga, connection 
	if not rs.eof then 
		str = str & " > "
		str = str & "<a href=johanna.asp?valtID="
		str = str & rs.Fields("ID")'nyvaltID
		str = str & ">"
		str = str & rs.Fields("fornamn") & " " & rs.Fields("efternamn")
		str = "</a>" & str
		
		SQLfraga = "SELECT * FROM tblParents WHERE ID = " & rs.Fields("ID")'nyvaltID
		rs.close
		rs.open SQLfraga, connection 
		if not rs.eof then
			 Foo(rs("parentID"))
		end if
	end if
	'rs.close
end sub

Tack på förhand!
//Johanna

mrblondeMedlem sedan aug. 20012 349 inlägg
#19

Eftersom vi bygger upp strängen baklänges måste vi lägga till det nya nmanet på den aktuella personen först i strängen och inte sist, gör du det sist kommer det som du sa baklänges.

dim rs, str
'set rs = Server.CreateObject("ADODB.Recordset")  'måste stängas för att kunna öppnas igen
nyvaltID = valtID 
Foo nyvaltID 'id på den person som är längst ner i listan t ex Åsa i ditt exempel

Response.write ("str: " & str) 'här finns länkarna

sub Foo(nyvaltID)
	SQLfraga = "SELECT * FROM tblOrg WHERE ID = " & nyvaltID
	set rs = Server.CreateObject("ADODB.Recordset")
	
	rs.open SQLfraga, connection 
	if not rs.eof then 
str = " > " & "<a href=""johanna.asp?valtID=" & rs.Fields("ID") & """>" & rs.Fields("fornamn") & " " & rs.Fields("efternamn") & "</a>" & str		
		SQLfraga = "SELECT * FROM tblParents WHERE ID = " & rs.Fields("ID")'nyvaltID
		rs.close
		rs.open SQLfraga, connection 
		if not rs.eof then
			 Foo(rs("parentID"))
		end if
	end if
	'rs.close
end sub
johannalokeMedlem sedan apr. 200393 inlägg
#20

Tack så mycket nu funkar det!!!!!!!
//Johanna

148 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
143 ms — hämta tråd, inlägg och bilagor (db)