Sabemos que existem várias formas de paginação com ASP, mas consegui, de um modo extremamente compacto, desenvolver uma paginação estilo a wp-PageNavi, que é um Plugin que uso e que vários blogueiros usam no WordPress. Usei um pouco de CSS, mas que não vem ao caso, e banco MySQL. Vamos lá, então!!
O banco MySQL fica assim:
Nome da Tabela: TabelaDados
Coluna 01: Codigo – INT(1) NOT NULL, PRIMARY, AUTO
Coluna 02: Unidade – VARCHAR(5) NULL
Coluna 03: Nome – VARCHAR(100) NULL
Criamos uma estrutura simples de página HTML para receber as informações, ficando assim:
<%@ Language="VBScript" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Paginando Dados</title>
</head>
<style type="text/css">
.table {border: 1px solid #FF9933;}
.table td {border: 1px solid #FF9933;}
.pagNumberMark {background: #B5C905; font: 12px Arial; color: #FFFFFF;}
.pagNumber {background: #333333; font: 12px Arial; color: #FFFFFF;}
.fonteBr {font: 14px Arial; color: #FFFFFF;}
.fontePr {font: 12px Arial; color: #000000;}
.fontePontos {border: 1px solid #333333; font: 14px Arial; color: #000000; background: #FFFFFF;}
a {text-decoration: none;}
.fonte {font: 12px Arial; color: #FFFFFF;}
</style>
<body>
Abaixo da tag <body> vamos criar as tabelas necessárias. Em particular criei uma tabela com duas linhas e, na primeira linha, criei uma tabela com duas linhas e 3 colunas para colocar as informações do banco. Façam como acharem melhor.
Fiz minha conexão com o banco e logo abaixo criei um RecordSet para meu SQL, limitei 15 linhas por página e usei o CursorLocation = 3.
Usei o PageCount para saber quantas páginas foram criadas, assim posso usar essa informação em qualquer lugar da aplicação.
<table width="600" border="0" align="center" cellpadding="0" cellspacing="0">
<%
Dim Conexao
Set Conexao = Server.CreateObject("Adodb.Connection")
Conexao.ConnectionString = "Driver=MySQL ODBC 3.51 Driver; DataBase=xxxxxxx; Server=xxxxxx; Uid=xxxx; PassWord=xxxxx;"
Conexao.Open
Dim Rs_DADOS, PagNav, TotalPag
Dim Anterior, Proximo, Jo, PaginaVisita
Set Rs_DADOS = Server.CreateObject("Adodb.RecordSet")
Conexao.CursorLocation = 3
Rs_DADOS.PageSize = 15
Rs_DADOS.Open "Select Codigo, Unidade, Nome From TabelaDados Order By Nome Desc",Conexao
If Rs_DADOS.Eof Then
Response.Write("<tr><td height=""28"" align=""center"">LISTA VAZIA</td></tr>")
Else
PagNav = CInt(Request.QueryString("Pages"))
If (PagNav = 0) Then : PagNav = 1 : End If
Rs_DADOS.AbsolutePage = PagNav
TotalPag = Rs_DADOS.PageCount
%>
<tr>
<td><table class="table" width="600" border="0" cellspacing="0" cellpadding="0">
<tr class="fonteBr">
<td width="145" height="36" align="center" bgcolor="#FFBA75"><strong>CÓDIGO</strong></td>
<td width="334" align="center" bgcolor="#FFBA75"><strong>NOME</strong></td>
<td width="119" align="center" bgcolor="#FFBA75"><strong>UNIDADE</strong></td>
</tr>
Criei um While baseado na função AbsolutePage, assim posso ter controle também das páginas, para quando eu quiser voltar ou avançar. A variável PagNav está tendo o valor da página atual.
<% While Not Rs_DADOS.Eof And Rs_DADOS.AbsolutePage = PagNav %>
<tr class="fontePr">
<td height="27" align="center"><% Response.Write(Rs_DADOS("Codigo")) %></td>
<td align="center"><% Response.Write(Rs_DADOS("Nome")) %></td>
<td align="center"><% Response.Write(Rs_DADOS("Unidade")) %></td>
</tr>
<%
Rs_DADOS.MoveNext : Wend
Anterior = PagNav - 1
Proximo = PagNav + 1
If (Anterior <= 0) Then : Anterior = 1 : End If
If (Proximo > TotalPag) Then : Proximo = TotalPag : End If
%>
</table></td>
</tr>
Agora abaixo tem a arte mais complicada e chata de se aplicar.
<tr>
<td height="28"> </td>
</tr>
<tr>
<td align="center"><table width="457" height="41" border="0" cellpadding="0" cellspacing="4">
<tr>
<td width="300" height="30" align="center" class="fontePr"><%
If Request.QueryString("Pages") = "" Then
Response.Write("Página 1 de "&TotalPag)
Else
Response.Write("Página "&Request.QueryString("Pages")&" de "&TotalPag)
End If
%></td>
<td width="42" align="center" class="pagNumber"><a href="?Pages=1" class="fonte"> « Início </a>
<%
PaginaVisita = CInt(Request.QueryString("Pages"))
If PagNav > 1 Then
Response.Write("<td width=""36"" align=""center"" "& _
"class=""pagNumberMark""><a href=""?Pages="&Anterior&""" "& _
"style=""font: 12px Arial; color: #FFFFFF;""> « </a></td>")
End If
If PagNav > 5 Then
Response.Write("<td width=""28"" align=""center"" class=""fontePontos""> ... </td>")
End If
%>
Eu limitei para aparecer cinco links por, [1] [2] [3] [4] [5], isso logo nos primeiros IF’s, os outros são para quando for uma menor quantidade de registro, exemplo [19] [20] [21], que não tem cinco links.
Segue o final do código:
Caso o conteúdo fique com 5 páginas ou abaixo
<%
If PagNav <= 5 Then
If TotalPag >= 5 Then
For Jo = 1 To 5
If PagNav = Jo Then
Response.Write("<td width=""36"" align=""center"" class=""pagNumberMark""> "& _
" <strong>"&Jo&"</strong> </td>")
Else
Response.Write("<td width=""36"" align=""center"" class=""pagNumber""> "& _
"<a href=""?Pages="&Jo&""" class=""fonte""> "&Jo&" </a></td>")
End If
Next
Else
For Jo = 1 To TotalPag
If PagNav = Jo Then
Response.Write("<td width=""36"" align=""center"" class=""pagNumberMark""> "& _
" <strong>"&Jo&"</strong> </td>")
Else
Response.Write("<td width=""36"" align=""center"" class=""pagNumber""> "& _
"<a href=""?Pages="&Jo&""" class=""fonte""> "&Jo&" </a></td>")
End If
Next
End If
End If
%>
Aqui é caso fique mais de 5 páginas ele vai colocando o seletor de páginas no meio e abrindo a paginação
<%
If PagNav > 5 Then
PagNav = PagNav + 4
Pg = PagNav
MaxB = Request.QueryString("Pages") - 1
If (MaxB + 1) = TotalPag Then
For Jo = MaxB To (Pg - 4)
If PaginaVisita = Jo Then
Response.Write("<td width=""36"" align=""center"" class=""pagNumberMark""> "& _
" <strong>"&Jo&"</strong> </td>")
Else
Response.Write("<td width=""36"" align=""center"" class=""pagNumber""> "& _
"<a href=""?Pages="&Jo&""" class=""fonte""> "&Jo&" </a></td>")
End If
Next
ElseIf (MaxB + 2) = TotalPag Then
For Jo = MaxB To (Pg - 3)
If PaginaVisita = Jo Then
Response.Write("<td width=""36"" align=""center"" class=""pagNumberMark""> "& _
" <strong>"&Jo&"</strong> </td>")
Else
Response.Write("<td width=""36"" align=""center"" class=""pagNumber""> "& _
"<a href=""?Pages="&Jo&""" class=""fonte""> "&Jo&" </a></td>")
End If
Next
Else
For Jo = (MaxB - 1) To (Pg - 2)
If PaginaVisita = Jo Then
Response.Write("<td width=""36"" align=""center"" class=""pagNumberMark""> "& _
" <strong>"&Jo&"</strong> </td>")
Else
Response.Write("<td width=""36"" align=""center"" class=""pagNumber""> "& _
"<a href=""?Pages="&Jo&""" class=""fonte""> "&Jo&" </a></td>")
End If
Next
End If
End If
If (TotalPag <> PaginaVisita) And (TotalPag >= 5) Then
Response.Write("<td width=""28"" align=""center"" class=""fontePontos""> ... </td>")
End If
%>
<td width="34" align="center" class="pagNumberMark"><a href="?Pages=<% Response.Write(Proximo) %>" class="fonte"> » </a></td>
<td width="42" align="center" class="pagNumber"><a href="?Pages=<% Response.Write(TotalPag) %>" class="fonte"> Final » </a></td>
</tr>
</table></td>
</tr>
<%
End If
Set Rs_DADOS = Nothing
%>
</table>
</body>
</html>
O resultado final é:
Repare que uso muito os IF’s para saber se é menor que 5, maior que 5 e por aí vai.
O código não é tão difícil quando você começa a utilizar ele com frequência, aprenderá com o tempo!!
Baixe aquio código completo!