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
allora...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 %><< <% end if %>< <% 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 %>> <% if wbp_currentPage < wbp_totalPages - 1 then %>>> <% end if end if %> ]</span><% else %>1 pagina<% end if%> </span> </div><% else '*** EDIT *** se il recordset è vuoto... response.write "nessun record" end if %>
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


Rispondi quotando
)
)