Sexta, 26 de Abril de 2024




 Consulta Paginada em ASP

Aqui temos uma breve descrição de uma solução em ASP para uma construção considerada complicada de se fazer: A consulta paginada.

Para um melhor entendimento, será melhor uma leitura inicial da Publicação de Padronização de Página ASP.

A melhor maneira de se fazer uma consulta paginada é concentrá-la numa única página fonte, que será recarregada por si própria a cada mudança de página.

Note que a página em questão tem apenas UM parâmetro de entrada: O número da página. Para a paginação em si este único parâmetro é suficiente. Poderão ser utilizados outros parâmetros para programar a consulta a ser feita, mas para a paginação não é necessário.

Não está sendo apresentado aqui o código completo de uma página e sim partes principais do código, para entendimento.


1) Exemplo da área de definição da página:

' =========================< CONSTANTES >============================

' Quantidade de itens por página:
Const cQtdItemPag = 10


' ==========================< VARIÁVEIS >============================

' Número (Inteiro) da página atual:
dim NumPag

' Clausula Where da sua consulta SQL:
dim sWhere



2) Recepção de parâmetros e carga inicial das variáveis:

Caso o número da página recebida seja vazio ou não numérico, assumimos como sendo 1 (primeira página). Desta forma, quando a página for chamada pela primeira vez, sem parâmetros, apresentará a primeira página da consulta:

Pag = Request("Pag")
' Se página não indicada, assume a 1 (um):
if Pag = "" then Pag = "1"
if IsNumeric(Pag) then
    NumPag = CInt(Pag)
else
    NumPag = 1
end if


A cláusula Where da consulta poderá ser fixa ou gerada a partir de outros parâmetros recebidos. Ela é gerada como variável de página para simplificar, pois serão necessárias duas consultas com a mesma seleção:

sWhere = " WHERE . . . "



3) Apresentação dos registros:

Para a apresentação dos registros será necessário fazer uma consulta a partir do primeiro registro da página atual. Este registro pode ser calculado a partir do número da página atual e da Quantidade de ítens por página.

Como alguns SQLs (como o Access), não tem um comando para fazer uma consulta a partir de um dado registro, utiliza-se de um artifício para posicionar a consulta até o registro desejado, fazendo um Loop de MoveNext.

Com a consulta aberta e posicionada, basta fazer outro Loop para apresentar os dados:

sub GeraRegistros()
    dim s, oRs
    dim i, RegIni

    ' Inicializa o Recordset da Consulta:
    s = "SELECT * FROM tbTabela " & sWhere
    s = s & " ORDER BY . . . "
    set oRs = oCn.Execute(s)

    ' Calcula e posiciona no registro inicial:
    RegIni = (NumPag - 1) * cQtdItemPag
    if RegIni > 0 then
      for i = 1 to RegIni
        if oRs.EOF then exit for
        oRs.MoveNext
      next
    end if

    ' Gera até uma página da consulta,
    ' com os dados recolhidos de oRs:
    for i = 1 to cQtdItemPag
      if oRs.EOF then exit for
      %>
          . . .
      <%
      oRs.MoveNext
    next

    ' Finaliza Consulta:
    oRs.Close
    Set oRs = Nothing
end sub



4) Links de Paginação:

Uma simples consulta na base nos indica quanto registros existem na consulta.

Com a quantidade de registros da consulta e a quantidade de ítens por página calculamos quantas páginas existirão na consulta.

Sabendo a quantidade de registros podemos montar os Links das páginas da consulta. Estes Links remeterão à própria página, passando o número da página desejada. A página atual não é montada como Link. Os links Anterior e Próxima aparecem como links, conforme a necessidade:

sub GeraPaginacao()
    dim s, oRs
    dim i, QtdReg, QtdPag

    ' Inicializa Vars:
    QtdReg = 0
    QtdPag = 1

    ' Inicializa o Recordset da Consulta atual:
    s = "SELECT Count(*) AS QtdReg FROM tbTabela " & sWhere
    set oRs = oCn.Execute(s)
    if not oRs.EOF then
      QtdReg = oRs("QtdReg")
      QtdPag = Int((QtdReg - 1) / cQtdItemPag) + 1

      if NumPag > 1 then
        %>
        <a href="JavaScript:SelPag('<%=(NumPag-1)%>')">Anterior</a>
        &nbsp;
        <%
      else
        %>
        Anterior&nbsp;
        <%
      end if

      for i = 1 to QtdPag
        if i <> NumPag then
          %>
          <a href="JavaScript:SelPag('<%=i%>')"><%=i%></a>
          &nbsp;
          <%
        else
          %>
          <%=i%>&nbsp;
          <%
        end if
      next

      if QtdPag > 1 and NumPag < QtdPag then
        %>
        <a href="JavaScript:SelPag('<%=(NumPag+1)%>')">Próxima</a>
        &nbsp;
        <%
      else
        %>
        Próxima&nbsp;
        <%
      end if
    end if
    oRs.Close
    Set oRs = Nothing
end sub



5) Código JavaScript:

A função JavaScript chamada nos Links, simplesmente irá carregar o número da página dada como parâmetro no campo hidden "Pag", que deverá estar definido dentro do form principal da página e submetê-la a ela mesma:

<Script Language=JavaScript>
function SelPag(Pagina){

  var f = document.form;

  f.Pag.value = Pagina;
  f.action = "Nome da Pagina atual";
  f.submit();
}
</Script>



¤ Links Relacionados:
- Padronização de Página em ASP