webForumDet fria alternativet

Random från Databas

10 svar · 635 visningar · startad av Danielkun

DanielkunMedlem sedan maj 2003361 inlägg
#1

Jag har en Access Databas som jag använder denna sträng på,

strSQL = "SELECT ID, Japanese, Hiragana, English, Typ, Datum, Apperance, Hits FROM words WHERE Addedby = 'Danielkun' ORDER BY RND(ID)"

och resultatet är slumpat om man jämnför med ordningen inläggen är inlaggda i databasen, fast den verkar bara slumpa en gång för varje gång man kommer tillbaka är dom i "samma" slumpande ordning.. vet nån hur man får ASP att slumpa om den 'igen'?

ampyMedlem sedan feb. 20011 498 inlägg
#2

RND() finns inte i MS Access. Däremot kan du lösa det på andra sätt, ta en titt i nedanstående tråd:

http://www.webforum.nu/showthread.php?s=&forumid=55&threadid=75738

DanielkunMedlem sedan maj 2003361 inlägg
#3

Tack! Jag testade koden på detta sätt. Men nu funkar koden och ibland inte. Får man nummer som inte finns reggade i ID kolumnen i databasen då kanske? Sen har jag ingen riktig shuffle här heller.. får alltid samma inlägg sist.

Vore jätteglad för hjälp

Set objConn = server.CreateObject("ADODB.Connection")
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Databasen
objConn.Open strConn

strSQL = "SELECT ID, Japanese, Hiragana, English, Typ, Datum, Apperance, Hits FROM words WHERE Addedby = 'Danielkun'"
Set objRS = objConn.Execute(strSQL)

if (objRS.BOF OR objRS.EOF) then

else
While NOT objRS.EOF

Randomize
objRS.Move CLng((objRS.RecordCount * Rnd) + 1
J.N.Medlem sedan apr. 20031 660 inlägg
#4

HEJ!

Nej, denna kod har ju ingen hantering för undantag av id som inte används, tänkte jag skriva, men det har ingen betydelse, den hoppar ju till den post som slumpas fram?
Alltså borde det fungera.

I vilket fall ville jag delge min kod jag gjorde för några år sedan för att slumpa ut i detta fall sju recept, utan dubletter.
Detta löstes genom att lägga posterna i en array som krymptes efter varje slumpning.

Ta bort ' från raderna och se hur vackert det fungerar :e

sql="SELECT id, namn FROM recept"
RS.Open sql, dbconn, 1, 2

If NOT RS.EOF Then
	GRrecept = RS.GetRows
	uboundarray=UBound(GRrecept,2)
	antalrec=7: antalslump=0: i=0
	If uboundarray+1 > antalrec Then
		Do Until antalslump = 7
			'for k=0 to uboundarray-i
				'response.write GRrecept(0,k) & " " & GRrecept(1,k) & "<br>"
			'next
			Randomize
			slumptal=Int(Rnd*(uboundarray+1-i)) '+1 pga array 0,1...
			'response.write "slump" & slumptal & "<br>"
			slumparrayrec(0,antalslump) = GRrecept(0,slumptal)
			'response.write "slumparrayrec0," & i  & " " & slumparrayrec(0,antalslump) & "<br>"
			slumparrayrec(1,antalslump) = GRrecept(1,slumptal)
			'response.write "slumparrayrec1," & i  & " " & slumparrayrec(1,antalslump) & "<br>"
			
			'flytta posterna över slumptalet nedåt
			For j = slumptal To uboundarray-1-i
				GRrecept(0,j) = GRrecept(0,j+1) '+1 ska ju flytta nästa tal
				'response.write "GRrecept1," & j & " " & GRrecept(0,j+1) & "<br>"
				GRrecept(1,j) = GRrecept(1,j+1)
				'response.write "GRrecept1," & j & " " & GRrecept(1,j+1) & "<br>"
			Next
			'response.write "ubound före krymp " & UBound(GRrecept,2) & "<br>"
			ReDim Preserve GRrecept(UBound(GRrecept, 1), UBound(GRrecept, 2) - 1)
			'response.write "ubound efter krymp " & UBound(GRrecept,2) & "<br>"
			i=i+1
			antalslump = antalslump+1
		Loop
	Else
		For j = 0 to uboundarray
			slumparrayrec(0,j) = GRrecept(0,j)
			slumparrayrec(1,j) = GRrecept(1,j)
		Next
	End If
	For k=0 To UBound(slumparrayrec,2)
		response.write "<a href=""rec.asp?id=" & slumparrayrec(0,k) & "">" & slumparrayrec(1,k) & "</a>"
	Next
Else
	response.write "Det finns inga recept."
End If

RED: Se http://www.webforum.nu/showthread.php?s=&postid=837740#post837740

DanielkunMedlem sedan maj 2003361 inlägg
#5

Tack for svaret!@men jag har en databas med 2-3000 poster sa det tar nog en del tid att gora detta ? :D fast jag vill bara plocka ut 1-200 i taget..

J.N.Medlem sedan apr. 20031 660 inlägg
#6

HEJ!

Njae, tid och tid... :)

Jag har rätt exakt 3000 recept, visserligen på olika språk och andra kategoriseringar också, det blir nog aldrig mer än 50 recept att slumpa bland, tror jag.

Men, det viktiga är att i vilket fall måste du hämta dina poster med ett RS, sedan skyfflar jag över det till en array, och då påverkar du inte servern längre.

OM du inte har en webbplats med många besökare, kan du bortse från prestandaproblem.
Testa med ditt värsta scenario.

Ska du verkligen slumpa bland alla dina poster?

DanielkunMedlem sedan maj 2003361 inlägg
#7

Jättetack,
Jag sitter o testar för fullt här nu, men det var lite klurigt det här.. har du kvar din sida med recept på nätet så jag kan se vad du får för resultat av det här? du har ganska mycket "grafik loopar" med i koden, eller?

J.N.Medlem sedan apr. 20031 660 inlägg
#8

HEJ!

Njae, den finns kvar, men nu visar vi alla istället.

Grafikloopar, vad menar du med det, det finns inte tillstymmelse till gif i koden!

Du ska utan problem kunna köra min kod och få sju slumpningar av id och namn.

Kodsnutten

for k=0 to uboundarray-i
	response.write GRrecept(0,k) & " " & GRrecept(1,k) & "<br>"
next

ska INTE köras, jag tog bort fnuttarna tidigare, eftersom allt stod på en rad i min fil. (Ändrat ovan.)

DanielkunMedlem sedan maj 2003361 inlägg
#9

Sorry, men jag får "Inkompatibla typer" på 'slumparrayrec' :r

J.N.Medlem sedan apr. 20031 660 inlägg
#10

HEJ!

Okej, det förstår jag inte varför, kolla vad du försöker göra genom att skriva ut det.
Krånglar det med detsamma, eller efter några loopar tex?

Har du dim:at variblerna, eller åtminstone arrayen?
Tänkte inte på att i skicka med det tidigare.

Dim uboundarray, antalslump, i, j, k, slumptal
Dim GRrecept, slumparrayrec(1,6), antalrec
DanielkunMedlem sedan maj 2003361 inlägg
#11

Oj, tack!
La precis in ett inlägg om det :)
Jag måste gå o jobba lite nu, ska testa så fort jag kommer hem

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