Paginar resultados en ASP

Valoración del artículo:
Aprende a paginar los resultados obtenidos al consultar una base de datos. Listado y descripción del script que podrás fusionar con el buscador de este mismo taller.
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
En artículos precedentes hemos visto que cuáles son las propiedades y métodos principales del objeto RecordSet, ahora sólo nos queda ponerlos en práctica para afianzar nuestros conocimientos.

En este capítulo os proponemos y describimos un script que divide en distintas páginas los registros obtenidos a partir de una consulta a la base de datos mediante la explotación del objeto RecordSet.

Se trata de un derivado del clásico script que podemos encontrar en cualquier tipo de buscador. De hecho, este script puede ser muy fácilmente fusionado con el prototipo de buscador propuesto en este mismo taller de manera a gestionar la construcción de una sentencia SQL que, después de su ejecución, va a poder ser paginada por medio de este script.

A continuación os presentamos el listado que, para más claridad, utiliza una única sentencia SQL. Dejamos a vuestra cuenta la fusión de este script con el del buscador.

<html>
<head>
   <title>Repaginador de resultados</title>
</head>
<%
sSQL="select lo que tu quieras"
'esta sentencia SQL puede ser creada a partir de un buscador como el que hemos visto en otro reportaje
'y almacenada en una session para emplearla sucesivas veces en el script: session("ssql")=ssql

'actualizamos numero de pagina
If Request.QueryString("pag")<>"" Then
   Session("pagina")=Request.QueryString("pag")
Else
   Session("pagina")=1
End If

'constantes ADO VBScript
Const adCmdText = &H0001
Const adOpenStatic = 3

Set Conn = Server.CreateObject("ADODB.Connection")
Set Command = Server.CreateObject("ADODB.Command")
Set RS =Server.CreateObject("ADODB.RecordSet")
Conn.Open "nombre de tu base de datos"
RS.Open sSQL,Conn,adopenstatic,adcmdtext

'resultados por pagina a elegir arbitrariamente
num_registros = 5

'Dimensionamos las paginas y determinamos la pagina actual
RS.PageSize=num_registros
RS.AbsolutePage=Session("pagina")
%>

<body>
<div align="center">
Número de página actual: <b><%=Session("pagina")%></b>
<br>
Número de páginas total: <b><%=RS.PageCount%></b>
<br>
Número de registros por página: <b><%=RS.PageSize%></b>
<br>
Número de registros seleccionados: <b><%=RS.RecordCount%></b>
</div>
<br><br>

<table cellspacing="2" cellpadding="2" border="1" align="center">
<%
'Contamos el numero de campos
num_campos=RS.Fields.Count
For campo=0 to num_campos-1%>
   <td align="center"><%=RS(campo).Name%></td>
<%
Next
registros_mostrados = 0
While (Not RS.eof And registros_mostrados < num_registros)
   registros_mostrados = registros_mostrados +1
%>
   <tr>
   <%For campo=0 to num_campos-1 %>
      <td align="center"><%=RS(campo)%></td>
   <%Next%>
</tr>
<%
   RS.MoveNext
Wend
%>
<tr>
<td colspan="<%=num_campos%>" align="center">
<%
   i=0
While i<RS.PageCount
   i=i+1
%>
   <b><a href="paginar.asp?pag=<%=i%>"><%=i%></a></b>
<%
Wend
%>
</td>
</tr>
</table>
<%
RS.Close
Conn.Close
%>
</body>
</html>


Puedes descargar y ejecutar el script conectado una tabla ejemplo creada por nosotros.

El primer paso ha sido definir le sentencia SQL cuyos resultados vamos a páginar. Si queremos fusionar este script al del buscador deberemos guardar la orden generada por nuestras funciones en una variable session para no perderla cada vez que pinchamos sobre uno de los enlaces para movernos a otra página con resultados.

A continuación definimos la página en la que nos encontramos. Esta será la primera por defecto o tendrá un valor definido (pasado por URL) si el internauta se encuentra navegando por los resultados.

