Paginação v1.0
Já existem alguns códigos de paginação aqui no Fórum, até mesmo uma classe criada pelo jonathandj. Mesmo assim resolvi criar uma classe para uso próprio. Talvez seja útil para alguém também.
Segue abaixo um código para realizar paginação com dados vindo de um banco de dados. Testado com Access e MySQL.
A forma de paginação no MySQL utilizei a idéia do Tio Mario que está postada em algum tópico aqui no Fórum.
Obs. Única observação: Mantenha os créditos. http://forum.imasters.com.br/public/style_emoticons/default/grin.gif
Atualização:
[14.09.2008]: Acrescentado GROUP BY e HAVING
[22.12.2008]: Cálculo de total de páginas
Limitação:
- Funciona apenas com consulta simples, utilizando SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY e SUBSELECT.
class_paginacao.asp
<%
'*************************************************************
' Classe para criar paginação
' Autor: hargon
' Propósito: Criar uma paginação a partir de um banco de dados
' Data: 27/06/2008
' Fórum: Imasters (forum.imasters.com.br)
'*************************************************************
Option Explicit
'*************************************************************
' Classe para Paginação
'*************************************************************
Class Paginacao
Public campos, from, where, groupBy, having, orderBy, paginaAtual, totalRegistros, rs, strConexao, linkPaginas, url, separador, legenda, primeiraPagina, ultimaPagina, proximaPagina, anteriorPagina
Private totalReg, conexao
Public Sub Paginacao()
paginaAtual = paginaVerifica(paginaAtual)
totalRegistros = totalRegistrosVerifica(totalRegistros)
url = urlVerifica(url)
separador = separadorVerifica(separador)
campos = camposVerifica(campos)
criaPaginacao()
criarProximoAnterior()
End Sub
Private Function contaRegistros()
Dim sql, total
sql = "SELECT COUNT(*) as total FROM "& from & " "
If (len(where) > 0) Then
sql = sql & "WHERE " & where
End If
Set rs = conexao.Execute(sql)
If Not rs.eof Then
total = rs("total")
Else
total = 0
End If
rs.close
Set rs = Nothing
contaRegistros = total
End Function
Private Function fInt(valor)
Dim resultado
resultado = valor
If (resultado > cInt(resultado)) Then
valor = split(resultado,",")
resultado = cInt(valor(lBound(valor))) + 1
else
resultado = cInt(resultado)
End If
fInt = resultado
End Function
Private Function camposVerifica(valor)
If (len(valor) = 0) Then
camposVerifica = "*"
Else
camposVerifica = valor
End If
End Function
Private Function paginaVerifica(pagina)
If isNumeric(pagina) Then
If (pagina <= 0) Then
pagina = 1
End If
Else
pagina = 1
End If
paginaVerifica = pagina
End Function
Private Function separadorVerifica(vUrl)
If (len(vUrl) = 0) Then
separadorVerifica = " "
Else
separadorVerifica = vUrl
End If
End Function
Private Function totalRegistrosVerifica(registros)
If isNumeric(registros) Then
If (registros <= 0) Then
registros = 10
End If
Else
registros = 10
End If
totalRegistrosVerifica = registros
End Function
Private Function urlVerifica(vUrl)
If (len(vUrl) = 0) Then
urlVerifica = request.ServerVariables("script_name")
Else
urlVerifica = vUrl
End If
End Function
Public Sub criaPaginacao()
If (instr(lCase(strConexao),"mysql") > 0) Then
paginacaoMySQL
Else
paginacaoAccess
End If
montarPaginacao
End Sub
Private Sub criarProximoAnterior()
If ((paginaAtual - 1) < primeiraPagina) Then
anteriorPagina = 0
Else
anteriorPagina = paginaAtual - 1
End If
If ((paginaAtual + 1) > ultimaPagina) Then
proximaPagina = 0
Else
proximaPagina = paginaAtual + 1
End If
End Sub
Private Sub paginacaoAccess()
Dim sql, paginas, inicioRegistros, fimRegistros
set rs = Server.CreateObject("adodb.recordset")
set rs.ActiveConnection = conexao
rs.CursorType = 3
rs.PageSize = totalRegistros
sql = "SELECT "& campos & " FROM "& from & " "
If (len(where) > 0) Then
sql = sql & "WHERE " & where
End If
If (len(groupBy) > 0) Then
sql = sql & " GROUP BY " & groupBy
End If
If ((len(having) > 0) And (len(groupBy) > 0)) Then
sql = sql & " HAVING " & having
End If
If (len(orderBy) > 0) Then
sql = sql & " ORDER BY " & orderBy
End If
rs.Open sql
totalReg = rs.recordCount
If not rs.Eof Then
rs.absolutepage = paginaAtual
End If
End Sub
Private Sub paginacaoMySQL()
Dim sql, paginas, inicioRegistros, fimRegistros
totalReg = contaRegistros()
paginas = cint(totalReg) / cint(totalRegistros)
inicioRegistros = 0
if (paginaAtual > 1) then : inicioRegistros = (paginaAtual * totalRegistros) - totalRegistros : end if
fimRegistros = totalRegistros
sql = "SELECT "& campos & " FROM "& from & " "
If (len(where) > 0) Then
sql = sql & "WHERE " & where
End If
If (len(groupBy) > 0) Then
sql = sql & " GROUP BY " & groupBy
End If
If ((len(having) > 0) And (len(groupBy) > 0)) Then
sql = sql & " HAVING " & having
End If
If (len(orderBy) > 0) Then
sql = sql & " ORDER BY " & orderBy
End If
sql = sql & " LIMIT "& inicioRegistros &", " & fimRegistros
Set rs = conexao.Execute(sql)
End Sub
Public Sub abrirConexao()
Set conexao = Server.CreateObject("ADODB.Connection")
conexao.Open strConexao
End Sub
Public Sub fecharConexao()
If isObject(rs) Then
rs.Close
Set rs = Nothing
End If
conexao.Close
Set conexao = Nothing
End Sub
Public Sub montarPaginacao()
Dim i, total, resultado
total = totalReg
linkPaginas = empty
separador = split(separador," ")
resultado = fInt(formatnumber(cInt(qtRegistros)/cInt(totalRegistros),2))
If (resultado >= 1) Then
linkPaginas = legenda & " "
primeiraPagina = 1
ultimaPagina = 1
For i = 1 To resultado
If (i = cInt(paginaAtual)) Then
linkPaginas = linkPaginas & "<strong><span class=""paginaAtiva"">"& i &" </span></strong>"
Else
If (instr(url,"?") > 0) Then
linkPaginas = linkPaginas & " " & separador(0) & "<a class=""paginaLink"" href=""" & url & "&pag="&i&""">"&i&"</a>" & separador(1) & " "
Else
linkPaginas = linkPaginas & " " & separador(0) & "<a class=""paginaLink"" href=""" & url & "?pag="&i&""">"&i&"</a>" & separador(1) & " "
End If
End If
ultimaPagina = i
Next
End If
End SubEnd Class
%>
arquivo.asp
<!--#include file='class_paginacao.asp'-->
<%
Dim pag, contador
Set pag = New paginacao
With pag
'strConexao: Obrigatório. Testado somente com MySQL, Access
.strConexao = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("../../private/banco.mdb")
'.strConexao = "Driver={MySQL ODBC 3.51 Driver}; SERVER=127.0.0.1; DATABASE=bancodedados; UID=administrador; PWD=123456;"
'campos: Não obrigatório
.campos = "cdpagina, nmpagina, exibir"
'from: Obrigatório
.from = "adm_pagina"
'where: Não obrigatório
'.where= "nmpagina like '%teste%'"
'orderBy: Não obrigatório
.orderBy = "nmpagina ASC"
'paginaAtual: Obrigatório quando não estiver na primeira página
.paginaAtual = request.QueryString("pag")
'totalRegistros: Default 10
.totalRegistros = 5
'url: Obrigatório quando possuir outros parâmetros na URL
.url = request.ServerVariables("script_name")
'separador: Não obrigatório
.separador = "[ ]"
'legenda: Não obrigatório
.legenda = "págs."
'abrirConexao: Obrigatório
.abrirConexao
'paginacao: Obrigatório
.paginacao
'linkPaginas: São às páginas. Pode ser colocado em qualquer parte do código após executação .paginacao.
response.write .linkPaginas & "<br /><br />"
'rs: Obrigatório para acessar os campos
If Not .rs.eof Then
contador = 0
'Para MySQL não é necessário utilizar "and contador < .rs.pagesize" na linha abaixo
While Not .rs.eof and contador < .rs.pagesize
contador = contador + 1
response.write .rs("nmpagina") & "<br />"
.rs.movenext
Wend
Else
response.write "Nenhum registro foi encontrado."
End If
'fecharConexao: Obrigatório
.fecharConexao
'linkPaginas: São às páginas. Pode ser colocado em qualquer parte do código após executação .paginacao.
response.write "<br />" & .linkPaginas
response.write "<br /><br />Primeira: " & .primeiraPagina
response.write "<br />Última: " & .ultimaPagina
response.write "<br />Próxima: " & .proximaPagina
response.write "<br />Anterior: " & .anteriorPaginaEnd With
Set pag = Nothing
%>
Discussão (1)
Carregando comentários...