Salve a tutti, pubblico questa classe per la paginazione dei recordset.L'esempio commentato dovrebbe rendere un idea di come funziona:
codice:
<%
Set cPage = new cPager
'I record per pagina
cPage.RecordPerPage  = 5
'Imposto il numero di pagine visibili da spezzare in blocchi
cPage.PageBlockSize  = 10 
' Verra' in questo modo visualizzato 
'[1-10] 11 12 13 14 15 16 17 18 19 20 [21-30]
'Imposto la variaibile che determinera' la pagina ( non serve testare 'se 0 o fare il cInt,tutto è delegato alla classe
cPage.Page  = Request("Pagina")
'ESEMPIO DI UN RECORDSET CREATO GIA' CON I GIUSTI CURSORI
SQLProdotti = 	"SELECT * FROM T_FATTURE;"
Set Rs = Server.CreateObject("ADODB.RecordSet")
Rs.CursorType = 3
Rs.CursorLocation = 3
Rs.LockType = 3
Rs.ActiveConnection = connessione
Rs.Source = SQLProdotti
Rs.Open
' Carico ed inizializzo le variabili (il 2 parametro se true distrugge il recordset
cPage.LoadRs  Rs,false 
'In alternativa del settare i cursori si puo' delegare alla funzione di fare cio' 
Il metodo OpenRecordSet accetta il nome del Recordset, la connessione,ed il sql ed apre il recordset
'con i giusti cursori ( e non serve rieseguire il metodo LoadRs )
Rs.Close
cPage.OpenRecordSet   Rs,Connessione,SQLProdotti 
k = 0
       'Limito i record con la variabile RecordPerPage
	while not Rs.eof and k < cPage.RecordPerPage   		'.......semplice output per esempio
			
		Response.Write(Rs.absolutePosition & " " & Rs("data") & " " & Rs("descrizione") & "
")
		Rs.movenext
		k = k + 1
	wend
Rs.Close
Set Rs = nothing
%>
<hr>
TOTALE PAGINE = <%=CPage.TotalPage %>
	 
Mostro il record dal numero <%=CPage.FromRecord %> al numero <%=CPage.ToRecord %>

<hr>
<%
'ed ora stampo le pagine
if not CPage.isOnePage  then 'IsOnePage è un booleano che è impostato a true se è una pagina sola  %>
	<div align="center"> 
	<table border="0" width="100%" cellpadding="0" cellspacing="0" height="25">
	<tr> 
	  <td valign="middle" align="right" width="10%"> 
	    <% ' QUI APPARIRANNO I BLOCCHI PRECENDENTI ES. [PAG DA 1-10]
		   'PreviousPageSeries è uno shortcut per la stampa di 
		   'CPage.PreviousPageFrom  (prima pagina del blocco precedente
		   'e CPage.PreviousPageTo  (ultima pagina del blocco precedente)
		   'Ma utile perchè sono stati gia' fatti i controlli del tipo se la pagina PreviousPageFrom è la stessa di PreviousPageto stampa solo l'unica pagina	
		    if CPage.HasPreviousPageBlock  then 'SE ESISTE UN BLOCCO PRECEDENTE%>
				[<%=CPage.PreviousPageSeries%>] 
		<%	end if %>
	  </td>
	  <td valign="middle" align="center" width="10%"> 
		<%	if CPage.HasPreviousPage  then ' PER SAPERE SE ESISTE UNA PAGINA PRECEDENTE %>
			&lt;&lt; 
		<%	end if %>
	  </td>
	  <td  valign="middle" align="center" width="60%"> 
		<%  'in startpage si avra' dalla prima pagina del blocco corrente 
' esempio blockpage= 10, pagina = 13 , start page sara' uguale a 11 e end page a 19 	
			for i=cPage.StartPage  to cPage.EndPage 
				if i=cPage.CurrentPage  then 'Current page è la pagina corrente%>
					<%=i%> 
				<%	else %>
					<%=i%> 
			<%	end if  
			next %>
	  </td>
	  <td valign="middle" align="center" width="10%"> 
		<%	' PER SAPERE SE ESISTE UNA PAGINA SUCCESSIVA	
			if cPage.HasNextPage   then %>
		&gt;&gt; 
		<%	end if %>
	  </td>
	  <td valign="middle" align="left" width="10%"> 
		<% ' QUI APPARIRANNO I BLOCCHI SUCCESSIVI ES. [PAG DA 20 -29 ]
		   'NextPageSeries è uno shortcut per la stampa di 
		   'CPage.NextPageFrom  (prima pagina del blocco successivo
		   'e CPage.NextPageTo  (ultima pagina del blocco successivo)	
		     if CPage.HasNextPageBlock  then %>
		[<%=CPage.NextPageSeries %>] 
		<%	end if %>
	  </td>
	</tr>
	</table>
	</div>
    <% 	end if 
Set CPage = nothing %>
Le proprieta che vi che vi ritrovate a disposizione sono:

RecordPerPage = (int) scrittura/lettura IMPOSTA I RECORD PER
PAGINA
PageBlockSize = (int) scrittura/lettura IMPOSTA I BLOCCHI PAGINA
Page = (int) scrittura/lettura IMPOSTA LA PAGINA CORRENTE
TotalPage = (int) lettura RESTITUISCE IL NUMERO TOTALE DELLE
PAGINE
FromRecord = (int) lettura RESTITUISCE IL NUMERO DEL RECORD DA
CUI INIZIA LA VISUALIZZAZIONE PER LA PAGINA CORRENTE
ToRecord = (int) lettura RESTITUISCE IL NUMERO DEL RECORD DA
CUI FINISCE LA VISUALIZZAZIONE PER LA PAGINA CORRENTE
isOnePage = (bool) lettura RESTITUISCE TRUE SE IL RECORDSET E'
UNA PAGINA SOLA , FALSE NEL CASO CONTRARIO
StartPage = (int) lettura RESTITUISCE IL NUMERO INIZIALE DELLE
PAGINE PER IL BLOCCO CORRENTE
esempio se avete impostato PageBlockSize a 5 pagine se vi trovate nella pagina 8
StartPage (int) lettura ha valore 6 (siete nel secondo blocco)
EndPage = (int) lettura RESTITUISCE IL NUMERO FINALE DELLE PAGINE
per PER IL BLOCCO CORRENTE
esempio se avete impostato PageBlockSize a 5 pagine se vi trovate nella pagina 8
EndPage ha valore 10 (siete nel secondo blocco)
HasPreviousPage = (bool) lettura RESTITUISCE TRUE SE IL RECORDSET
HA UNA PAGINA PRECEDENTE, FALSE NEL CASO CONTRARIO
HasNextPage = (bool) lettura RESTITUISCE TRUE SE IL RECORDSET
HA UNA PAGINA SUCCESSIVA, FALSE NEL CASO CONTRARIO
NextPage = (int) lettura RESTITUISCE la pagina successiva
PreviousPage = (int) lettura RESTITUISCE la pagina precente
CurrentPage = (int) lettura RESTITUISCE la pagina corrente
HasPreviousPageBlock = (bool) RESTITUISCE TRUE SE ESISTONO BLOCCHI
PRECEDENTI AL CORRENTE, FALSE NEL CASO CONTRARIO
HasNextPageBlock = (bool) RESTITUISCE TRUE SE ESISTONO BLOCCHI
SUCCESSIVI AL CORRENTE, FALSE NEL CASO CONTRARIO
PreviousPageFrom = (int) RESTITUISCE LA PRIMA PAGINA DEL BLOCCO
PRECEDENTE
Esempio vi trovate nella 21 pagina con PageBlockSize = 10
PreviousPageFrom vale 11
PreviousPageTo vale 20
PreviousPageTo = (int) lettura RESTITUISCE L'ULTIMA PAGINA DEL BLOCCO
PRECEDENTE
Esempio vi trovate nella 11 pagina con PageBlockSize = 10
PreviousPageTo vale 10
PreviousPageFrom vale 1

NextPageFrom = (int) lettura RESTITUISCE LA PRIMA PAGINA DEL BLOCCO SUCCESSIVO
Esempio vi trovate nella 21 pagina con PageBlockSize = 10
NextPageFrom vale 31
NextPageTo vale 40
NextPageTo = (int) lettura RESTITUISCE L'ULTIMA PAGINA DEL BLOCCO SUCCESSIVO
Esempio vi trovate nella 1 pagina con PageBlockSize = 10
NextPageFrom vale 11
NextPageTo vale 20

NextPageSeries = (string) short cut che stampa NextPageFrom - NextPageTo tenendo presente che se NextPageFrom e NextPageTo hanno
valore identico stampa solo un valore
PreviousPageSeries = (string) short cut che stampa PreviousPageFrom - PreviousPageTo tenendo presente che se PreviousPageFrom e PreviousPageTo
hanno valore identico stampa solo un valore

Invece di seguire la strada come nell'esempio precedente tramite la funzione
CreateRecordSet(Connection,SQL) viene creato l'oggetto recordset all'interno dello oggetto CPager.

A quel punto il recordset si trova all'interno dell'oggetto [NomeInstanzaCPager].RecordSet

codice:
<%
Set cPage = new cPager
connessione = "...bla blablalba" & Server.MapPath("prove.mdb")
cPage.RecordPerPage  = 5
cPage.PageBlockSize  = 10 
cPage.Page  = Request("Pagina")
cPage.CreateRecordSet connessione,"SELECT * FROM T_FATTURE;"
with CPage
	kk = 0 
	while not .Recordset.eof and kk < .recordPerPage
			Response.Write(.Recordset.absolutePosition & " " & .Recordset("data") & " " & .Recordset("descrizione") & "
")
		.Recordset.movenext
		kk = kk + 1
	wend 
.Recordset.Close
'stesso codice dell'esempio per stampare le pagine , non cambia nulla.
end with
set cPage= nothing
%>
Spero che la classe possa essere utile per qualcuno.
P.s sebbene funzioni anche su MySql, per le query con tanti risultati
le performance con LIMIT sono superiori a questa classe. Se poi avro' tempo di implementarla faro' una procedura a posta per MySql

ALLEGO la classe zip di 10 kb con 2 esempi: uno con l'aggiunta di una paginazione ad un recordset esistente, l'altra con la creazione del recordset all'interno dell'oggetto
Sono ben accetti feedback e logicamente bug scovati