Articoli Referenze Script FAQ Downloads Menu Javascript Ricette Cocktail Corsi online Registrazione domini Area Aziende



Paginazione dei risultati di query molto lunghe in ASP

Home + Articoli + Database e SQL + Articolo # 142
Autore: Luca Ruggiero

Concesso in esclusiva a Mr.Webmaster. Vietata la riproduzione.


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:
  1. la pagina diventerebbe oltremodo lunga;
  2. si sottopone il DBMS e la CPU del server ad uno sforzo disumano;
  3. 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!

© 2008 ASP Center di Luca Ruggiero - P. IVA 05564851219 - Utenti online: 10 - Disclaimer | Pubblicità | Supportaci | Staff | Contatti
  Appunti PHP | Giornale Webmaster | Mr.Webmaster | Download | DevSpy.com | ASPCode.it | ClaudioGarau.it | Webmaster Facile | Come Faccio | AlVerde.net | CodiceFacile.it | I Programmatori | By Luciani | VoiceXML Italian User Group | Giochi | Extro Web Site | Morpheus Web | AG Web Solutions | Net-Free | PC Sicuro | PC Self | Tutorial Web | Dablones