asp - asp.net - aspcode.it

COMMUNITY - Login
 Username:
 
 Password:
 
Voglio registrarmi!
Password dimenticata?
 Utenti on-line: 0
 Ospiti on-line: 12636
ASPCode.it - Store

  > > Articoli

Recordset ordinati randomicamente

Data di pubblicazione: 10/10/2002        Voto della community: 5,00 (Votanti: 2)

Prima o poi qualunque programmatore ASP si trova di fronte alla necessità di estrarre – da una tabella del DB – un record in maniera casuale (o, per meglio dire, pseudo-randomica).
Ad esempio, per un sito sulla culinaria (non è una parolaccia…), si vorrebbe mostrare in home page al visitatore una ricetta diversa ogni giorno (o addirittura ad ogni accesso alla pagina): questo per invogliare l'utente a tornare a visitare il sito.
Se il recupero del SINGOLO record (nell'ambito di un range ben definito) può considerarsi operazione abbastanza semplice, non così può dirsi per la selezione e la successiva visualizzazione in ordine casuale di un INTERO recordset.

La soluzione qui proposta è alquanto atipica (dal momento che non fa uso di nessun algoritmo di ordinamento randomico) ma proprio per questo credo che susciterà un certo interesse, soprattutto nei programmatori più “smanettoni”. :-)

Due avvertenze:   - 1. l'esempio fa uso della tabella Impiegati (“Employees” nella versione inglese) del database Northwind.mdb, fornito insieme ad Access.
Naturalmente – per adattarlo ai vostri bisogni – dovrete necessariamente cambiare tutti i riferimenti al suddetto database (stringa di connessione, SELECT, etc.).
  2. Viene fatto largo uso dell'oggetto Dictionary e del metodo MOVE dell'oggetto recordset, per cui consiglio caldamente una “ripassata” di entrambi, che aiuterà senz'altro a comprendere meglio il funzionamento dell'algoritmo proposto.

Ma ecco il listato (ampiamente commentato):

<HTML>
<BODY BGCOLOR="WHITE" TEXT="BLUE">
<CENTER>
<B><FONT FACE="Arial, Verdana" SIZE=5 COLOR="BLACK">Recordset's Random Display</FONT></B>
<P>

<%
Set rs = Server.CreateObject("adodb.recordset")
ConnStr = "Provider=Microsoft.Jet.Oledb.4.0;data source=" &_
  Server.MapPath("Northwind.mdb") & ";"
rs.activeconnection = ConnStr
rs.Source = "SELECT IDImpiegato FROM Impiegati" 'Seleziona gli ID degli Impiegati
rs.Open
arrID = rs.GetRows() ' Salva nell'array gli ID degli Impiegati
intRows = UBound(arrID,2) 'numero degli impiegati, meno uno (0..N-1)
rs.Close
rs.Source = "SELECT IDImpiegato, Cognome, Nome FROM Impiegati"
rs.CursorType = 0 ' adForwardOnly
rs.CursorLocation = 3 ' cursore lato client
rs.Open
Set rs.ActiveConnection = Nothing ' ci "stacchiamo" dalla sorgente dati%>

<P>
<TABLE BORDER=1><TR>

<% ' Mostra l'intestazione
For i = 0 to RS.Fields.Count - 1 %>
  <TD><B><% = RS(i).Name %></B></TD>
<% Next %>
</TR>

<% Set objDic = CreateObject("Scripting.Dictionary")

' Riempiamo il Dictionary con gli ID degli impiegati
For i = 0 To intRows
  objDic.Add arrID(0,i), arrID(0,i)
Next
Randomize Timer
For intCurrentRow = 0 To intRows
  intRnd = Int((intRows + 1) * RND) + 1 'ID random
  boolExists = objDic.Exists(intRnd)
  If boolExists Then ' se L'ID esiste nel Dictionary...
    rs.Move intRnd - 1, 1 ' ...muoviamo il puntatore sulla riga bersaglio...
    objDic.Remove(intRnd) ' ...e cancelliamo l'ID dal Dictionary
    ' Mostriamo il record selezionato casualmente%>
    <TR>
    <%For i = 0 to RS.Fields.Count - 1 %>
      <TD><% = rs(i) %></TD>
    <% Next %>
    </TR><%
  Else
    intCurrentRow = intCurrentRow - 1 ' se l'ID non esiste, ripetiamo lo stesso ciclo FOR
  End If
Next
rs.Close : Set RS = Nothing
Set objDic = Nothing
%>

</TABLE>
<TABLE>
<TR>
  <TD ALIGN="center">
    <input TYPE="Button" VALUE="Altro ordinamento" onClick="location.reload(true);">
  </TD>
</TR>
</TABLE>
<BR><BR>
</BODY>
</HTML>




Utenti connessi: 12636