Fazer uma paginação nada mais é do que, pegar um recordset e dividí-lo em páginas, contendo, cada uma delas, uma pequena quantidade de registros, de forma a facilitar a visualização dos dados pelos usuários, no caso de consultas que retornam um número grande de registros.
Como as dúvidas sobre paginação são freqüentes, montei o código abaixo. As únicas coisas que precisam ser alteradas é o nome do banco de dados e o comando SQL. O código está comentado a cada rotina, facilitando a compreensão dos procedimentos envolvidos.
<%
Const TamanhoPagina = 10 'Define o número de registros por página
' Inicialmente, criaremos o objeto connection que irá acessar o banco de dados.
' Note que, antes de abrirmos este objeto, precisamos definir a propriedade
' CursorLocation
set Conn = Server.CreateObject("ADODB.Connection")
Conn.CursorLocation = 3 'adUseClientBatch
Conn.open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.mappath("data.mdb")
' Aqui, criamos o recorset. Precisamos definir o PageSize, como sendo o número de registros
' por página que desejamos e o CursorType para 3, por garantia.
set rsQuery = Server.CreateObject( "ADODB.RecordSet" )
rsQuery.PageSize = TamanhoPagina
rsQuery.CacheSize = TamanhoPagina
rsQuery.CursorType = 3
rsQuery.Open "select * from users order by userId", Conn
' Nas linhas abaixo, é feita a validação da seleção do usuário, evitando
' que ele coloque o que quiser na URL, fazendo sua página falhar.
if Session("PaginaAtual") = "" then Session("PaginaAtual") = 1
select case Request.QueryString( "modo" )
case "proxima"
Session("PaginaAtual") = min( Session("PaginaAtual") + 1, rsQuery.PageCount )
case "anterior"
Session("PaginaAtual") = max( Session("PaginaAtual") - 1, 1 )
case "pagina"
if isNumeric( request.QueryString("numero") ) then
Session("PaginaAtual") = cint( request.QueryString("numero") )
Session("PaginaAtual") = max( min( Session("PaginaAtual"), rsQuery.PageCount ), 1 )
end if
end select
' Uma vez definida qual é a página atual, passamos esta informação para
' o recordset ser posicionado no primeiro registro da página desejada
rsQuery.AbsolutePage = Session("PaginaAtual")
limite = rsQuery.Fields.Count - 1
%>
<html>
<title>Exemplo básico de paginação</title>
<body>
<table width="100%" align=center border=1>
<tr class="color2"><%
' Aqui nós mostramos todos os campos do recordset.
' Você pode removê-la e incluir seu próprio cabeçalho personalizado.
For n = 0 To limite %>
<th><%= rsQuery.Fields.Item(n).name %></th><%
Next %>
</tr><%
' Passemos para a exibição da página do recordset em si.
' Devemos mostrar (TamanhoPagina) registros ou até o fim do recordset, o que vier primeiro.
item = 1
do while item <= TamanhoPagina and not rsQuery.eof
%>
<tr class="color<%= ( item mod 2 ) %>"><%
For n = 0 To limite %>
<td valign=top><small><%= rsQuery( n ) %> </small></td><%
next %>
</tr><%
rsQuery.movenext
item = item + 1
loop
' Logo abaixo, mostramos a quantidade de registros
' e os links para o usuário alternar entre as páginas
%>
</table>
<p>
Há <%= rsQuery.RecordCount %> registros no banco de dados<br>
Você está na página <%= Session("PaginaAtual") %> de <%= rsQuery.PageCount %><br>
Ir para página: <%
if Session("PaginaAtual") > 1 then 'Colocar o link para página anterior se não for a primeira
response.write "<a href=""index.asp?modo=anterior"">Anterior</a> "
end if
for n = 1 to rsQuery.pageCount
if n = Session("PaginaAtual") then
response.write n & " " ' Se for a página atual, não colocar link, só o número dela.
else
response.write "<a href=""index.asp?modo=pagina&numero=" & n & """>" & n & "</a> "
end if
next
if Session("PaginaAtual") < rsQuery.pageCount then 'Colocar o link para próxima página se não for a última
response.write "<a href=""index.asp?modo=proxima"">Próxima</a> "
end if
%>
</p>
<center>Visite <a href="http://asp4developers.cjb.net">ASP4Developers</a></center>
</body>
</html>
<%
'Rotinas genéricas, para facilitar a programação:
' IIF: Retorna o valor1, caso a condição seja verdadeira; caso contrário, retorna valor2
function iif ( condicao, valor1, valor2 )
if condicao then iif = valor1 else iif = valor2
end function
' MIN: Retorna o menor valor dentre dois passados
function min( value1, value2 )
min = iif( value1 < value2, value1, value2 )
end function
' MAX: Retorna o maior valor, dentre dois passados
function max( value1, value2 )
max = iif( value1 > value2, value1, value2 )
end function
%>
0 comentários:
Postar um comentário