La apertura del objeto RecordSet ha de hacerse en este caso de una forma distinta a como hemos visto en casos anteriores. Una serie de parámetros en forma de constantes son requeridos para su correcta apertura. No vamos a entrar en detalles sobre lo que ello significa únicamente diremos que estos parametros forman parte de una colección de constantes ADO que podéis descargar aquí en formato texto. Diremos también que ésta es la forma clásica de apertura que nos permite seleccionar los registros mediante SQL y movernos en todos los sentidos con el puntero del objeto RecordSet.

Ejecutada la sentencia SQL nos quedan por dimensionar las páginas. Deberemos especificar el número de registros a mostrar en cada una (PageSize) y en cuál de ellas nos encontramos (AbsolutePage). El objeto se encargará de calcular otra serie de propiedades como son el número de páginas total (PageCount) y el número de registros presentes en nuestro objeto (RecordCount).

Hemos querido aprovechar este artículo para presentar dos propiedades útiles para la gestión de campos: La coleccion Fields, que nos da acceso al conjunto de campos cuyo número puede ser fácilmente computado (RS.Fields.Count) y, por otro lado, la propiedad Name que nos permite extraer el nombre de dichos campos tal y como podemos ver en el primer bucle for.

La forma de mostrar los resultados en pantalla no difiere de lo visto en otros scripts. Tan sólo hay que acordarse de introducir una condición suplementaria en el bucle While y es que la cantidad de registros mostrados no sobrepase el número de registros por página previamente definido.

Finalmente, antes de cerrar los objetos, generamos dinámicamente los enlaces que apuntan hacia esta misma página por los que pasamos el número de página que queremos visualizar. Este bucle, simplificado al máximo, puede ser complementado con un enlace a la página anterior, otro a la siguiente, uno a la primera y otro a la última. Podemos también generar el numero de página actual no en forma de enlace sino en forma de texto simple puesto que esto le permite al visitante ver rápidamente en qué página se encuentra y evita el mostrar un enlace que apunta al mismo contenido que se está viendo.

Otras mejoras posibles son: Calcular el intervalo de resultados que se está mostrando en la página (La frase típica: "He aquí los resultados de x a y"), un mensaje de "Ningún resultado obtenido" para casos en los que el Recordset esté vacio (RS.Eof), presentar un formulario para efectuar una nueva búsqueda sin salir de la página...

Esperamos que saquéis provecho de este script para vuestro sitio web.

Comentarios
Fueron enviados 10 comentarios al artículo
2 comentarios no revisados
8 comentarios revisados:
Por: Rubén Fernández
27/11/01
No me funciona tal cual, AbsolutePage, le asigne lo que le asigne, me devuelve siempre -1, ¿podríais decirme por qué?

Respuesta:

¿Estás seguro de que abres el recorset igual que lo abrimos en el ejemplo?

Hay varios tipos de recorset en ASP y no todos pueden hacer las funciones necesarias para el paginado.

Por: al
01/6/02
existe alguna posibilidad de trasladar esto al php??
Gracias

Respuesta:

La verdad es que no se puede trasladar esto directamene a PHP, pero por supuesto puesdes programar en ese lenguaje una paginación de resultados.

Para ello, dependiendo de la base de datos que utilices puede cambiar. Es probable que la base de datos que utilices admita en su lenguaje SQL la función de limitar el número de registros del resultado de la consulta. Esto se hace con el enunciado LIMIT que permite traerse un número de registros acotado. En mySQL, por ejemplo, puedes hacerlo perfectamente.

Entonces sólo tendrías que programar un poquito con PHP para que tu consulta extraiga la página de datos que deseas imprimir en la página y un sistema para que se pueda seleccionar cualquier página de entre los resultados.

Por: musika
10/6/02
He ultilizado el codigo y es perfecto.. pero necesito saber somo publicar solo el ùltimo destacando los detalles registro y bajo el resto de los registros...
me explicas como hacerlo???

¿Alguien entiende que estoy preguntando?

Por: Marcelo Damiani
05/4/03
¿Cómo puedo paginar en asp si no tengo sql? solo tengo Base Access.

RESPUESTA

No te lies, o perdona si no nos hemos explicado bien. Puedes paginar con cualquier base de datos, incluida Access. Todas las bases de datos se pueden acceder a través del lenguaje SQL. De hecho, creo que este ejemplo se realizó utilizando Access.

