In ogni applicazione Web, o in ogni sito o portale, capita di avere delle sezioni in cui è necessario stampare a video una serie di record in cascata, ad esempio i nomi degli iscritti ad un nostro servizio interno. Ovviamente non conosciamo a priori il numero di iscritti, quindi il numero di record è variabile e, auspicabilmente, in continua crescita. Supponiamo di avere una media di 10 iscrizioni al giorno: vuol dire avere pressappoco 300 iscritti al mense, quindi più di 300 iscritti all’anno.
Credete sia possibile mostrare a video 3000 record contemporaneamente? C’è chi potrebbe dire di si ed in fin dei conti non è impossibile, ma la risposta ve la do io: NO! per tre buoni motivi:
- la pagina diventerebbe oltremodo lunga;
- si sottopone il DBMS e la CPU del server ad uno sforzo disumano;
- in funzione del motivo precedente i tempi di caricamento sarebbero epici.
Inoltre il sistema della paginazione dei record oltre a tornare utile è anche molto elegante a vedersi e decisamente professionale. Per paginazione si intende la divisione fittizia dei record risultanti da una stessa query in più pagine, dove la pagina in effetti è sempre la stessa ma i risultati cambiano in funzione della scelta del numero di pagina sfogliato, il cui valore, in genere, viene passato ad una QueryString.
Ci serviremo del database database.mdb composto dalla tabella utenti composta a sua volta dal solo campo nome in cui inseriremo almeno una ventina di nomi di nostri amici, al fine di ottenere un esempio valido visivamente e funzionalmente ottimale.
Create la cartella test sul vostro server Web personale ed assegnatele tutti i diritti almeno in lettura; al suo interno inserite sia il database che il file test.asp di cui segue la prima parte di codice opportunamente commentata:
<%@LANGUAGE = VBScript%>
<%
' DEFINISCO LE VARIABILI CHE MI SERVONO PER L'APPLICAZIONE
Dim sc, cn, rs, quanti, pag, contatore
' DEFINISCO LA STRINGA DI CONNESSIONE
sc = ""
sc = sc & "driver={Microsoft Access Driver (*.mdb)};dbq="
sc = sc & Server.MapPath("database.mdb")
' IMPOSTO LA CONNESSIONE EDIL RECORDSET
Set cn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
' APRO LA CONNESSIONE COL DATABASE
cn.Open sc
' DEFINISCO IL NUMERO DI RECORD DA VISUALIZZARE PER OGNI PAGINA
quanti = 5
' RECUPERO IL NUMERO DI PAGINA CORRENTE
' E CONTROLLO CHE NON SIA INFERIORE A 1
pag = Request.QueryString("pag")
If IsNumeric(pag) = False Or pag < 1 Then pag = 1
' IMPOSTO UN CONTATORE
contatore = 0
%>
<html>
<head>
<title>Paginazione dei risultati di query molto lunghe in ASP</title>
<style>a { color: blue; }</style>
</head>
<body>
<table align="center" width="300" border="1">
<%
' APRO IL RECORDSET
rs.Open "SELECT nome FROM utenti ORDER BY nome ASC", cn, 1
' EFFETTUO MATERIALMENTE LA PAGINAZIONE
rs.PageSize = quanti
rs.AbsolutePage = pag
' ESEGUO IL CICLO
While rs.EOF = False And contatore < quanti
%>
<tr><td><%=rs("nome")%></td></tr>
<%
rs.MoveNext
' INCREMENTO IL VALORE DEL CONTATORE
contatore = contatore + 1
Wend
%>
</table>
</body>
</html>
<%
' UN PO DI PULIZIA...
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
%>
A questo punto otteniamo una semplice tabella HTML che mostra solo i primi 5 record (numero stabilito stesso nel codice dell’esempio) della query, ma siamo impossibilitati ad andare avanti perchè manca una sorta di menu di navigazione.
Il menu di navigazione che andiamo adesso a costruire è semplice e professionale al tempo stesso: mostra i numeri delle pagine disponibili, ognuna delle quali ospiterà i 5 record successivi stabiliti nel codice di esempio; mostrerà anche dei link di tipo Avanti e Indietro, tranne se ci si trova alla pagina iniziale e quindi è inutile andare indietro, e tranne se ci si trova all’ultima pagina, caso in cui è inutile andare avanti.
Di seguito un’immagine che mostra la tabella HTML ed il menu in funzione del fatto che ci si trovi alla prima pagina

Ecco come apparirà il menu alla seconda pagina

Oltre a vedere anche il numero di pagina corrente evidenziato in grassetto, potete notare che i record contenuti nella tabella HTML sono diversi da quelli mostrati nell’immagine precedente.
Di seguito il codice del menu di navigazione da inserire dopo la chiusura della tabella e prima della chiusura del boy della pagina
<p align="center">
<%If pag > 1 Then%>
<a href="test.asp?pag=<%=pag-1%>">Indietro</a>
<%End If%>
<%
Dim x
x = 1
For x = 1 To rs.PageCount
If CInt(pag) <> x Then
%>
[<a href="test.asp?pag=<%=x%>"><%=x%></a>]
<%
Else
%>
[<a href="test.asp?pag=<%=x%>"><b><%=x%></b></a>]
<%
End If
Next
%>
<%If rs.EOF = False Then%>
<a href="test.asp?pag=<%=pag+1%>">Avanti</a>
<%End If%>
</p>
Unite quindi i due codici e lanciate il file all’indirizzo
http://localhost/test/test.asp
e buona navigata tra i vostri record!
