webForumDet fria alternativet

Slumpa fram texter

12 svar · 500 visningar · startad av Nova

NovaMedlem sedan feb. 2005216 inlägg
#1

Jag har sökt och får massor av svar men inget jag förstår mig på att använda.
Jag skulle vilja slumpa fram en text (3 st receptnamn) från min access databas och skriva ut dem på min sida med .asp.
Det kommer inte att vara en serie tal på räknaren, jag kommer att ta bort recept då och då. Så jag förmodar att jag måste ha if någonstans.
Så här långt har jag kommit.

<%
Dim rstest
Dim rstest_numRows

Set rstest = Server.CreateObject("ADODB.Recordset")
rstest.ActiveConnection = MM_news_STRING
rstest.Source = "SELECT TOP 3 Receptnr, rec_namn1  FROM Recept  ORDER BY RND (isnull(receptnr) * 0 + 1)"
rstest.CursorType = 0
rstest.CursorLocation = 2
rstest.LockType = 1
rstest.Open()

rstest_numRows = 0
%>

Och det fungerar men det skriver alltid ut samma receptnamn jag skulle vilja att det skrev ut olika varje gång sidan laddas. Kan någon vänlig själ hjälpa en trög norrlänning vidare?

@ndersMedlem sedan juni 200032 969 inlägg
#2

Om man använder MySQL eller Microsoft SQL Server är det tämligen enkelt att ordna (det är bara att göra ett tillägg i ORDER BY i SQL-frågan, men om man använder Access blir det lite klurigare. (Det finns visserligen en random-funktion i Jet SQL, men den fungerar av någon anledning inte som den ska.)

Eftersom jag inte hade något bättre för mig...

<%
Dim vIDs()

[blue]' Här bestämmer vi hur många recept vi vill slumpa fram.[/blue]
iAntalRecept = 3

Redim vIDs(iAntalRecept)

set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\foo\bar\foobar.mdb;Persist Security Info=False"

sSQL = "SELECT Receptnr, rec_namn1 FROM Recept"
set objRS = objConn.Execute (sSQL)

vRecept = objRS.GetRows()

objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing

[blue]' Kalla på slumpfunktionen![/blue]
RandomizeIt vRecept, vIDs, 0, iAntalRecept

[blue]' Och nu är det dags att skriva ut resultaten![/blue]
for i = 0 to ubound(vIDs)
	sReceptNummer = vRecept([b][red]0[/red][/b], vIDs(i))
	sReceptNamn = vRecept([b][red]1[/red][/b], vIDs(i))
	[blue]' Index 0 och 1 ovan hänvisar alltså till det första resp. andra fältet i recordsetet (enl. ordningen i SQL-frågan).
	' Lägger du till fler fält, är det bara att plussa på. [/blue]
	Response.Write sReceptnummer & " - " & sReceptnamn & "<br>"
next

Sub RandomizeIt(ByVal vRows, ByRef vContainer, ByRef iCounter, ByVal iRecords)
	sTmpTest = "|" & join(vContainer, "|") & "|"
	Randomize
	iTmp = Int ((ubound(vRows, 2) + 1) * rnd)
	if instr(sTmpTest, "|" & vRows(0, iTmp) & "|") = 0 then
		[blue]' Den hade vi inte tidigare slumpat fram. Den tar vi![/blue]
		vContainer(iCounter) = iTmp
		iCounter = iCounter + 1
	end if
	if iCounter < iRecords then
		[blue]' Vi ska hämta fler! Kalla på funktionen igen.[/blue]
		RandomizeIt vRows, vContainer, iCounter, iRecords
	end if
End Sub
%>
NovaMedlem sedan feb. 2005216 inlägg
#3

Tackar och bockar @nders, fungerar bra och som jag vill, men jag får ett felmedelande i bland som säger så här.

Error Type:
Microsoft VBScript runtime (0x800A0009)
Subscript out of range: '[number: 52]'
/lyckasmeddb/wwwroot/test3.asp, line 43

Och rad 43 ser ut så här

' Och nu är det dags att skriva ut resultaten!
for i = 0 to ubound(vIDs) - 1
	sReceptNummer = vRecept(0, vIDs(i)-1)  [B]detta är rad 43[/B] 	
sReceptNamn = vRecept(1, vIDs(i)-1)
@ndersMedlem sedan juni 200032 969 inlägg
#4

Konstigt, det felet får jag inte hos mig. Jag ska testa lite mer. Återkommer!

@ndersMedlem sedan juni 200032 969 inlägg
#5

Har du ändrat något i mitt kodexempel? Exakt hur ser din kod ut?

Jag har precis testkört koden c:a 25000 gånger utan att få ett felmeddelande.

Mvh

NovaMedlem sedan feb. 2005216 inlägg
#6

Det enda jag ändrat är sökvägen till databasen.

@ndersMedlem sedan juni 200032 969 inlägg
#7

Okay. Om du har möjlighet att maila databasen till mig så ska jag prova med den. Jag har ju bara testat med en dummytabell med liknande uppbyggnad och lite skräpdata.

Mvh

NovaMedlem sedan feb. 2005216 inlägg
#8

Skickad nu.

@ndersMedlem sedan juni 200032 969 inlägg
#9

Nu har jag lokaliserat buggen. :)

Byt denna rad:

		vContainer(iCounter) = vRows(0, iTmp)

Mot:

		vContainer(iCounter) = iTmp

, så bör det fungera varje gång. :)

(Jag redigerar koden i mitt inlägg ovan, så den blir rätt.)

Mvh

NovaMedlem sedan feb. 2005216 inlägg
#10

Med den nya koden kommer det ett likadant fel i bland (väldigt sällan) och då skriver det så här

Microsoft VBScript runtime (0x800A0009)
Subscript out of range: '[number: -1]'
/lyckasmeddb/wwwroot/test3.asp, line 29

nu är det bara "nummer: -1", tidigare så var felet olika nummer mellan 45-55.

@ndersMedlem sedan juni 200032 969 inlägg
#11

Ja, jag ser det ja...

Tredje gången gillt då: Ta bort -1 från följande tre rader:

for i = 0 to ubound(vIDs) - 1
	sReceptNummer = vRecept(0, vIDs(i)-1)
	sReceptNamn = vRecept(1, vIDs(i)-1)

Just nu minns jag inte heller varför jag lade till -1 där till att börja med...

Mvh
anders

NovaMedlem sedan feb. 2005216 inlägg
#12

Tackar och bugar det allra djupaste för din tid och energi @nders :) så här vart koden till sist.

Dim vIDs()

' Här bestämmer vi hur många recept vi vill slumpa fram.
iAntalRecept = 3

Redim vIDs(iAntalRecept)

set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open MM_news_STRING

sSQL = "SELECT Receptnr, rec_namn1 FROM Recept"
set objRS = objConn.Execute (sSQL)

vRecept = objRS.GetRows()

objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing

' Kalla på slumpfunktionen!
RandomizeIt vRecept, vIDs, 0, iAntalRecept

' Och nu är det dags att skriva ut resultaten!
for i = 0 to ubound(vIDs) -1
	sReceptNummer = vRecept(0, vIDs(i))
	sReceptNamn = vRecept(1, vIDs(i))
	' Index 0 och 1 ovan hänvisar alltså till det första resp. andra fältet i recordsetet (enl. ordningen i SQL-frågan).
	' Lägger du till fler fält, är det bara att plussa på. 
	Response.Write sReceptnummer & " - " & sReceptnamn & "<br>"
next

Sub RandomizeIt(ByVal vRows, ByRef vContainer, ByRef iCounter, ByVal iRecords)
	sTmpTest = "|" & join(vContainer, "|") & "|"
	Randomize
	iTmp = Int ((ubound(vRows, 2) + 1) * rnd)
	if instr(sTmpTest, "|" & vRows(0, iTmp) & "|") = 0 then
		' Den hade vi inte tidigare slumpat fram. Den tar vi!
		vContainer(iCounter) = iTmp
		iCounter = iCounter + 1
	end if
	if iCounter < iRecords then
		' Vi ska hämta fler! Kalla på funktionen igen.
		RandomizeIt vRows, vContainer, iCounter, iRecords
	end if
End Sub

Tur för asp klåpare som jag att det finns bra forum med hjälpsamma människor på :) Jag lät minustecknet på

for i = 0 to ubound(vIDs) -1

vara kvar för annars så var det ett recept som alltid stod kvar så det var nog därför du satt dit det från början.

@ndersMedlem sedan juni 200032 969 inlägg
#13

så det var nog därför du satt dit det från början.

Hmm. Om jag kommer på anledningen så hojtar jag till. ;)

Mvh

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