webForumDet fria alternativet

LarsG: En fråga till dig...

ASP

14 svar · 241 visningar · startad av Mz

Medlem sedan aug. 2001139 inlägg
Frågan#1

Lite loopar och så

Inlägg: http://cgi.webforum.nu/wf/Forum11/HTML/000282.html

Din kod:

<%
Dim links()
Dim counter,i,found
SQL = "select count(*) AS count_lankar from lankar"
Set RS_count_lankar = databas.Execute(SQL)

Randomize
counter = 0
do
link = Int(rnd*RS_count_lankar("count_lankar"))-1
found = 0
for i = 0 to counter
if links(i) = link then
found = 1
exit for
end if
next
if found = 0 then
links(counter) = link
counter = counter -- 1
end if
if counter = 6 then
exit do
end if
loop

SQL = "Select * from lankar"

Set RSdbase = Server.CreateObject("ADODB.Recordset")
RSdbase.open SQL, Session("dbasepath"),adLockPessimistic,adOpenKeyset
for i = 0 to 5 
RSdbase.Move links(i)
url = RSdbase("lank")
lank_namn = RSdbase("namn")
lank_beskriv = RSdbase("beskrivning")
'gör något med länk
next
%>

Jag får följande meddelande:
Körningsfel i Microsoft VBScript (0x800A0009)
Felaktigt matrisindex
/Tester/slump/default.asp, line 20

Min kod:

<html><body>

<%

strDbPath = Server.Mappath("test.mdb")

Set databas = Server.CreateObject("ADODB.Connection")
databas.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source ="& Server.MapPath("test.mdb")
Dim links()
Dim counter,i,found
SQL = "select count(*) AS count_lankar from tester"
Set RS_count_lankar = databas.Execute(SQL)

Randomize
counter = 0
do
link = Int(rnd*RS_count_lankar("count_lankar"))-1
found = 0
for i = 0 to counter
[b]if links(i) = link then[/b]
found = 1
exit for
end if
next
if found = 0 then
links(counter) = link
counter = counter -- 1
end if
if counter = 6 then
exit do
end if
loop

SQL = "Select * from tester"

Set RSdbase = Server.CreateObject("ADODB.Recordset")
RSdbase.open SQL, strDbPath, adLockPessimistic, adOpenKeyset
for i = 0 to 5 
RSdbase.Move links(i)
Response.Write RSdbase("t1")
next

RS_count_lankar.Close
Set RS_count_lankar = Nothing

RSdbase.Close
Set RSdbase = Nothing

databas.Close
Set databas = Nothing
%>

</body></html>

Den feta texten är rad 20.

Skulle du kunna ge mig en hjälpande hand?
Jag försöker slumpa flera länkar (gärna 10) från en databas..

Tack på förhand.

------------------
~ Mz ~

Medlem sedan juli 20003 825 inlägg
#2

Fan...

Detta forumet är inte till att användas som någon personlig chatt.

Dra iväg ett mail till grabben i så fall!

Medlem sedan jan. 2001510 inlägg
#3

Jag vet vad som är fel. Men det var ju till LarsG så...

/JANspeed

Medlem sedan dec. 200012 464 inlägg
#4

Såja Eclipse. Jag föredrar att det blir en tråd här än att jag får mail.

<%
Dim links()
Dim counter,i,found
SQL = "select count(*) AS count_lankar from lankar"
Set RS_count_lankar = databas.Execute(SQL)
Randomize
counter = 0
do
link = Int(rnd*RS_count_lankar("count_lankar"))-1
found = 0
for i = 0 to counter
if links(i) = link then
found = 1
exit for
end if
next
if found = 0 then
links(counter) = link
counter = counter -- 1
end if
if counter = 6 then
exit do
end if
loop

SQL = "Select * from lankar"

Set RSdbase = Server.CreateObject("ADODB.Recordset")
RSdbase.open SQL, Session("dbasepath"),adLockPessimistic,adOpenKeyset
for i = 0 to 5 
RSdbase.Move links(i)
url = RSdbase("lank")
lank_namn = RSdbase("namn")
lank_beskriv = RSdbase("beskrivning")
'gör något med länk
next
%>

--------------------------------------------------------------------------------

Jag får följande meddelande:
Körningsfel i Microsoft VBScript (0x800A0009)
Felaktigt matrisindex
/Tester/slump/default.asp, line 20

Min kod:
Kod:

--------------------------------------------------------------------------------
<html><body>
<%

strDbPath = Server.Mappath("test.mdb")

Set databas = Server.CreateObject("ADODB.Connection")
databas.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source ="& Server.MapPath("test.mdb")
Dim links()
Dim counter,i,found
SQL = "select count(*) AS count_lankar from tester"
Set RS_count_lankar = databas.Execute(SQL)

