quarta-feira, 25 de abril de 2001

Código de paginação

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 ) %>&nbsp;</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>&nbsp;"
 end if


 for n = 1 to rsQuery.pageCount
     if n = Session("PaginaAtual") then
        response.write n & "&nbsp;" ' 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>&nbsp;"
     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>&nbsp;"
 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


%>



Esta matéria foi postada originalmente no ASP4Developers por Rubens N. Farias (site), que na época era "pós-graduado em análise de sistemas orientados a objetos, MCP, MCSD, MCAD, MCSD.NET e consultor em TI, além de idealizador do projeto ASP4Developers. Desenvolve sistemas sob medida, focados na satisfação do usuário, com qualidade e custo realista.". Hoje, vai saber...

0 comentários: