|
La paginazione per grandi query A cura
di Nanni Bassetti (nannib@libero.it) http://digilander.iol.it/nannib
Chiunque abbia mai usato ASP per interrogare un database si è reso
conto che quando si effettuano query di grandi dimensioni (cioè che danno
un output di molti records), si finisce inevitabilmente per visualizzare
una lista lunghissima di records, con conseguente rallentamento dei tempi
di caricamento e di perdita della leggibilità. La soluzione c'è ! Con
ASP si possono "paginare" i risultati (come fanno i motori di ricerca) e
dividerli in pagine da n records per volta, per mezzo delle proprietà
PageSize, PageCount ed AbsolutePage dell'oggetto Recordset. La PageSize
indica quanti record devono essere contenuti in una pagina, mentre la
PageCount determina il numero totale di pagine e la AbsolutePage permette
di accedere alla pagina desiderata. Ma vediamo un esempio il file
MOTOR.ASP:
<% response.expires=0 %>
La proprietà expires dell'oggetto Response è
impostata a zero per il motivo che il browser, in genere, richiama una
pagina, in precedenza caricata, dalla CACHE e non dal server, quindi si
rischia di visualizzare sempre la stessa pagina, poichè la query inviata
dal programma in asp non si aggiorna. Insomma è come quando una
normale pagina web non viene caricata dal server ma direttamente dalla
cache, non riusciremo mai a vedere se a quell'URL c'è un aggiornamento
della pagina, a meno di non svuotare la cache del browser, ecco perchè
usiamo response.expires=0 questo forza il browser a richiamare il file
.asp dal server. Anche dal punto di vista delle risorse questo sistema
è più efficace della memorizzazione in RAM degli oggetti, infatti è molto
meglio rifare la query di volta in volta che conservere in memoria
oggetti di grandi dimensioni, che moltiplicati per il numero di utenti che
li stanno usando potrebbero mettere in crisi il server.
<HTML> <HEAD> <% tipo=request.form("select") if
tipo="tutte" then tipo="%"
Qui la variabile tipo viene caricata del valore proveniente da un form
in html, in cui c'è un tag <input type=".." name="select">
select case request.querystring("dir") case
"" session("curpage")=1 case
"Next" session("curpage")=session("curpage")+1 case
"Prev" session("curpage")=session("curpage")-1 end
select
Con questa select analizziamo la variabile "dir"
presa dalla querystring e ne leggiamo il contenuto, così da avere i
seguenti casi: se dir="Next" allora la variabile curpage si incrementa
di un'unità, se dir="Prev" curpage si decrementa di un'unità, se invece
dir="" allora curpage=1.
const adopenkeyset=3 dim objconnection dim
rs
if request.querystring("dir")="Next" or
request.querystring("dir")="Prev" then sql=request.form("sq") else
sql="select * from ita where tipologia like
'"&tipo&"' order by linea asc"
end if
Questa è il controllo sul fatto che se siamo già oltre la
prima schermata di paginazione, allora la stringa sql la deve prendere
dagli input "hidden" (li vedrete più in basso),
altrimenti la sql dimentica la variabile "tipo", perchè alla seconda
schermata (quando si schiaccia Prossima pagina), la variabile "tipo" chi
la trasmette ? Ecco perchè bisogna trasportarsi tutta la stringa sql con gli input type=hidden.
Set OBJdbConnection =
Server.CreateObject("ADODB.Connection") OBJdbConnection.Open
"corsetteria" set
rs=server.createobject("ADODB.recordset")
Qui c'è la solita connessione al database
"corsetteria" e la stringa sql che definisce la query che vogliamo
effettuare.
rs.pagesize=6 rs.open
sql,objdbconnection,adopenkeyset
Ecco che utilizziamo la proprietà pagesize, ossia
con rs.pagesize=6 stiamo imponendo al motor.asp di visualizzare pagine da
6 records per volta, chiaramente potremmo impostare il valore che ci pare
più appropriato alle nostre esigenze.
if
not rs.eof then ' se c'è almeno un record che
soddisfa la query allora procedi con l'esecuzione dello
script. rs.absolutepage=clng(session("curpage")) %>
Rs.AbsolutePage definisce la pagina che si sta
visualizzando, assumendo il valore numerico dalla variabile
"curpage".
<TITLE>Risultati della
ricerca</TITLE></HEAD> <body BGCOLOR="#000000"
TEXT="#FFFFFF" LINK="#0000FF" ALINK="#FF0000"
VLINK="#FF00FF"> <p> <div
align="center"> <table border="0"
width="547"> <center> <tr valign="top">
<td> <center> </center> <font
size="-1">Questi sono gli articoli che corrispondono meglio ai
criteri che avete utilizzato per la ricerca. Per visionare ogni
singolo prodotto in dettaglio, e per poterlo ordinare direttamente on
line, e' sufficiente <b>cliccare sulla relativa
immagine</b>.</font> <p> <p
align="center">Page <%=session("curpage")%> of
<%=rs.pagecount%> </p>
Prima di
generare la tabella contenente i risultati mostriamo il numero di pagina
(tramite la session("curpage")) e il numero totale di pagine da 6 records
che si sono generate (tramite la rs.pagecount).
<div align="center"> <table
border="1"> <tr> <% g=0 do while (not g=rs.pagesize)
and (not rs.eof) g=g+1 num=rs("id") %>
Inseriamo un Loop (ciclo) che non si ferma fintanto
che la variabile "g" non raggiunge la dimensione di rs.pagesize, cioè 6.
Quindi "g" sarà incrementata di uno per ogni record letto dal
database, quando saranno letti 6 records allora "g" sarà uguale a 6 e il
loop finirà.
<td> <b><%=g%></b> <a
href="prodotto.asp?id=<%=num%>"><img
src="prodotti/<%=rs("fotop")%>"> </a>
</td> <td bgcolor="#ffffc6"> <b><font
color="#000000">Articolo:</font></b> <font
color="#000000"><%=rs("articolo")%><br> <b>Marca:</b>
<a
href="prodotto.asp?id=<%=num%>"><%=rs("marca")%></a>
<br> <b>Tipo:</b> <%=rs("commento")%>
<br> <b>Linea:</b> <%=rs("linea")%>
<br> <b>Prezzo:</b> L. <%=rs("prezzo")%>
<br> rs.movenext loop %>
In quest'ultimo pezzo dello script c'è la visualizzazione del prodotto
"pescato" dal database, per mezzo della lettura dei campi
opportuni.
</tr> </table> </div> <center> <table> <tr> <td>
<%
if clng(session("curpage"))>1 then
%> <form action="motor.asp?dir=Prev"
method="post"> <input type="hidden" name="sq"
value="<%=sql%>"> <input
type="submit" value="Previous Page"> </form> <% end if
%> </td> <td></td> <td> <% if
clng(session("curpage"))<rs.pagecount then %> <form
action="motor.asp?dir=Next" method="post"> <input type="hidden"
name="sq" value="<%=sql%>"> <input type="submit"
value="Next Page"> </form> <% end if
%>
</td> </tr> </table> </center>
Questo pezzo di codice è molto importante, infatti
controlla se il numero di pagina è maggiore di 1 allora fa apparire il
tasto "Previous Page" che se cliccato invia sulla querystring la variabile
"dir" caricata col valore "Prev" ed in input "hidden" invia la stringa
sql, che altrimenti sarebbe stata dimenticata. Se invece il
numero di pagina è ancora minore del numero complessivo delle pagine,
allora appareil tasto "Next Page" che se cliccato invia sulla querystring
la variabile "dir" caricata col valore "Next". Chiaramente ricorderete
sicuramente che all'inizio dello script avevamo inserito il controllo
della variabile dir !
<% rs.close OBJdbConnection.close set
rs=nothing set objdbconnection=nothing %>
La chiusura del database, ricordatevi sempre di
inserirla !!!
</td> </tr> </center> </table> <%end if%> </div></BODY></HTML>
Bene questo è tutto, ora siete in grado di costruire un
piccolo Altavista...bhe' forse ho esagerato !
A presto !!! |