Randomize
counter = 0
do
link = Int(rnd*RS_count_lankar("count_lankar"))-1
found = 0
for i = 0 to counter [b]- 1 [/b]
if links(i) = link then
found = 1
exit for
end if
next
if found = 0 then
links(counter) = link
counter = counter -- 1
end if
if counter = 6 then
exit do
end if
loop

SQL = "Select * from tester"

Set RSdbase = Server.CreateObject("ADODB.Recordset")
RSdbase.open SQL, strDbPath, adLockPessimistic, adOpenKeyset
for i = 0 to 5 
RSdbase.Move links(i)
Response.Write RSdbase("t1")
next

RS_count_lankar.Close
Set RS_count_lankar = Nothing

RSdbase.Close
Set RSdbase = Nothing

databas.Close
Set databas = Nothing
%>

</body></html>

Du kan ju testa med detta.

------------------
essentitia preter non sans multiplicandum

Medlem sedan aug. 2001139 inlägg
#5

Eclipse:
Jag trodde detta forum fanns för att man skulle kunna få svar på sina ev. frågor.. förlåt om jag misstog mig.
Eftersom det var LarsGs kod så tillfrågade honom, detta eftersom jag antog att han kände igen koden bättre än någon annan.

JANspeed:
Se texten ovan... ;)

LarsG:
Nja, samma felmeddelande igen, dock på ny rad:
Körningsfel i Microsoft VBScript (0x800A0009)
Felaktigt matrisindex
/tester/slump/Default.asp, line 26

if found = 0 then
[b]links(counter) = link[/b]
counter = counter -- 1
end if

------------------
~ Mz ~

Medlem sedan dec. 200012 464 inlägg
#6

Hmm, jag skrev ju att den var otestad. Det är väl enklast att dimma links på en gång.

<html><body>
<%

strDbPath = Server.Mappath("test.mdb")

Set databas = Server.CreateObject("ADODB.Connection")
databas.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source ="& Server.MapPath("test.mdb")
Dim links([b]5[/b])
Dim counter,i,found
SQL = "select count(*) AS count_lankar from tester"
Set RS_count_lankar = databas.Execute(SQL)

Randomize
counter = 0
do
link = Int(rnd*RS_count_lankar("count_lankar"))-1
found = 0
for i = 0 to counter - 1 
if links(i) = link then
found = 1
exit for
end if
next
if found = 0 then
links(counter) = link
counter = counter -- 1
end if
if counter = 6 then
exit do
end if
loop

SQL = "Select * from tester"

Set RSdbase = Server.CreateObject("ADODB.Recordset")
RSdbase.open SQL, strDbPath, adLockPessimistic, adOpenKeyset
for i = 0 to 5 
RSdbase.Move links(i)
Response.Write RSdbase("t1")
next

RS_count_lankar.Close
Set RS_count_lankar = Nothing

RSdbase.Close
Set RSdbase = Nothing

databas.Close
Set databas = Nothing
%>

</body></html>

------------------
essentitia preter non sans multiplicandum

Medlem sedan jan. 2001510 inlägg
#7

Självklart hajar jag att det var hans kod och därför frågar du honom. Men det är ju dumt att formulera sig så begränsande så därför ville jag retas lite. :p

Vem vet. Lasseponken kanske hade varit bortrest. Då hade du ju kanske aldrig fått nått svar. :)

Medlem sedan aug. 2001139 inlägg
#8

Janspeed: Självklart uppskattar jag all form av hjälp. :h

LarsG:
Jo jag läste att den var otestad men jag är i stort behov av att få detta att fungera och FOR-satser är inte min starka sida så jag klarar det inte på egen hand,dessutom är ju detta ett ypperligt läge att testa koden. ;)

Jag har nu följt dina instruktioner men får ett nytt felmeddelande:

ADODB.Field (0x80020009)
Antingen är BOF eller EOF satt till True, eller så har aktuell post raderats. Den begärda åtgärden kräver en aktuell post.
/Tester/slump/default.asp

Kolumnen t1 har 50 poster i sig och min kod ser nu ut så här:

<html><body>

<!--#include file="adovbs.inc"-->

<%
Dim counter,i,found, links(5), link

Set databas = Server.CreateObject("ADODB.Connection")
databas.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source ="& Server.MapPath("test.mdb")
SQL = "select count(t1) AS count_lankar from tester"
Set RS_count_lankar = databas.Execute(SQL)

Randomize
counter = 0
do
	link = Int(rnd*RS_count_lankar("count_lankar")) - 1
	found = 0

		for i = 0 to counter - 1
			if links(i) = link then
			found = 1
			exit for
			end if
		next

	if found = 0 then
	links(counter) = link
	counter = counter -- 1
	end if

	if counter = 6 then
	exit do
	end if

