Avatar billede stkol Nybegynder
07. september 2005 - 17:47 Der 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??

Jeg glæder mig til at høre fra jer!!

Mvh

Stig :-)
Avatar billede stkol Nybegynder
07. september 2005 - 17:51 #1
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!

/Stig :-)
Avatar billede nielle Nybegynder
07. september 2005 - 18:04 #2
En mulig løsning kunne være lavet over denne skabelon:

SQL = "SELECT TOP 5 katID FROM kategorier ORDER BY Rnd()"
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()"
    Set rsProd = Conn.Execute(SQL)

    If Not rsProd.EOF Then
        Response.Write rsProd("produktNavn") & "<br>"
    End If   

    rsKat.MoveNext
Loop
Avatar billede stkol Nybegynder
07. september 2005 - 18:20 #3
Hej Nielle (Tak for hurtigt svar :-))

Jeg skal lige høre dig, imens jeg prøver scriptet af, er Rnd() en indbygget ASP funktion??

/Stig :-)
Avatar billede nielle Nybegynder
07. september 2005 - 18:30 #4
Der er en random i ASP, men den jeg har angivet er nu den tilsvarende funktion fra Access eller MS SQL - altså databasen.
Avatar billede stkol Nybegynder
07. september 2005 - 18:35 #5
Fint nok :-) det er nok også det bedste at bruge!! Jeg kigger lige på det og så hører du fra mig *S
Avatar billede softspot Forsker
07. september 2005 - 18:36 #6
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".
Avatar billede stkol Nybegynder
07. september 2005 - 19:44 #7
Jeg får følgende fejl

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)

        If Not FrontProdrs.EOF Then
    %>

    <table align="right" style="width: 195px" cellspacing="0" cellpadding="0" border="1">
    <tr>
        <td style="width: 195px" align="center"><font face="Verdana" size="2"><b><%=FrontProdrs("VARENR")%></b></font></td>
    </tr>
    </table>

    <%
        End If                   
    %>
   
    </td>
</tr>

            <%
    rsKat.MoveNext
    Loop
%>


Linie 782 er:

Set katrs = katConn.Execute(katSql)
Avatar billede nielle Nybegynder
07. september 2005 - 19:54 #8
Den brokker sig over CLng som altså ikke er kendt i (din version af) SQL Server. Har du prøvet mit oprindelige forslag?
Avatar billede stkol Nybegynder
07. september 2005 - 19:55 #9
Det nåede jeg ikke, men det gør jeg nu ;-)
Avatar billede softspot Forsker
07. september 2005 - 19:58 #10
Det kan være den funktion hedder lng alternativt int eller cint...
Avatar billede stkol Nybegynder
07. september 2005 - 19:58 #11
Hmm.. Nu bliver det spøjst, den brokker sig også over Rnd()

Microsoft OLE DB Provider for SQL Server error '80040e14'
'Rnd' is not a recognized function name.

/mainsite/main.asp, line 782
Avatar billede softspot Forsker
07. september 2005 - 19:59 #12
Ahaaa... SQL Server, det kunne være det fungerer lidt anderledes deri :)
Avatar billede softspot Forsker
07. september 2005 - 19:59 #13
Og hvis den oprindelige ikke fungerer så hedder den funktioner der konverterer til int jo cast(feltnavn as int)...
Avatar billede stkol Nybegynder
07. september 2005 - 20:02 #14
WOW!! Nu blev jeg forvirret!! vil det så sige at jeg skal lave

Rnd(-1 * cint(menuid))

om til

cast(feltnavn as int)

eller hur??
Avatar billede softspot Forsker
07. september 2005 - 20:06 #15
Nej, følg i første omgang det nielle foreslog og vend tilbage hvis det ikke fungerer...
Avatar billede stkol Nybegynder
07. september 2005 - 20:08 #16
Ja, men det har jeg prøvet og der brokker den sig over Rnd() ...
Avatar billede softspot Forsker
07. september 2005 - 20:10 #17
Prøv med RAND
Avatar billede stkol Nybegynder
07. september 2005 - 20:18 #18
Ja, nu brokker den sig da ikke mere, men der kommer bare ikke noget frem på siden..
Avatar billede nielle Nybegynder
07. september 2005 - 20:21 #19
Hvordan ser din nuværende kode ud?
Avatar billede softspot Forsker
07. september 2005 - 20:21 #20
Kommer der noget hvis du fjerner ORDER BY RAND()?
Avatar billede stkol Nybegynder
07. september 2005 - 20:23 #21
Jeg har lige prøvet at skrive SQL ud på skærmen hvilket giver dette:

SELECT TOP 1 VARENR, KALDENAVN, KOSTPRIS, BILLEDFIL FROM VarerSQL WHERE VAREGRUPPE=1 AND SHOWFRONT='j' AND LAGERANTAL <= 1 ORDER BY RAND() 

SELECT TOP 1 VARENR, KALDENAVN, KOSTPRIS, BILLEDFIL FROM VarerSQL WHERE VAREGRUPPE=2 AND SHOWFRONT='j' AND LAGERANTAL <= 1 ORDER BY RAND() 

SELECT TOP 1 VARENR, KALDENAVN, KOSTPRIS, BILLEDFIL FROM VarerSQL WHERE VAREGRUPPE=3 AND SHOWFRONT='j' AND LAGERANTAL <= 1 ORDER BY RAND() 

SELECT TOP 1 VARENR, KALDENAVN, KOSTPRIS, BILLEDFIL FROM VarerSQL WHERE VAREGRUPPE=4 AND SHOWFRONT='j' AND LAGERANTAL <= 1 ORDER BY RAND() 

