Slumpa ut flera produkter från en access databas
Hej!
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>
Svara
Sv: Slumpa ut flera produkter från en access databas
För att slumpa fram 4 poster skriver du SQL-frågan såhär:
SELECT TOP 4 ... ORDER BY RND(FÄLT_MED_UNIKT_VÄRDE_FÖR_VARJE_PRODUKT)
/Johan
Svara
Sv:Slumpa ut flera produkter från en access databas
Hej Johan,
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>
Svara
Sv: Slumpa ut flera produkter från en access databas
Om samma produkt visas mer än en gång måste det bero på att den finns mer än en gång i databasen!?
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
/Johan
Svara
Sv:Slumpa ut flera produkter från en access databas
Jag använder OLEDB, så här ser connectionstringen ut:
<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... :)
Svara
Sv: Slumpa ut flera produkter från en access databas
Skriv:
1 | ORDER BY RND(Timer() - IDFält) |
På så sätt blir varje anrop unikt.
Svara
Sv:Slumpa ut flera produkter från en access databas
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.
/Johan
Svara
Sv: Slumpa ut flera produkter från en access databas
Om man skickar in en konstan kommer den alltid att retunera samma värde.
Svara
Sv:Slumpa ut flera produkter från en access databas
Jo, uppenbarligen är det ju så. Men testa att skapa en fråga i Access med följande innehåll:
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?
/Johan
Svara
Sv: Slumpa ut flera produkter från en access databas
Hej och tack för att ni försöker hjälpa mig, men det blir ingen skillnad om jag skriver:
<code>
Order by RND(Timer() - prodID)
</code>
Det blir fortfarande samma 4 produkter som visas...
Har ni något annat förslag?
Svara
Sv:Slumpa ut flera produkter från en access databas
Jag har en här, som jag kör med och fungerar kanonbra.
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...
Svara
Sv: Slumpa ut flera produkter från en access databas
Den här modellen funkar.... för mig i alla fall...
Randomize
SQL = "SELECT TOP 4 * FROM Products ORDER BY Rnd(-CatalogID-" & Replace(Rnd(),",",".") & ") ASC"
Svara
Sv:Slumpa ut flera produkter från en access databas
KAn det vara så att din sida är cachad och inte för faller?
Svara
Sv: Slumpa ut flera produkter från en access databas
Nu har jag fått det att fungera genom att göra så här:
<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 :)
Svara
Sv:Slumpa ut flera produkter från en access databas
Du får då köra float:left resp right i divvarnas style
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.
Svara
Sv: Slumpa ut flera produkter från en access databas
Hej,
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.
Svara
Sv:Slumpa ut flera produkter från en access databas
<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>
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.
Svara
Sv: Slumpa ut flera produkter från en access databas
Jag löste de genom att göra så här:
<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...
Svara
Sv:Slumpa ut flera produkter från en access databas
Bra lösning!
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>
Svara
Sv: Slumpa ut flera produkter från en access databas
Det fungerade inte, då antalrader blev -1.
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!
Svara