loop

SQL = "Select t1 from tester"
Set RSdbase = Server.CreateObject("ADODB.Recordset")
RSdbase.open SQL, "Provider=Microsoft.Jet.OLEDB.4.0;Data Source ="& Server.MapPath("test.mdb"), adLockPessimistic, adOpenKeyset

for i = 0 to 5 
	RSdbase.Move links(i)
	Response.Write RSdbase("t1")
next

RS_count_lankar.Close
Set RS_count_lankar = Nothing

RSdbase.Close
Set RSdbase = Nothing

databas.Close
Set databas = Nothing
%>

</body></html>

Några förslag?
Uppskattar verkligen din hjälp! :)

------------------
~ Mz ~

Medlem sedan dec. 200012 464 inlägg
#9
SQL = "Select t1 from tester"
Set RSdbase = Server.CreateObject("ADODB.Recordset")
RSdbase.open SQL, "Provider=Microsoft.Jet.OLEDB.4.0;Data Source ="& Server.MapPath("test.mdb"), adLockPessimistic, adOpenKeyset

for i = 0 to 5 
[b]RSdbase.movefirst
RSdbase.Move links(i)-1[/b] 
Response.Write RSdbase("t1")
next

Move fungerar ju så att man förflyttar sig i förhållande till nuvarande record och därför så hamande man utanför.

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 06 sep 2001]

Medlem sedan aug. 2001139 inlägg
#10

Tyvärr så kvarstår samma felmeddelande.

ADODB.Field (0x80020009)
Antingen är BOF eller EOF satt till True, eller så har aktuell post raderats. Den begärda åtgärden kräver en aktuell post.
/Tester/slump/default.asp

SQL = "Select t1 from tester"
Set RSdbase = Server.CreateObject("ADODB.Recordset")
RSdbase.open SQL, "Provider=Microsoft.Jet.OLEDB.4.0;Data Source ="& Server.MapPath("test.mdb"), adLockPessimistic, adOpenKeyset

for i = 0 to 5 
	RSdbase.movefirst
	RSdbase.Move links(i) - 1
	Response.Write RSdbase("t1")
next

------------------
~ Mz ~

Medlem sedan dec. 200012 464 inlägg
#11

Ok, nya tappra försök.

Kan du lägga in lite debugutskrifter
så jag ser vad som händer.

for i = 0 to 5 
RSdbase.movefirst
response.write i & ":" & links(i) & "<br>"
RSdbase.Move links(i)
Response.Write RSdbase("t1")
next

red: Jag tog bort -1 vid anropet till move också.

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 06 sep 2001]

Medlem sedan aug. 2001139 inlägg
#12

Jag får fortfarande samma felmeddelande... :l

Kan du lägga in lite debugutskrifter så jag ser vad som händer.

Hänger inte med.. ;)
Vad menar du med detta?

------------------
~ Mz ~

Medlem sedan dec. 200012 464 inlägg
#13

Jag menar att du lägger in anrop till response.write (som jag gjorde i kodsnutten ovan) med t.ex. värden på olika variabler så går det att se vad som händer.

------------------
essentitia preter non sans multiplicandum

Medlem sedan aug. 2001139 inlägg
#14

Ok.. jag ger upp... :(

------------------
~ Mz ~

Medlem sedan aug. 2001139 inlägg
#15

Jag lyckades... den slumpar i alla fall 10 länkar nu. :)

Är väl förmodligen inte helt korrekt men det fungerar.

Så här gjorde jag:

<%

	Dim Connect, SQL, RecSet, strPosts, strRandom, i

	' ### Räkna antal poster i databasen
	Set Connect = Server.CreateObject("ADODB.Connection")
	Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source = "& Server.MapPath("test.mdb")

	SQL = "SELECT Count(ID) AS rsPosts FROM tester"
	Set RecSet = Connect.Execute(SQL)
	
		strPosts = RecSet("rsPosts")

	RecSet.Close

	For i = 1 to 10

		' ### Ta fram en slumpad post
		Set RecSet = Connect.Execute("SELECT Namn FROM tester ORDER BY ID DESC")

			Randomize
			strRandom = Int(RND*strPosts) - 1

		Do While strRandom >= 0
		RecSet.MoveNext

		strRandom = strRandom - 1
		Loop

		Response.Write "• <b>"& RecSet("Namn") &"</b><br>"

	Next

	RecSet.Close
	Connect.Close

	Set RecSet = Nothing
	Set Connect = Nothing

%>

Det bli iofs dubletter ibland men det får jag leva med eftersom jag inte lyckas få bort dem...

------------------
~ Mz ~

[Redigerat av Mz den 10 sep 2001]

282 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
132 ms — deklarationer (db)
0 ms — hämta statistik (cache)
144 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)