|

VISUALIZZARE I RECORD PRESENTI IN UN DATABASE CON 'PAGINAZIONE'

Abbiamo
visto nelle pagine precedenti come sia possibile,con
una semplice pagina ASP, visualizzare il contenuto di
un database.
Se
però i record di un database sono numerosi, potrebbe
essere utile suddividere su più pagine tale elenco,
un po’ come fanno i motori di ricerca: se i risultati
di un’interrogazione sono numerosi visualizzano venti
risultati sulla prima pagina, venti sulla seconda...
e così via, fino a completarne la visualizzazione.
In
questo modo se, per esempio, nel database sono presenti
100 record, anziché visualizzarli tutti in un’unica
pagina può essere più utile suddividerli in gruppi da
dieci l’uno.
Chiameremo
questo modo di procedere ‘paginazione’.
Un
esempio di paginazione è visibile nella sezione ‘Search’
del sito AmicoPc raggiungibile all'indirizzo http://www.amicopc.com/search/index.asp
, inserendo ‘computer’ come parola chiave.
Vediamo
come la precedente pagina ASP dovrà essere modificata
(per comodità facciamo riferimento al database ‘link.mdb’
che dovrà avere almeno 6 record).
Per
la compilazione di questo codice ho preso spunto dal
sito http://www.asp101.com/samples/db_paging.asp
a cui vi rimando per ulteriori approfondimenti
PAGINAZIONE.ASP
Innanzitutto
dobbiamo includere il file ‘adovbs.inc’ all’interno
della nostra pagina: tale file contiene delle costanti
che utilizzeremo nel nostro codice e lo potete trovare
anche sul vostro computer, facendo clic su ‘Start ->
Trova’ e inserendo, come nome del file, ‘adovbs.inc’.
Una
volta che l’avete trovato occorre copiarlo nella stessa
cartella del file ‘paginazione.asp’.
Poi
apriamo il Blocco Note e scriviamo
|
<!--
#INCLUDE FILE="adovbs.inc" -->
|
A
questo punto cominciamo a definire un po’ di variabili
che utilizzeremo all’interno del nostro codice
|
<%
Dim
conn
'La solita variabile di connessione
Dim
iPageSize
'Numero di record da visualizzare per ogni pagina
Dim
iPageCount
'Numero di pagine totali che otteniamo dalla query
Dim
iPageCurrent
'Pagina corrente
Dim
strOrderBy
'Parametro in base a cui definire l'ordinamento
Dim
strSQL
'Comando da eseguire per effettuare la ricerca
Dim
RS
'Il nostro solito recordSet
Dim
iRecordsShown
'Variabile usata per definire i record mostrati
|
Come
potete vedere dal codice qua sopra a destra ho inserito
dei commenti per spiegare a che cosa servono le variabili
utilizzate: per evitare che il commento venga processato
è sufficiente anteporvi un’apostrofo. In questo modo
ciò che segue non viene eseguito.
A
questo punto definiamo il numero di record che devono
essere visualizzati per ogni pagina (in questo caso
sono cinque)
Il
link ‘Avanti’, come vedremo, ha una struttura del tipo:
paginazione.asp?page=‘pagina_corrente+1’
&order= ‘criterio_ordinamento’
ovvero
richiama questo stesso file, ma vi aggiungiamo il parametro
‘page’ che avrà come valore il numero della pagina corrente
aumentato di uno (per cui se siamo sulla prima pagina
il link ‘avanti’ sarà del tipo ‘paginazione.asp?page=2’);
inoltre riportiamo anche il parametro ‘order’ che server
per ottenere l’ordinamento in base al criterio specificato
(anche se di default noi ordiniamo i risultati in base
all’id - ovvero il contatore - decrescente)
Il
link così fatto ha il solo scopo di passare informazioni
da una pagina all’altra (o in questo caso alla stessa
pagina): infatti noi prendiamo il valore assunto da
tale parametro ‘page’ e ci regoliamo di conseguenza.
Se
‘page=3’ significa che la pagina dovrà visualizzarmi
i record dal numero 11 al numero 16 (in quanto
nelle due precedenti pagine mi ha già mostrato 5 record
per pagina).
Se
‘page’ non ha nessun valore significa che siamo sulla
pagina numero uno: infatti per visualizzare la pagina
noi digitiamo semplicemente ‘paginazione.asp’, senza
niente. Solo per le pagine successive utilizzeremo il
parametro ‘page’.
Pertanto
prendiamo il valore di 'page' dall’indirizzo da cui
siamo giunti mediante la funzione ‘request.querystring(“parametro”)’
che abbiamo già avuto modo di utilizzare.
Se
tale valore è nullo (If Request.QueryString("page")
= "") allora (then) la pagina corrente è la
numero uno (iPageCurrent = 1)
Se
invece il valore di page non è nullo, la pagina corrente
assumerà tale valore (iPageCurrent = CInt(Request.QueryString("page"))
)
|
If
Request.QueryString("page") = ""
Then
iPageCurrent = 1
Else
iPageCurrent = CInt(Request.QueryString("page"))
End
If
|
Abbiamo
qui usato la funzione 'if... then.. else'
Il
loro utilizzo è semplice: se una determinata condizione
è vera (if...), allora (then...) eseguo qualche operazione.
In caso contrario (else...) ne eseguo un’altra.
Per
chiudere il tutto uso ‘end if’.
Abbiamo
però detto che il collegamento per andare alla pagina
precedente o alla pagina successiva contengono due parametri:
il primo è ‘page’ che abbiamo appena visto.
Il
secondo è ‘order’: in base a questo secondo parametro
noi possiamo definire secondo quale criterio ordinare
i risultati. Potremmo per esempio odinarli in base ad
una data, o in ordine alfabetico relativamente ad un
campo del database... e così via.
Per
il momento noi continuiamo ad ordinare i risultati in
base al contatore ‘id’: in questo modo i dati inseriti
per ultimi (e quindi più recenti) sono visualizzati
ai primi posti.
Anche
qui quindi prendiamo dalla stringa del collegamento
il parametro ‘order’: se tale parametro è vuoto ordiniamo
in base all’id (strOrderBy = "id"). Se invece
non è nullo ordiniamo in base al parametro appena ottenuto
(strOrderBy = Request.QueryString("order")).
Come
potete vedere anche qui utilizziamo ‘if... then... else...
end if’
|
If
Request.QueryString("order") = ""
Then
strOrderBy = "id"
Else
strOrderBy = Request.QueryString("order")
End
If
|
A
questo punto creiamo la connessione al database ‘link.mdb’
|
Set
Conn = Server.CreateObject("ADODB.Connection")
conn.Open
"driver={Microsoft Access Driver (*.mdb)};dbq="
& server.mappath("database/link.mdb")
Set
RS = Server.CreateObject("ADODB.Recordset")
|
e
selezioniamo i dati che ci interessano dalla tabella
‘link’, ordinandoli in base alla variabile ‘strOrderBy’
che, come abbiamo visto, salvo indicazione contraria,
ha come valore ‘id’.
|
sql
= "SELECT * FROM link ORDER BY " &
strOrderBy & " DESC;"
|
A
questo punto carichiamo i dati nel recordset
|
RS.Open
sql, conn, adOpenKeyset
|
controlliamo
il numero di pagina e contiamo il numero totale di pagine
che ci servono per visualizzare tutti i risultati
|
RS.PageSize
= iPageSize
RS.CacheSize
= iPageSize
iPageCount
= RS.PageCount
|
Nel
caso in cui la pagina corrente sia maggiore del numero
di pagine totali, allora la pagina corrente deve necessariamente
coincidere col numero totale di pagine, ovvero l’ultima
pagina utile.
|
If
iPageCurrent > iPageCount Then iPageCurrent
= iPageCount
|
Se
invece la pagina corrente è minore di uno (nell’ipotesi
per esempio di page=0), occorre che la pagina corrente
sia uguale a uno.
|
If
iPageCurrent < 1 Then iPageCurrent = 1
|
Se
però il numero di pagine necessarie per visualizzare
tutti i risultati è uguale a zero, significa che non
abbiano alcun risultato da visualizzare! Pertanto mostriamo
un messaggio di errore
|
If
iPageCount = 0 Then
Response.Write("Nessun
record visualizzato!")
|
Vale
solo la pena notare che la funzione ‘response.write’
l’abbiamo incontrata anche nelle pagine precedenti.
In
quei casi però si trattava dimostrare a video il contenuto
di una variabile come nel caso di response.write(link).
Dato
però che qui non dobbiamo mostrare una variabile ma
un testo, ecco che utilizziamo le virgolette doppie:
response.write(“testo da visualizzare”).
Pertanto:
response.write(link)
mi mostra il contenuto della variabile ‘link’
response.write(“link”)
mi mostra la parola ‘link’
Nel
caso invece in cui iPageCount sia diverso da zero (if...
then... else..), continuiamo senza problemi.
|
Else
RS.AbsolutePage = iPageCurrent
|
Cominciamo
ora a mostrare quello che abbiamo ottenuto dall’interrogazione
del database.
Partiamo
dal valore zero (iRecordsShown = 0) e continuiamo (Do
While) finche non arriviamo al valore assegnato alla
variabile ‘iPageSize’ (iRecordsShown < iPageSize)
che nel nostro caso è cinque, o comunque finche non
siamo in fondo al file (And Not RS.EOF)
|
iRecordsShown
= 0
Do
While iRecordsShown < iPageSize And Not RS.EOF
%>
|
A
questo punto mostriamo a schermo i valori ‘descrizione’
e ‘link’ presenti nei record del database
|
<p><%
response.write(rs("descrizione"))
%><br>
|
Abbiamo
modificato leggermente la funzione ‘response.write’.
nelle pagine precedenti avevamo creato una variabile
‘descrizione’ e le avevamo assegnato il corrispondente
valore preso dal database e memorizzato nel RS ( descrizione=rs(“descrizione”)
). Una volta definita questa variabile ne mostravamo
il contenuto ( response.write(descrizione) ).
Per
velocizzare le cose però, possiamo scrivere direttamente
(come abbiamo fatto ora):
response.write(rs(“descrizione”))
o
meglio ancora:
=
(rs(“descrizione”))
dove
‘=‘ sostituisce le parole ‘response.write’
In
questo modo non abbiamo nemmeno bisogno di definire
una variabile in cui memorizzare tali dati: semplicemente
li preleviamo dal database e li mostriamo a schermo
(in precedenza invece li avevamo posizionati temporaneamente
in una variabile e li avevamo visualizzati in un secondo
momento)
Allo
stesso modo mostriamo il relativo link
|
<a
href="<% = (rs("link")) %>"
target="_blank">
<%
= (rs("link")) %></a>
</p>
|
Continuo
a mostrare i record e chiedo di visualizzare il successivo.
Anche
in questo caso viene ripetuto tutto quello che è compreso
fra ‘Not RS.EOF’ e la riga che segue
|
<%
iRecordsShown
= iRecordsShown + 1
|
Mi
sposto al record seguente
e
ripeto il procedimento da capo
Fatto
questo chiudo la connessione
|
RS.Close
Set
RS = Nothing
Conn.Close
%>
|
Ora
dobbiamo creare i link per andare avanti e indietro
Se
la pagina corrente è diversa (<>) da ‘uno’ (‘If
iPageCurrent <> 1 Then’) creiamo un link che ci
consenta di tornare alla pagina precedente (‘iPageCurrent
- 1’)
|
<%
If
iPageCurrent <> 1 Then
%>
<a
href="paginazione.asp?page=<%= iPageCurrent
- 1 %>&order=<%= Server.URLEncode(strOrderBy)
%>"> Indietro</a>
|
Dato
che abbiamo aperto con ‘if... then...’, chiudiamo ora
con ‘end if’
Evidentemente
la pagina numero uno non visualizzerà, evidentemente,
nessun link per tornare indietro. Lo
stesso schema utilizzato per il link ‘indietro’ lo applichiamo
al link ‘avanti’.
Se
il numero della pagina corrente è minore del numero
di pagine totali (‘If iPageCurrent < iPageCount Then’)
allora dobbiamo creare il link’avanti’
|
<%
If
iPageCurrent < iPageCount Then
%>
<a
href="paginazione.asp?page=<%= iPageCurrent
+ 1 %>&order=<%= Server.URLEncode(strOrderBy)
%>">Avanti</a>
<%
End
If
%>
|
dato
però che dobbiamo linkarci alla pagina successiva, avremo
‘iPageCurrent + 1’ anziché ‘iPageCurrent - 1’.
Il
simbolo di uguale davanti a tali stringhe sostituisce,
come abbiamo visto, la frase ‘response.write’
A
questo punto abbiamo finito.
Salvare
il file appena creato con il nome ‘paginazione.asp’
e verificarne il corretto funzionamento.
|