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.
<%
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
%>