Ä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
20 svar · 545 visningar · startad av johannaloke
Ä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
Det trodde jag också men det finns.
Är det inget fel i själva satsen syntax mässigt?
//Johanna
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
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'
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
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
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
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
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.
-> 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.
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
Tack allihopa!
Nu ska ja kika på era förslag så återkommer jag om jag har fler frågor ;)
//Johanna
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
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
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*
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.
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
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
Tack så mycket nu funkar det!!!!!!!
//Johanna