NovaMedlem sedan feb. 2005216 inlägg 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 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 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 Konstigt, det felet får jag inte hos mig. Jag ska testa lite mer. Återkommer!
@ndersMedlem sedan juni 200032 969 inlägg 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 Det enda jag ändrat är sökvägen till databasen.
@ndersMedlem sedan juni 200032 969 inlägg 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
@ndersMedlem sedan juni 200032 969 inlägg 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 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 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 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
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