> Manuales > Taller de ASP

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.

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.

Rubén Alvarez

Rubén es doctor en química y programador aficionado con experiencia en PHP.

Manual