>> Torna all'Homepage <<
Contattaci Entra nei forum Cerca nel sito
News della settimana ASP: esempi di pagine dinamiche Trucchi e suggerimenti per il PC Manuali e guide I dossier e gli approfondimenti di AmicoPc Il sito della settimana I racconti di Armando Staffa Chi siamo
     
 

 

Scarica i file
Scarica i file
citati in questa pagina

 


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)

iPageSize = 5

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

RS.MoveNext

e ripeto il procedimento da capo

Loop

End If

Fatto questo chiudo la connessione

RS.Close

Set RS = Nothing

Conn.Close %>

Ora dobbiamo creare i link per andare avanti e indietro
S
e 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’

<%

End If

%><br>

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.

 

Insieme per un mondo migliore

Utenti connessi: 51

Invia questa pagina ad un amico

 

 

 

Chi siamo | Pubblicità | Note sulla privacy | Dicono di noi
Grafica cura di Paolo Omero
- Stefania Migliorucci

La riviera delle azalee