Portada | Monotemáticos | Secciones | Desarrolladores | Comunidad | Servicios | Servicios profesionales | RSS
Desde 0 | HTML | CSS | ASP | PHP | AJAX | Javascript | Promoción de webs | Rentabilidad de webs
Directorio | Manuales | Scripts | FAQs | Programas | Artículos Copyleft | Actualidad | La Cosecha | Colabora
Registrarse | Vuestras páginas | Foros del web | Lista de correo | Boletín de novedades
Generador METAs | Compras | Busca cursos
Alojamiento | Dominios.es | Micropagos SMS | Buscadores | Patentes, marcas | Creación web | Multimedia | Videos
Desarrollo Freelance | Buscar proyectos | Buscar profesionales | Solicitar desarrollo

Paginar resultados en 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.


01/1/70 - 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.

 Seguir navegando a partir aquí:
+ 1 manual relacionado
+ 3 categorias relacionadas
+ 8 comentarios (Añadir)
+ 3 comentarios no revisados

 Autoría, licencia y acciones sobre este artículo

Informe de Rubén Alvarez*

Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

* Para consultas técnicas utilizar la lista de correo.

Versión imprimible Versión imprimible del artículo
Enviar artículo por e-mail Enviar artículo por e-mail
Añadir un comentario al artículo Publicar un comentario del artículo

Manuales relacionados con este artículo
Dentro de Taller de ASP
Siguiente: Global.ASA

Categorias relacionadas
A través de las categorías de nuestro directorio se pueden encontrar otro tipo de recursos relacionados con este artículo:
+ Entrar en Colecciones de scripts
+ Entrar en Scripts en ASP
+ Entrar en Manuales de ASP


 Comentarios de los visitantes
Los comentarios de los visitantes son para ampliar la información del artículo. Cualquiera puede participar.
Se muestran 8 comentarios revisados

 Comentario de 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.


 Comentario de 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.


 Comentario de 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?


 Comentario de 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.


 Comentario de 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)

 Comentario de 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.

 Comentario de 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>

 Comentario de 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.

Añadir un comentario al artículo Añadir un comentario del artículo
 Comentarios sin revisar
Entre los comentarios no revisados puede haber algunos interesantes que se hayan enviado recientemente.
 Se han encontrado 3 comentarios sin revisar

Ver el comentario no revisadoVer los comentarios no revisados
Añadir un comentario al artículo Añadir un comentario del artículo



Enlaces:
Maestrosdelweb
  Ir arriba

Manuales relacionados
+Taller de ASP
Categorías
+Colecciones de scripts
+Scripts en ASP
+Manuales de ASP

Lectura recomendada

Compra este libro en Agapea, la librería urgente a domicilio.

Tienda DesarrolloWeb

DesarrolloWeb.com | Copyright | Anunciese | Acerca de | Datos legales | Contacta | Por GuiarteMultimedia