Salve a tutti, pubblico questa classe per la paginazione dei recordset.L'esempio commentato dovrebbe rendere un idea di come funziona:
Le proprieta che vi che vi ritrovate a disposizione sono: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 %> << <% 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 %> >> <% 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 %>
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
Spero che la classe possa essere utile per qualcuno.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 %>
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

Rispondi quotando