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?
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
%>
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)
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.
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.