data la confusione che sembra regnare sulla questione paginazione (che sembrava archiviata e ben documentata da tempo) mi sembra giusto fare un bel topic pillola su come affrontarla in maniera semplice ed efficacie

presento qui un piccolo script (DA PERSONALIZZARE) per una paginazione intelligente

perchè dico intelligente? perchè sfrutta un meccanismo diverso dal solito che permette di alleggerire il carico sul nostro povero server, soprattutto quando le tabelle sono grandicelle...

prima di tutto presentiamo lo script

codice:
<%
option explicit

function excess(argValue)
	if not (int(argValue) = argValue) then argValue = int(argValue)+1	
	excess = argValue
end function


function cleanLong(argValue)
	on error resume next
	if argValue = "" then : cleanLong = clng(0) : else : cleanLong = clng(trim(argValue)) : end if
	if err.number <> 0 then cleanLong = 0
	on error goto 0
end function

dim conn, rs, SQL, SQLwhere
Set conn = Server.CreateObject("ADODB.Connection")
set rs = Server.CreateObject("ADODB.Recordset")
Conn.Open "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " & server.mappath("database.mdb") & " ; Persist Security Info = False"

dim wbp_recordPerPage, wbp_totalRecords, wbp_totalPages, wbp_currentRecord, wbp_currentPage, wbp_lastcurrentRecord
dim wbp_isEmpty
dim wbp_baseQuerystring, wbp_basePage
dim argPage

'*** EDIT *** impostare quanti record in ogni pagina
wbp_recordPerPage = 3

argPage = cleanLong(request.QueryString("page"))
if argPage < 1 then argPage = 1

'* 1. selezionare SOLO gli id
'* 2. applicare in questa query gli eventuali filtri di selezione
SQL = "SELECT id FROM tabella"
rs.open SQL, Conn, 3, 3

'* impostazione variabili di navigazione (pagine)
wbp_totalRecords = cint(rs.recordcount)
wbp_totalPages = excess(wbp_totalRecords / wbp_recordPerPage)
wbp_currentRecord = ((argPage - 1) * wbp_recordPerPage) + 1
if wbp_currentRecord > wbp_totalRecords then
	wbp_currentPage = 1
	wbp_currentRecord = ((wbp_currentPage - 1) * wbp_recordPerPage) + 1
else
	wbp_currentPage = argPage
end if
wbp_lastcurrentRecord = wbp_currentRecord + wbp_recordPerPage - 1
if wbp_lastcurrentRecord > wbp_totalRecords then wbp_lastcurrentRecord = wbp_totalRecords

SQLwhere = ""

wbp_isEmpty = true

if not rs.eof then
	'* spostamento nel recordset
	rs.pagesize = wbp_recordPerPage
	rs.absolutepage = wbp_currentPage

	wbp_isEmpty = false
	
	'* creazione seconda query (recordset completo, solo per gli ID selezionati nella prima query)
	dim ii
	for ii=0 to wbp_recordPerPage-1
		'*** EDIT *** al posto di ID mettere il nome del campo ID della vostra tabella
		SQLwhere = SQLwhere & " or id = " & rs("id") & ""
		rs.movenext
		if rs.eof then exit for
	next
	set ii = nothing
	rs.close
	SQLwhere = right(SQLwhere,len(SQLwhere)-3)
end if

if not wbp_isEmpty then

	'*** EDIT *** selezionare TUTTI i campi necessari
	SQL = "SELECT id, campo FROM tabella WHERE " & SQLwhere & " ORDER BY id ASC"

	set rs = conn.execute(SQL)
	while not rs.eof
		'*** EDIT *** STAMPA DEL RECORDSET (da personalizzare secondo le esigenze)
		response.write rs("campo") & "
"
		rs.movenext
	wend
	%>
	<div class="page_navigator">
	<span class="page_view"><%
	
		'*** EDIT *** pagina a cui puntare
		wbp_basePage = "pag.asp"
		'*** EDIT *** querystring aggiuntiva ( es: "&sort=date" )
		wbp_baseQuerystring = ""
		
		%></span>
<span class="topic-pages"><%
		if wbp_totalPages > 1 then
			%><span class="page_pagesnav"><%=wbp_totalPages%> pagine [ <%
			if wbp_currentPage > 1 then
				if wbp_currentPage > 2 then
					%>&lt;&lt; <%
				end if
			%>&lt; <%
				if wbp_currentPage - 3 > 0 then%><%=wbp_currentPage-3%> <% end if
				if wbp_currentPage - 2 > 0 then%><%=wbp_currentPage-2%> <% end if
				if wbp_currentPage - 1 > 0 then%><%=wbp_currentPage-1%> <% end if
			end if
			%><%=wbp_currentPage%> <%
			if wbp_currentPage < wbp_totalPages then
				if wbp_currentPage + 1 < wbp_totalPages + 1 then%><%=wbp_currentPage+1%> <% end if
				if wbp_currentPage + 2 < wbp_totalPages + 1 then%><%=wbp_currentPage+2%> <% end if
				if wbp_currentPage + 3 < wbp_totalPages + 1 then%><%=wbp_currentPage+3%> <% end if
				%>&gt; <%
				if wbp_currentPage < wbp_totalPages - 1 then
					%>&gt;&gt; <% 
				end if
			end if
		%> ]</span><%
		else
		%>1 pagina<%
		end if%>
	</span>
	</div><%
	
else
	'*** EDIT *** se il recordset è vuoto...
	response.write "nessun record"
	
end if


%>
allora...
tutti i punti da personalizzare sono diligentemente segnalati con un ***EDIT*** prima della variabile o parte di codice da modificare secondo le esigenze

questo tipo di paginazione non include nessun tipo di filtro, ma sono semplicemente applicabili alla prima delle due query che vengono eseguite.

due query: questo sistema sfrutta due query invece che una come di solito si fa.
giustamente direte "il carico quindi è maggiore". e invece no.
solitamente quando si fa la paginazione con mdb (parlerò in un altro post della paginazione MYSQL) si carica un recordset con tutti i campi che interessano. poi utilizzando le proprietà dinamiche dell'oggetto RECORDSET si imposta una pagesize e una absolutepage e si recuperano solo quelli che interessano.

nel caso in cui la nostra tabella sia però grande, vengono caricate una infinità di dati non utili.
immaginiamo una tabella come quella di un forum. se abbiamo 1000 topic e ne vogliamo visualizzare solo 10 caricheremo nel recordset 1000 id, 1000 titoli, 1000 autori e così via.
una miriade di dati praticamente inutili, che non fanno che appesantire il calcolo.

con questo metodo invece vengono caricati SOLO 1000 id.
ne vengono selezionati 10, e si esegue una nuova query che seleziona solo 10 record, con tutto il necessario (titoli, autori e così via).

un bel risparmio!

a questo punto bisogna stampare il contenuto del recordset.
questo io l'ho fatto in maniera banale con dei semplici
divisori.
voi ovviamente fatelo come meglio vi serve, in tabelle o come volete.

infine c'è la fase della stampa delle pagine e relativa navigazione.
anche qui è tutto semplice. basta indicare il nome della pagina, ed eventuali aggiunte alla querystring (solitamente i filtri che applicate nella prima query).

per ogni tipo di domanda io sono disponibile.
scusatemi la sintesi, ma davvero con un piccolo sforzo dovrebbe risultare tutto semplice.

a breve pubblicherò uno script molto simile per la paginazione MYSQL (che notoriamente si avvale del più comodo LIMIT)

enjoy