SELECT TOP 1 VARENR, KALDENAVN, KOSTPRIS, BILLEDFIL FROM VarerSQL WHERE VAREGRUPPE=5 AND SHOWFRONT='j' AND LAGERANTAL <= 1 ORDER BY RAND() 


Det er som om den IKKE laver Random på kategorierne!! ????
Avatar billede stkol Nybegynder
07. september 2005 - 20:24 #22
Koden ser 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 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)

        If Not FrontProdrs.EOF Then
    %>

    <table align="right" style="width: 195px" cellspacing="0" cellpadding="0" border="1">
    <tr>
        <td style="width: 195px" align="center"><font face="Verdana" size="2"><b><%=FrontProdrs("VARENR")%></b></font></td>
    </tr>
    </table>

    <%
        End If                   
    %>
   
    </td>
</tr>

            <%
    katrs.MoveNext
    Loop
%>
Avatar billede stkol Nybegynder
07. september 2005 - 20:26 #23
Nope, der kommer heller ikke noget hvis jeg fjerner dem!!
Avatar billede softspot Forsker
07. september 2005 - 20:26 #24
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)"
Avatar billede nielle Nybegynder
07. september 2005 - 20:28 #25
Doh! I stedet for Rand() skal du bruge NewId().
Avatar billede softspot Forsker
07. september 2005 - 20:31 #26
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)...
Avatar billede softspot Forsker
07. september 2005 - 20:32 #27
nielle >> Men der kommer slet ikke data selvom rand bliver taget helt ud af forspørgslen... så det er vel ikke det umiddelbare problem... eller hvad?
Avatar billede stkol Nybegynder
07. september 2005 - 20:33 #28
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!!
Avatar billede nielle Nybegynder
07. september 2005 - 20:35 #29
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.
Avatar billede softspot Forsker
07. september 2005 - 20:37 #30
Jeg ville umiddelbart sørge for at få data frem først og så begynde at komplicere tingene, det andet virker omvendt :)

Men det skal jeg nok lade være at blande mig i... :)
Avatar billede stkol Nybegynder
07. september 2005 - 20:39 #31
Det løste ihvertfald det problem ;-)

SELECT TOP 1 VARENR, KALDENAVN, KOSTPRIS, BILLEDFIL FROM VarerSQL WHERE VAREGRUPPE=6 AND SHOWFRONT='j' AND LAGERANTAL <= 1 ORDER BY NewId() 

SELECT TOP 1 VARENR, KALDENAVN, KOSTPRIS, BILLEDFIL FROM VarerSQL WHERE VAREGRUPPE=4 AND SHOWFRONT='j' AND LAGERANTAL <= 1 ORDER BY NewId() 

SELECT TOP 1 VARENR, KALDENAVN, KOSTPRIS, BILLEDFIL FROM VarerSQL WHERE VAREGRUPPE=2 AND SHOWFRONT='j' AND LAGERANTAL <= 1 ORDER BY NewId() 

SELECT TOP 1 VARENR, KALDENAVN, KOSTPRIS, BILLEDFIL FROM VarerSQL WHERE VAREGRUPPE=8 AND SHOWFRONT='j' AND LAGERANTAL <= 1 ORDER BY NewId() 

SELECT TOP 1 VARENR, KALDENAVN, KOSTPRIS, BILLEDFIL FROM VarerSQL WHERE VAREGRUPPE=3 AND SHOWFRONT='j' AND LAGERANTAL <= 1 ORDER BY NewId()
Avatar billede nielle Nybegynder
07. september 2005 - 20:41 #32
Ok så. Hvad kommer der nu ud på skærmen - samt i Vis Kilde?
Avatar billede nielle Nybegynder
07. september 2005 - 20:43 #33
Burde det forresten ikke være:

... LAGERANTAL >= 1 ...

?
Avatar billede stkol Nybegynder
07. september 2005 - 20:45 #34
Den giver ikke noget på skærmen, og kun følgende i Vis Kilde:

    <table align="right" style="width: 195px" cellspacing="0" cellpadding="0" border="1">
    <tr>
        <td style="width: 195px" align="center">
        </td>
    </tr>
    <tr>
        <td style="width: 195px" align="center">
        </td>
    </tr>
    <tr>
        <td style="width: 195px" align="center">
        </td>
    </tr>
    <tr>
        <td style="width: 195px" align="center">
        </td>
    </tr>
    <tr>
        <td style="width: 195px" align="center">
        </td>
    </tr>
    </table>
Avatar billede nielle Nybegynder
07. september 2005 - 20:48 #35
Det tyder jo på at dine SQL-sætninger:

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?
Avatar billede stkol Nybegynder
07. september 2005 - 20:49 #36
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 :-)
Avatar billede nielle Nybegynder
07. september 2005 - 20:50 #37
... og ser resultaterne så fornuftige ud?
Avatar billede stkol Nybegynder
07. september 2005 - 20:52 #38
TUSIND Tak skal i have!! det virker jo fortrinligt!!

Nu har jeg lidt af et problem med point givningen, er det OK for jer at jeg deler point mellem jer 40/60??
Avatar billede nielle Nybegynder
07. september 2005 - 20:53 #39
Det bestemmer du helt selv ... jeg har intet imod at dele :^)

... og et svar fra mig :^)
Avatar billede stkol Nybegynder
07. september 2005 - 20:53 #40
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!!
Avatar billede softspot Forsker
07. september 2005 - 20:57 #41
Du giver dem bare til nielle, da det var nielle's løsning der fungerede, ellers tak for budet :)
Avatar billede stkol Nybegynder
07. september 2005 - 21:00 #42
Det er bare iorden!! Det er hermed gjordt *S I får mange tak for jeres kvikke hjælp *S ;-)
Avatar billede nielle Nybegynder
07. september 2005 - 21:02 #43
Jamen så bukker jeg pænt og siger tak :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester