Avatar billede celal Nybegynder
18. august 2004 - 15:05 Der er 19 kommentarer og
1 løsning

Udskriv records vilkårligt

Jeg skal have lavet en søge side, når man indtaster søge kriterierne skal der kune komme max 9 poster frem. de 9 poster skal frem på skærmen, men de skal komme i vilkårlig række følge. Dvs. at den samme række følge af posterne ikke må fremkomme hver gang man søger med samme søge kriterier.

Er der noget SQL-script som kan sørge for at posterne i tabelen bliver sorteret vilkårligt? dvs.
Avatar billede fennec Nybegynder
18. august 2004 - 15:10 #1
order by rand()
Avatar billede eagleeye Praktikant
18. august 2004 - 16:55 #2
Hvilken database bruger du?
Avatar billede celal Nybegynder
19. august 2004 - 09:06 #3
Jeg bruger Access 97
Avatar billede fennec Nybegynder
19. august 2004 - 09:42 #4
så er det:
order by rnd(id)

hvor id er feltnavnet på dit autonummeringsfelt.
Avatar billede celal Nybegynder
19. august 2004 - 10:46 #5
Okay, den udskriver i vilkårlig rækkefølge, men når jeg laver den samme søgning 2 gange, så får jeg præcis den samme vilkårlig rækkefølge ud. Det skal skal være ny række følge hvergang.
Avatar billede celal Nybegynder
19. august 2004 - 11:54 #6
Når jeg bruger "order by rnd(id)" i selve Access databasen, så virker det fint, og data kommer vilkårligt hvergang, men når jeg udskriver det til min asp side, så kommer det ens ud ved den samme søgning. Hvad kan det skyldes?

Jeg bruger følgende kode:


Function seek

strSQL ="SELECT * FROM Haandvaerker WHERE Aktiv= 1 And (Type =" & request.Form("R1") & " And Postnr = " & request.Form("postnr") & ")"

dim lock

lock =0

if request.Form("C1") <>"" then
    if lock =1 then
        strSQL = strSQL & " Or Produkt1 = " & request.Form("C1")
    else
        strSQL = strSQL & " And (Produkt1 = " & request.Form("C1")
        lock=1
    end if
end if


if request.Form("C2") <>"" then
    if lock =1 then
        strSQL = strSQL & " Or Produkt2 = " & request.Form("C2")
    else
        strSQL = strSQL & " And (Produkt2 = " & request.Form("C2")
        lock=1
    end if
end if


if request.Form("C3") <>"" then
    if lock =1 then
        strSQL = strSQL & " Or Produkt3 = " & request.Form("C3")
    else
        strSQL = strSQL & " And (Produkt3 = " & request.Form("C3")
        lock=1
    end if
end if

if lock = 1 Then
    strSQL = strSQL & ")"
end if

lock=0
strSQL = strSQL & " order by rnd(Id)"
seek=strSQL


end Function

'**********************************************************



<%
    makeDBConnection
    makeRS(seek)


if not rs.EOF then

%>

        <%= request.Form("navn")%><br>
        <%= request.Form("adresse1")%><br>
      <% if request.Form("adresse2")<>"" then %>
        <%= request.Form("adresse2")%><br>
      <% end if %>
        <%= request.Form("postnr")%>  <%= request.Form("city")%> </font></font>
        <br><br>
        <hr>

<%

dim count

count = 0

    rs.movefirst
    Do while Not rs.EOF and count<9

%>
      <table border="0" cellpadding="0" cellspacing="0" width="100%" height="69">
          <tr>
            <td valign="middle" width="38%" height="16">
                <font face="Arial" size="2"><%=rs("Firmanavn")%></font></td>
            <td valign="top" width="13%" height="16">
                <font face="Arial" size="2">Telefon:</font></td>
            <td valign="top" width="35%" height="16">
                <font face="Arial" size="2"><%=rs("Telefon")%></font></td>
            <td valign="top" width="206%" align="left" height="16">
                <i><font face="Arial" size="2">Produkter:</font></i></td>
          </tr><tr>
            <td valign="middle" width="43%" height="19">
                <font face="Arial" size="2"><%=rs("Adresse1")%></font></td>
            <td valign="top" width="13%" height="19">
                <font face="Arial" size="2">Fax:</font></td>
            <td valign="top" width="35%" height="19">
                <font face="Arial" size="2"><%=rs("Fax")%></font></td>

        <% if rs("Produkt1") =1 then %>
                <td valign="top" width="206%" align="left" height="19">
                <font face="Arial" size="2">Energiruder</font></td>

        <% else %>
                <td valign="top" width="206%" align="left" height="19">
                <font face="Arial" size="2">----------</font></td
        <% end if %>

          </tr>
          <tr>
            <td valign="middle" width="43%" height="19">
                <font face="Arial" size="2"><%=rs("Postnr")%> &nbsp;<%=rs("City")%></font></td>
            <td valign="top" width="13%" height="19">
                <font face="Arial" size="2">E-mail:</font></td>
            <td valign="top" width="35%" height="19">
                <font face="Arial" size="2"><%=rs("Email")%></font></td>

        <% if rs("Produkt2") =1 then %>
            <td valign="top" width="206%" align="left" height="19">
                <font face="Arial" size="2">Energivinduer</font></td>
        <% else %>
                    <td valign="top" width="206%" align="left" height="19">
                    <font face="Arial" size="2">----------</font></td
        <% end if %>



          </tr>
          <tr>
            <td valign="middle" width="43%" height="15">
                <font face="Arial" size="2">&nbsp;</font></td>
            <td valign="top" width="13%" height="15">
                <font face="Arial" size="2">Hjemmeside:</font></td>
            <td valign="top" width="35%" height="15">
                <font face="Arial" size="2"><%=rs("Hjemmeside")%></font></td>

        <% if rs("Produkt3") =1 then %>
                <td valign="top" width="206%" align="left" height="15">
                <font face="Arial" size="2">E.F.løsninger</font></td>

        <% else %>
                <td valign="top" width="206%" align="left" height="19">
                <font face="Arial" size="2">----------</font></td
        <% end if %>

          </tr>
          </table>

      <hr>
<%
        rs.movenext
        count = count +1
    loop

    count =0

%>


        <input Onclick="print()" type="submit" name="sendknap" value="Udskriv resultat og adresseetiket">&nbsp;&nbsp;[ <font face="Arial" size="2"><a href="#" onclick="window.history.go(-1)"><u>
        Tilbage</u></a></font>  ]<hr>
      <h5>&nbsp;</h5>
    </td>
  </tr>
</table>

<%
else
%>
Avatar billede fennec Nybegynder
19. august 2004 - 12:05 #7
Vi kan jo prøve at bruge ASP randomfunk til at generere et tal.

randomize
strSQL = strSQL & " order by rnd("& rnd() &")"
Avatar billede celal Nybegynder
19. august 2004 - 12:33 #8
Jeg får gølgende fejl, når jeg bruger strSQL = strSQL & " order by rnd("& rnd() &")"

Error Trapped

Wrong number of arguments used with function in query expression 'rnd(0,7055475)'.

while reading from DB

SELECT * FROM Haandvaerker WHERE Aktiv= 1 And (Type =1 And Postnr = 2750) And (Produkt1 = 1 Or Produkt2 = 1 Or Produkt3 = 1) order by rnd(0,7055475)
Avatar billede fennec Nybegynder
19. august 2004 - 12:38 #9
Det skal vist være et heltal.
strSQL = strSQL & " order by rnd("& round(10000*rnd()) &")"
Avatar billede celal Nybegynder
19. august 2004 - 12:48 #10
hmmm forstår det ikke, følgende SQL søtning bliver genereret:

SQL = SELECT * FROM Haandvaerker WHERE Aktiv= 1 And (Type =1 And Postnr = 2750) And (Produkt1 = 1 Or Produkt2 = 1 Or Produkt3 = 1) order by rnd(5334)

Talet rnd(5334) er det samme under alle søgninger... Hvad gå galt? burde dette tal ikke være forskellig for hvergang man søger?
Avatar billede fennec Nybegynder
19. august 2004 - 12:54 #11
har du randomize til at stå på linjen før???
Avatar billede celal Nybegynder
19. august 2004 - 13:12 #12
talet ændre sig efter jeg har smidt randomize  ind, men søgningen er stadig ens. Der er ingen ændringer
Avatar billede fennec Nybegynder
19. august 2004 - 13:19 #13
Hvad så hvis vi smide ID'et med også....
strSQL = strSQL & " order by rnd(id+"& round(10000*rnd()) &")"
Avatar billede celal Nybegynder
19. august 2004 - 13:36 #14
nej, det er det samme.
Kan det have noget med min recordset at gøre?
Avatar billede fennec Nybegynder
19. august 2004 - 13:58 #15
næppe.

Har undersøgt det lidt. Det lader til at den eneste løsning, der er i access, kræver at du laver et modul.

Function Randomizer() As Integer
Static AlreadyDone As Integer
  If AlreadyDone = False Then Randomize: AlreadyDone = True
  Randomizer = 0
End Function

Du må IKKE kalde modulet Randomizer når du gemmer det. Evt "Module1".

SELECT * FROM Haandvaerker where (...andre check...) and (randomizer()=0) order by rnd(isnull(Haandvaerker.id)*0+1)
Avatar billede celal Nybegynder
19. august 2004 - 14:09 #16
Jeg får følgende fejl:

Error Trapped

Undefined function 'Randomizer' in expression.

while reading from DB

SELECT * FROM Haandvaerker WHERE Aktiv= 1 And (Type =1 And Postnr = 2750) And (Produkt1 = 1 Or Produkt2 = 1 Or Produkt3 = 1)and (Randomizer()=0) order by rnd(isnull(Haandvaerker.Id)*0+1)
Avatar billede celal Nybegynder
19. august 2004 - 14:10 #17
Du vd godt at det er ASP som jeg koder?
Avatar billede fennec Nybegynder
19. august 2004 - 14:44 #18
jeps, men det burde være lige meget. Funktionen skal ligge på Access databasen som et VBscript under Moduler. Er det der du har lavet det????
Avatar billede eagleeye Praktikant
19. august 2004 - 17:01 #19
Det med modulet har jeg også forsøgt :) men det virker kun inde i Access og ikke igennem SQL udefra. Sikket på grund af sikkerhed.

Der er en metode som jeg har fået til at virke:
<%
randomize
R=clng(100000*rnd)
SQL = "SELECT * FROM Tabel ORDER BY rnd(-(ID)*" & R & ")"
%>


Så du kan rette denne linje:

strSQL = strSQL & " order by rnd(Id)"


til disse:

randomize
R=clng(100000*rnd)
strSQL = strSQL & " order by rnd(-(ID)*" & R & ")"
Avatar billede celal Nybegynder
23. august 2004 - 09:45 #20
eagleeye: det virker, du er for syg til det der!!

Kan du ikke lige skrive nogle komentare til koden, så jeg hved hvad der sker?
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