Por: EMF
21/11/03
Es cierto que cuando se usa el metodo RecordCount para el RecordSet devuelve -1, para corregir esto definir el tipo de Cursor a utilizar en tu RS. Con el codigo de abajo a mi se me corrigio el problema:

RS.CursorType = 1
sSQL = "select * from tabla"
RS.Open sSQL,Conn
Response.Write(RS.RecordCount)
Por: Fran
28/7/05
Antes de nada dar las gracias por escribir artículos tan didácticos.
He estado adaptando el codigo para darle un aspecto más profesional, poner
barras de desplazamiento < 124 > , y que no me muestre enlaces a todas las paginas sino a un subconjunto, por ejemplo que salgan solo 4 páginas. Para ello me he tenido que pelear con PageCount dandome resultados inesperados en comparaciones tipo
if(session("pagina") > (ors.pagecount -4)).
He probado a unar Cint Clng y trim y los resultados eran similares
Al final he tenido que que hallar el numero de páginas mediante unas sencillas cuentas sobre recordcount y he solucionado el problema.
Si a alguien le ha pasado esto y lo ha solucionado de otra forma o alguien tine idea de como obligar a que algo que aparetemete es un número lo sea y se comporte como tal, le estaría muy agradecido.
Sin más me despido y me disculpo por el tostón de comentario.
Por: Bzero
25/11/05
miren si quieren hacer anuncios paginados desde una base de datos y que al hacer clik en uno de ellos mostrar su contenido del anuncio
este es el codigo espero que les sirva
esta pag se llamara "lista" y la pagina que muestra el contenido "ver"
<html>
<head>
<!-- esto la direccion del css -->
<style type="text/css"> @import url ("stil.css"); </style>
</head>
<%
'Conexion a tu base de datos
StrConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="& Server.MapPath("./db/tu_bd.mdb")
'Consulta SQL
sql = "SELECT * FROM TablA where CampO > 0"
'Configurar aqui los registros por página
num_registros = 7

'actualizamos la pagina actual
if (request.queryString("pag") <> "") then
pagina_actual = request.queryString("pag")
else
pagina_actual = 1
end if
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open StrConn
Set RS = Server.CreateObject("ADODB.RecordSet")
RS.Open sql,oConn,3,1
RS.pageSize = num_registros
RS.absolutePage = pagina_actual
%>
<body>
<%
registros_mostrados = 0
While (Not RS.EOF And registros_mostrados < num_registros)
registros_mostrados = registros_mostrados +1
%>

<table style="border: double;" width="500"><tr>
<%
Response.Write "<td width=""300"" height=""20""><div id=""estilo4"" style=""font-family:Verdana;font-size:x-small;color:999;text-align: left;""><img src=""img/edit.gif"">&nbsp;&nbsp;&nbsp;&nbsp;<a href=ver.asp?id=" &rs.Fields("CampO") & ">"&rs.Fields("Nombre_de_titulO")&"<br><a aling=""left""></td><td width=""200"" height=""20""><img src=""img/home.gif"">&nbsp;&nbsp;"&rs.Fields("Fecha_de_la_bD")&"</a></a></div></td>"
%>
</tr></table>
<%
RS.MoveNext
Wend
i=1
Do While i < RS.PageCount + 1
%>
<a href="lista.asp?pag=<%=i%>">-<%=i%>-</a>
<%
i=i+1
Loop
%>
</td>
</tr>
</table>
<%
'se limpian los objetos
RS.Close
Set RS = Nothing
oConn.Close
Set oConn = Nothing
%>
</body></html>
Por: felipe
23/8/06
Queria agradecer por la aplicacion la adapte a mi sistema y con unos cambios por aqui y por alla quedo justo como queria muchas gracias.

Manuales relacionados
Categorias relacionadas
El autor
Rubén Alvarez
Redactor de DesarrolloWeb.com
http://www.desarrolloweb.com
Lectura recomendada
Compra este libro en Agapea, la librería urgente a domicilio.
Últimas noticias
Alojados en el grupo