Hej! För att slumpa fram 4 poster skriver du SQL-frågan såhär: Hej Johan, Om samma produkt visas mer än en gång måste det bero på att den finns mer än en gång i databasen!? Jag använder OLEDB, så här ser connectionstringen ut: Skriv: Det bör ju fungera, konstigt att det behövs bara, får den ingen seed automatiskt? När jag testkörde i Access-GUI:t fungerade det bra. Om man skickar in en konstan kommer den alltid att retunera samma värde. Jo, uppenbarligen är det ju så. Men testa att skapa en fråga i Access med följande innehåll: Hej och tack för att ni försöker hjälpa mig, men det blir ingen skillnad om jag skriver: Jag har en här, som jag kör med och fungerar kanonbra. Den här modellen funkar.... för mig i alla fall... KAn det vara så att din sida är cachad och inte för faller? Nu har jag fått det att fungera genom att göra så här: Du får då köra float:left resp right i divvarnas style Hej, <citat>Problemet är inte med själva presentationen dvs. html/css, de fungerar bra. Jag vet bara inte hur jag ska göra för att få asp koden att skriva ut den så det blir rätt. </citat> Jag löste de genom att göra så här: Bra lösning! Det fungerade inte, då antalrader blev -1.Slumpa ut flera produkter från en access databas
Jag håller på att försöka bygga en liten produktkatalog på skoj och har stött på ett litet problem. På produktkatalogens startsida har jag tänkt mig att ha en ruta som heter Tips från katalogen eller liknande, där 4st olika produkter skall slumpas ut från en Access databas varje gång man går in på sidan eller uppdaterar den.
Jag har sökt runt på olika forum mm för att försöka hitta något som kan hjälpa mig, men inte lyckats hitta något. Jag vore väldigt tacksam om någon kunde ge mig tips på artiklar, script eller visa hur man kan bygga en sådan funktion.
Tack på förhand!
Koden för själva presentationen ser ut enligt följande:
<div class="product-tip-row">
<div class="prod-left">
<h4>Produktens namn 1</h4>
<img src="/images/products/bild_min.jpg" width="95" height="95" alt="" />
<p class="price">Från<br /><strong>25,00</strong><br />kr/st</p>
<p class="lnk">Läs mer</p>
</div>
<div class="prod-right">
<h4>Produktens namn 2</h4>
<img src="/images/products/bild_min.jpg" width="95" height="95" alt="" />
<p class="price">Från<br /><strong>25,00</strong><br />kr/st</p>
<p class="lnk">Läs mer</p>
</div>
<div class="clear"></div>
</div>
<div class="hr-2"><hr /></div>
<div class="product-tip-row">
<div class="prod-left">
<h4>Produktens namn 3</h4>
<img src="/images/products/bild_min.jpg" width="95" height="95" alt="" />
<p class="price">Från<br /><strong>25,00</strong><br />kr/st</p>
<p class="lnk">Läs mer</p>
</div>
<div class="prod-right">
<h4>Produktens namn 4</h4>
<img src="/images/products/bild_min.jpg" width="95" height="95" alt="" />
<p class="price">Från<br /><strong>25,00</strong><br />kr/st</p>
<p class="lnk">Läs mer</p>
</div>
<div class="clear"></div>
</div>Sv: Slumpa ut flera produkter från en access databas
SELECT TOP 4 ... ORDER BY RND(FÄLT_MED_UNIKT_VÄRDE_FÖR_VARJE_PRODUKT)
/JohanSv:Slumpa ut flera produkter från en access databas
Om jag gör så här så slumpas 4st produkter ut, men det är samma 4 produkter hela tiden. Jag skulle vilja att det är olika varje gång sidan uppdateras. Det vore också bra om inte samma produkt visas på mer än ett ställe dvs. samma produkt skall inte visas två gånger samtidigt.
<code>
<%
'Öppnar databasen
Call dbOpen(Connect)
'Slumpar fram produkter
strSQL = "Select Top 4 * From t_products Where active=True Order by RND(prodID)"
Set objRs = Connect.Execute(strSQL)
If objRs.EOF Then Response.Write ""& vbCrLf
If Not objRs.EOF Then
Do While Not objRs.EOF
Response.Write "<h4>"& objRs("prodName") &"</h4>"& vbCrLf
objRs.MoveNext
Loop
End If
objRs.Close : Set objRs = Nothing
Call dbClose(Connect)
%>
</code>Sv: Slumpa ut flera produkter från en access databas
Låter märkligt att du alltid får samma, så blir det inte när jag testar... Vilken provider använder du? (visa din connectionstring) Testa att köra med OLEDB om du inte gör det.
Ett litet tips, du kan ta bort följande if-sats, den gör ingen nytta, while-loopen körs aldrig om du har kommit till EOF:
If Not objRs.EOF Then
/JohanSv:Slumpa ut flera produkter från en access databas
<code>
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source ="& Server.MapPath("db.mdb")
</code>
Låt oss säga att jag har 10st produkter i databasen som heter produkt1, produkt2, produkt3 osv. Det som händer är att 4st produkter visas (exempelvis: produkt5, produkt2, produkt8, produkt6) men dessa produkter ligger hela tiden kvar på samma plats. När jag uppdaterar så byts de alltså inte ut.
Däremot så byts de ut om jag lägger till nya produkter i databasen, men sen blir de samma sak att de stannar kvar.
och tack för tipset... :)Sv: Slumpa ut flera produkter från en access databas
ORDER BY RND(Timer() - IDFält)
På så sätt blir varje anrop unikt.
Sv:Slumpa ut flera produkter från en access databas
/JohanSv: Slumpa ut flera produkter från en access databas
Sv:Slumpa ut flera produkter från en access databas
SELECT Rnd(1);
Kör du den flera gånger får man (iaf jag) olika resultat varje gång, alltså måste RND fungera olika beroende på varifrån man använder den?
/JohanSv: Slumpa ut flera produkter från en access databas
<code>
Order by RND(Timer() - prodID)
</code>
Det blir fortfarande samma 4 produkter som visas...
Har ni något annat förslag?Sv:Slumpa ut flera produkter från en access databas
Den är lite lång men...
<code>
'bygg upp din SQL genom att selecta allt
'gör ditt recordsett
Dim arrData ' All data
Dim minArr ' minsta id
Dim maxArr ' störrsta id
arrData = RS.GetRows
RS.close
Set RS = Nothing
minArr = int(Lbound(arrData, 2))
maxArr = int(Ubound(arrData, 2))
Randomize
Dim Urval(10)'här bestämmer du hur många du vill ha
' Antal hittills utvalda
Antal_valda = 0
' Håll på tills vi valt 10 stycken
While Antal_valda < 10
' Välj ett tal
Slumptal = Int(Rnd * maxArr) + 1
' Finns talet redan?
Finns_redan = false
For i = 1 to Antal_valda
If Slumptal = Urval(i) Then
' Talet fanns redan
Finns_redan = true
Exit For
End If
Next
' Om talet inte fanns, lägg det i Urval'
If Not Finns_redan Then
Antal_valda = Antal_valda + 1
Urval(Antal_valda) = Slumptal
End If
Wend
'Du får tag på ditt recordsett med
For i = 0 TO 10
response.write response.write Urval(i)
NEXT
</code>
Jag hoppas att du kan förstå denna koden...Sv: Slumpa ut flera produkter från en access databas
Randomize
SQL = "SELECT TOP 4 * FROM Products ORDER BY Rnd(-CatalogID-" & Replace(Rnd(),",",".") & ") ASC"Sv:Slumpa ut flera produkter från en access databas
Sv: Slumpa ut flera produkter från en access databas
<code>
<%
'Öppnar databasen
Call dbOpen(Connect)
'Slumpar fram produkter
Randomize
strSQL = "Select Top 4 * From t_products Where active=True Order by RND(-prodID-" & Replace(Rnd(),",",".") & ") ASC"
Set objRs = Connect.Execute(strSQL)
If objRs.EOF Then Response.Write ""& vbCrLf
If Not objRs.EOF Then
Do While Not objRs.EOF
Response.Write "<div class=""product-tip-row"">"& vbCrLf
Response.Write "<div class=""prod-left"">"& vbCrLf
Response.Write "<h4>"& objRs("prodName") &"</h4>"& vbCrLf
Response.Write "<img src=""/images/test.jpg"" width=""95"" height=""95"" alt="""& objRs("prodName") &""" />"& vbCrLf
Response.Write "<p class=""price"">Från<br /><strong>"& FormatNumber(objRs("price4")) &"</strong><br />kr/st</p>"& vbCrLf
Response.Write "<p class=""lnk"">Läs mer</p>"& vbCrLf
Response.Write "</div>"& vbCrLf
Response.Write "<div class=""clear""></div>"& vbCrLf
Response.Write "</div>"& vbCrLf
Response.Write "<div class=""hr-2""><hr /></div>"& vbCrLf
objRs.MoveNext
Loop
End If
objRs.Close : Set objRs = Nothing
Call dbClose(Connect)
%>
</code>
Det enda problemet nu är att alla produkter kommer efter varandra och jag skulle vilja ha 2 st bredvid varandra och ny rad och sen 2 st bredvid varandra igen.
Så här:
<div class="product-tip-row">
<div class="prod-left">
<h4>Produktens namn 1</h4>
<img src="/images/products/bild_min.jpg" width="95" height="95" alt="" />
<p class="price">Från<br /><strong>25,00</strong><br />kr/st</p>
<p class="lnk">Läs mer</p>
</div>
<div class="prod-right">
<h4>Produktens namn 2</h4>
<img src="/images/products/bild_min.jpg" width="95" height="95" alt="" />
<p class="price">Från<br /><strong>25,00</strong><br />kr/st</p>
<p class="lnk">Läs mer</p>
</div>
<div class="clear"></div>
</div>
<div class="hr-2"><hr /></div>
<div class="product-tip-row">
<div class="prod-left">
<h4>Produktens namn 3</h4>
<img src="/images/products/bild_min.jpg" width="95" height="95" alt="" />
<p class="price">Från<br /><strong>25,00</strong><br />kr/st</p>
<p class="lnk">Läs mer</p>
</div>
<div class="prod-right">
<h4>Produktens namn 4</h4>
<img src="/images/products/bild_min.jpg" width="95" height="95" alt="" />
<p class="price">Från<br /><strong>25,00</strong><br />kr/st</p>
<p class="lnk">Läs mer</p>
</div>
<div class="clear"></div>
</div>
Har ni något förslag hur man kan göra för att få så?
Tack för all hjälp så här långt :)Sv:Slumpa ut flera produkter från en access databas
DIV-Föräldern (divven som produktdivvarnaligger i ) måste också ha ett float-värde för att det skall fungera (har jag för mig)
Sen får du köra select case mod historia för att veta om produkten skall vara till höger eller vänster.
jag vet att det är ganska lätt att göra detta när man använder tabeller, och det borde vara samma svårighetsgrad även om det är divvar.Sv: Slumpa ut flera produkter från en access databas
Problemet är inte med själva presentationen dvs. html/css, de fungerar bra. Jag vet bara inte hur jag ska göra för att få asp koden att skriva ut den så det blir rätt.
Jag vill att asp koden ska skriva ut de som jag visar ovan, men som det ser ut nu så skriver asp koden ut de så här:
<code>
<div class="product-tip-row">
<div class="prod-left">
<h4>Produktens namn 1</h4>
<img src="/images/products/bild_min.jpg" width="95" height="95" alt="" />
<p class="price">Från<br /><strong>25,00</strong><br />kr/st</p>
<p class="lnk">Läs mer</p>
</div>
<div class="clear"></div>
</div>
<div class="hr-2"><hr /></div>
</code>
Och sen repeteras detta så många gånger som man har angett att de ska. Som ni ser så blir ju denna presentation fel. Hoppas ni förstår hur jag menar.Sv:Slumpa ut flera produkter från en access databas
Det är just presentationen som är problemet då det är asp-koden som skall generera den, heller hur?!
Du får ta med någon räknare som känner av hur många bilder som skrivits ut per rad;
om räknaren är 2 (den har skrivit ut 2 divvar med 2 bilder i) då måste du avsluta ytterligare någon div (antar jag) samt påbörja div för nästa rad samt nollställa räknaren.Sv: Slumpa ut flera produkter från en access databas
<code>
'Öppnar databasen
Call dbOpen(Connect)
'Slumpar fram produkter
Randomize
strSQL = "Select Top 4 * From t_products Where active=True Order by RND(-prodID-" & Replace(Rnd(),",",".") & ") ASC"
Set objRs = Connect.Execute(strSQL)
iLoop = 0
If Not objRs.EOF Then
Do Until objRs.EOF
iLoop = iLoop + 1
If iLoop Mod 2 = 0 Then
Response.Write "<div class=""prod-right"">"& vbCrLf
Response.Write "<h4>"& objRs("prodName") &"</h4>"& vbCrLf
Response.Write "<img src=""../public/images/products/29020_min.jpg"" width=""95"" height=""95"" alt="""& objRs("prodName") &""" />"& vbCrLf
Response.Write "<p class=""price"">Från<br /><strong>"& FormatNumber(objRs("price4")) &"</strong><br />kr/st</p>"& vbCrLf
Response.Write "<p class=""lnk"">Läs mer information</p>"& vbCrLf
Response.Write "</div>"& vbCrLf
Response.Write "<div class=""clear""></div>"& vbCrLf
Response.Write "</div>"& vbCrLf
Response.Write "<div class=""hr-2""><hr /></div>"& vbCrLf
Else
Response.Write "<div class=""product-tip-row"">"& vbCrLf
Response.Write "<div class=""prod-left"">"& vbCrLf
Response.Write "<h4>"& objRs("prodName") &"</h4>"& vbCrLf
Response.Write "<img src=""../public/images/products/29020_min.jpg"" width=""95"" height=""95"" alt="""& objRs("prodName") &""" />"& vbCrLf
Response.Write "<p class=""price"">Från<br /><strong>"& FormatNumber(objRs("price4")) &"</strong><br />kr/st</p>"& vbCrLf
Response.Write "<p class=""lnk"">Läs mer information</p>"& vbCrLf
Response.Write "</div>"& vbCrLf
End If
objRs.MoveNext
Loop
Else
Response.Write ""& vbCrLf
End If
objRs.Close : Set objRs = Nothing
Call dbClose(Connect)
</code>
Kanske inte de bästa sättet att göra de på, men det fungerar. Det enda felet är att det kommer en extra <div class="hr-2"><hr /></div> efter sista diven. Någon som har ett förslag på hur man skulle kunna få bort den?
Tack för all hjälp...Sv:Slumpa ut flera produkter från en access databas
Tror att detta skall fungera
<code>
'lägg in efter set objRs=Conn.execute ...
antalrader = objRs.Recordcount
'och lägg in
If antalrader <> iLoop Then Response.Write "<div class=""hr-2""><hr /></div>"& vbCrLf
'istället för Response.Write "<div class=""hr-2""><hr /></div>"& vbCrLf
</code>Sv: Slumpa ut flera produkter från en access databas
Jag löste de dock genom att lägga till de du sa och ändra följande kod:
<code>
strSQL = "Select Top 4 * From t_products Where active=True Order by RND(-prodID-" & Replace(Rnd(),",",".") & ") ASC"
Set objRs = Connect.Execute(strSQL)
</code>
Till
<code>
Set objRs = Server.CreateObject("ADODB.Recordset")
strSQL = "Select Top 4 * From t_products Where active=True Order by RND(-prodID-" & Replace(Rnd(),",",".") & ") ASC"
objRs.Open strSQL, Connect, 3, 3
</code>
Tack för all hjälp!