07. september 2005 - 17:47Der er
42 kommentarer og 1 løsning
Random funktion til visning af produkter udfra nogle kriterier!
Hejsa
Jeg skal have lavet en random funktion som egentlig laver 2 randoms!
Der skal vises ca 5 produkter på siden som skal komme fra 5 kategorier! dvs hvis der er 10 kategorier af produkter, skal der findes 5 tilfældige af disse som skal skrives ud på siden. Når disse fem er fundet, skal der for hvert af disse kategorier findes et produkt som skal vises på sitet, dette produkt skal findes udfra nogle værdier i DB som indikerer om den skal være med på forsiden!
Er der en der er frisk på at hjælpe mig med at lave en sådan funktion??
Danmark vil mindske afhængigheden af globale techgiganter, men det kræver mere end politiske formuleringer og strategier, understreger PROSA’s formand Niels Bertelsen.
Jeg glemte lige at fortælle at der er en tabel som definerer kategorier, og en tabel som viser produkter, hvor et id i produkt tabellen er lig et felt i Kategori tabellen!
Jeg tror faktisk du er nød til at bruge flg. variant af nielle's kode for at det kommer til at fungere:
SQL = "SELECT TOP 5 katID FROM kategorier ORDER BY Rnd(-1 * CLng(katID))" Set rsKat = Conn.Execute(SQL)
Do While Not rsKat.EOF KatID = rsKat("katID")
SQL = "SELECT TOP 1 produktNavn FROM produkter WHERE katID=" & KatID & " AND visPaaForside='ja' ORDER BY Rnd(-1 * CLng(tableID))" Set rsProd = Conn.Execute(SQL)
If Not rsProd.EOF Then Response.Write rsProd("produktNavn") & "<br>" End If
rsKat.MoveNext Loop
I den sidste (nestede) query skal tableID udskiftes med det som er ID for tabellen "produkter".
Microsoft OLE DB Provider for SQL Server error '80040e14' 'CLng' is not a recognized function name.
/mainsite/main.asp, line 782
Min kode ser nu sådan her ud:
<%
'####### Kategori ############ '## Create db objects and SQL set katConn = Server.CreateObject("ADODB.Connection") katConn.CursorLocation = 3 katConn.Open Application("ConnectString") Set katrs = Server.CreateObject("ADODB.Recordset")
katSql = "SELECT TOP 5 menuid FROM prodmenu ORDER BY Rnd(-1 * CLng(menuid))"
Set katrs = katConn.Execute(katSql)
Do While Not katrs.EOF KatID = katrs("menuid")
%> <tr> <td style="width: 195px" align="center">
<%
'####### ForsideProdukter ############ '## Create db objects and SQL set FrontProdConn = Server.CreateObject("ADODB.Connection") FrontProdConn.CursorLocation = 3 FrontProdConn.Open Application("ConnectString") Set FrontProdrs = Server.CreateObject("ADODB.Recordset")
FrontProdSql = "SELECT TOP 1 VARENR, KALDENAVN, KOSTPRIS, BILLEDFIL FROM VarerSQL WHERE VAREGRUPPE=" & KatID & " AND SHOWFRONT='j' AND LAGERANTAL <= 1 ORDER BY Rnd(-1 * CLng(id))"
Set FrontProdrs = FrontProdConn.Execute(FrontProdSql)
'####### Kategori ############ '## Create db objects and SQL set katConn = Server.CreateObject("ADODB.Connection") katConn.CursorLocation = 3 katConn.Open Application("ConnectString") Set katrs = Server.CreateObject("ADODB.Recordset")
katSql = "SELECT TOP 5 menuid FROM prodmenu ORDER BY RAND()"
'response.write katSql 'response.end
Set katrs = katConn.Execute(katSql)
Do While Not katrs.EOF KatID = katrs("menuid")
%> <tr> <td style="width: 195px" align="center">
<%
'####### ForsideProdukter ############ '## Create db objects and SQL set FrontProdConn = Server.CreateObject("ADODB.Connection") FrontProdConn.CursorLocation = 3 FrontProdConn.Open Application("ConnectString") Set FrontProdrs = Server.CreateObject("ADODB.Recordset")
FrontProdSql = "SELECT TOP 1 VARENR, KALDENAVN, KOSTPRIS, BILLEDFIL FROM VarerSQL WHERE VAREGRUPPE=" & KatID & " AND SHOWFRONT='j' AND LAGERANTAL <= 1 ORDER BY RAND()"
Response.write FrontProdSql
Set FrontProdrs = FrontProdConn.Execute(FrontProdSql)
Det er er så her jeg foreslår dig at prøve dette trick (fordi jeg har set det fungere i Access - som ikke skal sammenlignes med SQL Server på nogen måde i øvrigt! :)):
katSql = "SELECT TOP 5 menuid FROM prodmenu ORDER BY Rnd(-1 * menuid)"
og
FrontProdSql = "SELECT TOP 1 VARENR, KALDENAVN, KOSTPRIS, BILLEDFIL FROM VarerSQL WHERE VAREGRUPPE=" & KatID & " AND SHOWFRONT='j' AND LAGERANTAL <= 1 ORDER BY Rnd(-1 * id)"
OK, hvis der ikke kommer noget når du fjerner ORDER BY, så har det jo ikke noget med random-funktionen at gøre (hvilket da heller ikke var oplagt). Så det må nødvendigvis være dit datagrundlag som er anderledes end du forventer.
Prøv at kigge på data i databasen og se om du selv kan finde nogle rækker som burde komme frem (ved det er svært med en tilfældighedsgenerator i ligningen)...
Det giver heller ikke noget på skærmen, jeg prøvede først med Rnd(-1 * id), som fejlede og så lavede jeg det om til Rand(-1 * id), som så ikke brokker sig, men ikke giver noget resultat!!
Ved at bruge NewId() i stedet for Rand() skulle problemet med random - 07/09-2005 20:23:26 - gerne blive løst. Derefter kan vi tage fat på det næste - det med det manglende output.
SELECT TOP 1 VARENR, KALDENAVN, KOSTPRIS, BILLEDFIL FROM VarerSQL WHERE VAREGRUPPE=8 AND SHOWFRONT='j' AND LAGERANTAL <= 1 ORDER BY NewId()
- ikke giver nogle hits. Har du en mulighed for at fyre en af dem af direkte mod databasen via Enterprise eller hvad du nu bruger til at manipulere din database?
Nå ja!! Jeg tager lige og sparker mig selv MEGET hårdt bagi!!!! Jov, nielle du har helt ret det skal selvfølgelig være >= 1, hvilket nu også giver resultater *SS :-)
Yes det gør de !! Der er forskellige hvergang jeg reloader, det er jo kanont, jeg var bange for at der skulle 5 gange så meget kode til, for at få det til at virke!!
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.