Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    [MINI-PILLOLA] paginazione mdb

    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
    san imente saluta

    * http://simonecingano.it *

  2. #2
    ma non sarà un po' troppo complicato per una paginazione ? )

    ciau!
    - Atari

  3. #3
    Originariamente inviato da Atari
    ma non sarà un po' troppo complicato per una paginazione ? )

    ciau!
    - Atari
    mi sembra un commento un po' superficiale

    se hai perplessità sarei lieto di discuterne
    san imente saluta

    * http://simonecingano.it *

  4. #4
    Ciao Imente..io ho provato il tuo codice ma mi da questo errore

    codice:
    # Tipo di errore:
    ADODB.Recordset (0x800A0CB3)
    Current Recordset does not support bookmarks. 
    This may be a limitation of the provider or of the 
    selected cursortype.
    /test/paginazione.asp, line 58
    e alla linea 58 c'è

    codice:
    	rs.absolutepage = wbp_currentPage
    - La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché.

    - Se i fatti e la teoria non concordano, cambia i fatti

  5. #5
    Utente di HTML.it L'avatar di viki1967
    Registrato dal
    Feb 2003
    Messaggi
    1,757
    Con quale DB stai lavorando?
    A S P : tutto il resto è noia...
    L I N U X : forse mi "converto"...

  6. #6
    Originariamente inviato da viki1967
    Con quale DB stai lavorando?
    quoto... che db stai usando?
    san imente saluta

    * http://simonecingano.it *

  7. #7
    Utente di HTML.it L'avatar di viki1967
    Registrato dal
    Feb 2003
    Messaggi
    1,757
    Originariamente inviato da imente
    quoto... che db stai usando?
    Ciao Imente e nuovi complimenti per questa paginazione... aspetto anche quella per MySQL (come hai promesso )

    Credo che il nostro amico sia provando ad utilizzarla con un db MySQL (l'errore sembra quello...)
    A S P : tutto il resto è noia...
    L I N U X : forse mi "converto"...

  8. #8
    ..e invece no..SQL SERVER
    - La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché.

    - Se i fatti e la teoria non concordano, cambia i fatti

  9. #9
    Utente di HTML.it L'avatar di viki1967
    Registrato dal
    Feb 2003
    Messaggi
    1,757
    A S P : tutto il resto è noia...
    L I N U X : forse mi "converto"...

  10. #10
    Originariamente inviato da djkoma
    ..e invece no..SQL SERVER
    :rollo: scusa la franchezza... ma se leggi in alto c'è scritto
    "[MINI-PILLOLA] paginazione mdb"



    per mysql attendete poco

    inoltre ho quasi pronto una bella pillola sulla gestione dei dati in ingresso da response, con tutta una serie di funzioni molto utili
    san imente saluta

    * http://simonecingano.it *

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.