Los Foros de ASPTutor.com
Home | Perfil | Registrarse | Temas Activos | Miembros | Buscar | FAQ
Usuario:
Password:
 Todos los Foros
 ASP
 Paginación
 Foro Bloqueado  Tema Bloqueado


Autor Temas
m0j0
Junior Member

Espa�a
209 Posts
Mensajes - 07 Nov 2003 :  09:12:02  Ver Perfil  Enviar Email
Hola,

Tengo una tabla que recoge los mensajes de un foro.

Tras realizar la consulta sobre la tabla, utilizo el método GetRows del RecordSet para volcar la consulta en un vector bidimensional. Elimino el recordset y la conexión a la base de datos, y paso a trabajar sobre mi vector. Es decir, tengo un vector llamado VectorForo, por ejemplo, en el que he volcado mi consulta sobre la BDD.

Me gustaría paginar los mensajes del foro, así que he mirado distintos ejemplos.

Desarrolloweb - Paginar resultados con ASP
http://www.desarrolloweb.com/articulos/294.php

ASPfacil - Paginando un RecordSet:
http://www.aspfacil.com/articulos/paginar.asp

ASP Tutor - Paginación profesional de resultados:
http://www.asptutor.com/asp/vart.asp?id=10

ASP en castellano - Paginar datos:
http://programacion.com/asp/articulo/paginacion_asp/

Si leéis los artículos veréis que en todas trabajan con el RecordSet, con sus propiedades PageSize, AbsolutePage...

El problema es que yo no estoy trabajando con el RecordSet, así que pierdo la posibilidad de utilizar esas propiedades.

· ¿Al utilizar un vector en lugar del RecordSet pierdo la posibilidad de usar estos ejemplos?
· ¿Conocéis algún ejemplo en el que se pagine pero utilizando un array en lugar del RecordSet?
· ¿Realmente me vale la pena utilizar GetRows para volcar la consulta sobre un array en este caso concreto?
· ¿Es por sí ya suficientemente óptima la paginación usando el RecordSet y no tengo motivo por el que utilizar un array?

_______

Bueno, un saludo, voy a seguir leyendo un poco más sobre el tema.

Javier-msn@mixmail.com


"Un viaje de mil millas comienza con un solo paso" (Lao Tse)

Editado por - m0j0 on 07 Nov 2003 09:15:04

dos
Moderator

España
1575 Posts
Posted - 07 Nov 2003 :  09:38:59  Ver perfil  Enviar e-mail
el truco, amigo mio, esta en conocer cuantos registros tienes y cuantos vas a mostrar en pantalla a la vez.

Con esos dos datos puedes saber cuantas páginas son necesarias para mostrar todos los registros.

Pero pongamos un ejemplo mu tonto (pero sin código)

-número de mensajes: lo recogemos con la funcion UBound(VectorForo,2) + 1 'ese + 1 esta porque UBound empieza por cero como es lógico al devolver el mayor índice de la dimension indicada del array pasado. Pongamos que esto nos da 201 mensajes
-mensajes por página. Pongamos 10 por página.

-número de páginas que nos hacen falta para mostrar todos los mensajes: tienes que dividir el total de mensajes entre el número de mensajes por página y si hay decimales sumarle 1 al resultado. En este caso 201 entre 10 da 20,1. Entonces en este caso debemos mostrar 21 páginas.

Ahora que ya tenemos estos datos, a nuestro sistema de páginacion debemos pasarle un parámetro que indique la página que queremos ver.
En la página 1 mostramos los registros 0 al 9 '10 registros
En la 2 mostramos del 10 al 19
y asi siempre.

Si nosotros tenemos que ese parámetro es el 5, tenemos que mostrar los registros del 40 al 49.

Aun te queda trabajo por hacer, sobre todo desarrollar las funciones para hacer la paginación y saber que hay que mostrar en cada página, pero la idea es esta, ahora te toca currartelo :P

Respuesta a tus preguntas:
- No, no pierdes las posibilidad e usar paginacion. El recordset en realidad usa la lógica comentada arriba pero las guarda en variables privadas suyas mostrandote a ti solo lo que debes saber.
-Algun ejemplo sencillo no y el código que yo tengo para esto no lo tengo ahora mismo a mano, miraré haber si lo encuentro.
-Si, por supuesto que vale la pena, te ahorras un cojon de recursos liberando el recordset y no metiendole tanta caña. Es muy util cuando se van a leer muchos registros de una base de datos solo para mostrarlos.
-La paginacion del recordset es cómoda, que no óptima.

Saludos.

Solo se ayuda al que se ayuda a si mismo. No esperes que nosotros resolvamos tus problemas si tu no te preocupas por intentar resolverlos tu antes.Inicio Pagina

m0j0
Junior Member

Espa�a
209 Posts
Posted - 07 Nov 2003 :  12:41:00  Ver perfil  Enviar e-mail
Hola Dos,

Muchas gracias por tu explicación. Has sido muy claro. Me he puesto manos a la obra del modo que tú dices. Os voy a mostrar los fragmentos más importantes del código. Todavía no he terminado, así que no he podido comprobar si hay algún error, pero la idea general supongo que se entenderá. Luego formularé la duda que se me plantea.

______________________


'----------------------------------------
' DEFINICION DE CONSTANTES
'----------------------------------------
CONST MENSAJES = 10

...

...

...


'----------------------------------------
'Establecemos la conexion con la base de datos
'----------------------------------------
set conexion = Server.CreateObject("ADODB.Connection")
conexion.Provider = "Microsoft.Jet.OLEDB.4.0"
conexion.Open Server.MapPath("DirectorioDeMiBD\nombreDeMiBD.mdb")
'----------------------------------------


'----------------------------------------
'Realizo la consulta sobre mi Base de Datos
'----------------------------------------
consultaSQL = "SELECT * FROM TablaForos ORDER BY ID DESC" 'Muestro primero los más recientes
set rsForo = conexion.execute(consultaSQL)

Dim numeroMensajes 'Numero total de mensajes en el foro
numeroMensajes = 0 'Inicializo el numero de mensajes a 0

'-------------------------
' Guardamos los RecordSets
'-------------------------
If Not rsForo.EOF Then 'Primero compruebo que efectivamente hay algun mensaje
Dim TablaForos 'Defino mi vector TablaForos
TablaForos = rsForo.GetRows 'Vuelvo el Recordset sobre el vector TablaForos
numeroMensajes = UBound(TablaForos, 2) + 1 'Contamos el numero total de mensajes
End If

'---------------------
'Destruimos los objetos
'---------------------
rsForo.Close 'RecordSet
set rsForo = nothing

conexion.Close 'Conexion
set conexion = nothing

'---------------------
' Calculo el número de páginas necesarias
'---------------------
Dim numeroPaginasTotales
numeroPaginasTotales = 0

'Compruebo primero para no realizar una división por cero
If (numeroMensajes <> 0) Then
'CInt convierte de punto flotante a entero, redondeando hacia arriba
numeroPaginasTotales = CInt(numeroForos / MENSAJES_POR_PAGINA)
End if

Dim numeroPagSeleccionada = 1
If Request.QueryString("Pag") <> "" Then
numeroPagAMostrar = Request.QueryString("Pag") 'Pag me indica la página que quiero mostrar
End if

...

...

...

					  	<%
'------------------------------------------------------------
' Mostramos una barra para seleccionar qué página queremos ver
'------------------------------------------------------------
For i = 1 to numeroPagAMostrar
'Si estamos en la pag seleccionada, la mostramos en negrita
If i = numeroPagAMostrar Then
%>
<a href="foro.asp?p=<%=i%>"><strong><%=i%> </strong></a>
<%
Else
%>
<a href="foro.asp?p=<%=i%>"><%=i%> </a>
<%
End If
Next
'------------------------------------------------------------%>


'----------------------------------------------------------------------
' MUESTRO LAS TABLAS CON LOS MENSAJES DEL FORO
'----------------------------------------------------------------------
'Ahora, sabiendo qué página queremos mostrar, y los registros por página,
Dim mensajeInicial
Dim mensajeFinal

mensajeInicial = (numeroPagAMostrar - 1) * 10
mensajeFinal = mensajeInicial + 9 'Pagina 1, mensajes del 0 - 9
'Pagina 2, mensajes del 10 - 19
'Pagina 3, mensajes del 20 - 29
'...
'Compruebo que no me pase del numero de registros
If (mensajeFinal > UBound(TablaForos, 2)) Then
mensajeFinal = UBound(TablaForos, 2)
End if

For i = mensajeInicial To mensajeFinal step 1
'MUESTRO LAS TABLAS
Next

NOTA: Antes de hacer la parte correspondiente a mostrar los mensajes, compruebo que al menos haya mensajes, pero he obviado esa parte.

...

...

...

______________________

Suponggamos que el código estuviese bien escrito y funcionase.

Cuando entro la primera vez, el parámetro "Pag" no tiene ningún valor. Así que mi variable NúmeroPáginaAMostrar toma el valor por defecto, que es 1.

Mostramos entonces los 10 primeros registros. Dado que se cumple que:

'mensajeInicial = (numeroPagAMostrar - 1) * 10
MensajeInicial = (1 - 1) * 10 = 0

'mensajeFinal = mensajeInicial + 9
MensajeInicial = 0 + 9 = 9

Luego supongamos que pulso sobre la pág. 2, y mostramos los registros entre el 10 y el 19. PERO, ¿tengo que volver a establecer la conexión con la base de datos, realizar la consulta, guardar el RecordSet en el vector y realizar las operaciones para calcular el número de páginas necesarias, el número total de mensajes...?

¿Qué críticas le hariáis a mi código?

Un saludo

Javier-msn@mixmail.com


"Un viaje de mil millas comienza con un solo paso" (Lao Tse)


Inicio Pagina
m0j0
Junior Member

Espa�a
209 Posts
Posted - 07 Nov 2003 :  12:55:11  Ver perfil  Enviar e-mail
Hola!,

Ya he arreglado algunos fallos de sintaxis que tenía por ir rápido. También hay variables que las llamaba de una forma, luego las llamaba de otra, en fin, que ya lo he arreglado, he revisado el código en condiciones, y ya funciona a la perfercción.

Eso sí, mi duda sigue ahí. Tengo que realizar de nuevo todas las consultas, operaciones... cada vez que pulso sobre un número de pag? Hay una forma más óptima?

Javier-msn@mixmail.com


"Un viaje de mil millas comienza con un solo paso" (Lao Tse)


Inicio Pagina
m0j0
Junior Member

Espa�a
209 Posts
Posted - 07 Nov 2003 :  13:15:19  Ver perfil  Enviar e-mail
Mmm... hay un pequeño fallo. CInt pensaba que redondeaba hacia arriba, pero no.

Tendré que hacerlo de otra forma. Aquí la pongo por si a alguien le interesa:

'---------------------
' Calculo el número de páginas necesarias
'---------------------
Dim numeroPaginasTotales
numeroPaginasTotales = 0

'Compruebo primero para no realizar una división por cero
If (numeroMensajes <> 0) Then
numeroPaginasTotales = Int(numeroMensajes / MENSAJES)

If numeroPaginasTotales MOD MENSAJES <> 0 Then
numeroPaginasTotales = numeroPaginasTotales + 1
End if
response.Write("Tenemos " & numeroMensajes & " mensajes. Necesitamos por lo tanto "& numeroPaginasTotales &" páginas." )
End if


Javier-msn@mixmail.com


"Un viaje de mil millas comienza con un solo paso" (Lao Tse)


Inicio Pagina
Alexis_m20
Senior Member

Chile
1021 Posts
Posted - 07 Nov 2003 :  13:25:42  Ver perfil  Enviar e-mail  Visit Alexis_m20's Homepage
usa el FormatNumber(valor ,0)

Si puedo ayudar lo hare
Entren a mi web y registrense
http://www33.brinkster.com/alexis20Inicio Pagina

m0j0
Junior Member

Espa�a
209 Posts
Posted - 07 Nov 2003 :  13:42:14  Ver perfil  Enviar e-mail
Hola Alexis_m20,

Gracias por tu interés.
Si utilizo

FormatNumber(MiNumeroConDecimales, 0)

No redondea hacia arriba. Mi intención es que si tengo 27,156, lo redondee hacia 28, y en este caso lo dejaría en 27, por lo que perdería una página.

Con el fragmento de código que he puesto funciona, aunque seguro que hay alguna función que lo haga directamente, es cuestión de perder un poco de tiempo mirándolo.

Tampoco es el tema que más me preocupa ahora. Estoy más interesado en saber cómo puedo evitar realizar todo el rato la misma consulta.

Javier-msn@mixmail.com


"Un viaje de mil millas comienza con un solo paso" (Lao Tse)


Inicio Pagina
dos
Moderator

España
1575 Posts
Posted - 07 Nov 2003 :  15:21:52  Ver perfil  Enviar e-mail
tu forma de redondeo usando Int y MOD es correcta, formatNumber solo modifica el como se muestra un número, no lo modifica.

Cada vez que paginas tu lo que haces es traerte TODOS los registros de la base de datos y solo muestras los que el usuario te ha pedido. Por tanto si, cada vez tienes que volver a coger los datos de la DB. Te puede parecer poco optimo por el consumo, pero siendo francos, es mejor ese poco consumo mas a meter todos los datos en un array, paginarlos con javascript pero que no se actualizen los registros. Eso en un foro es inviable o en todo caso molesto.

Saludos.

Solo se ayuda al que se ayuda a si mismo. No esperes que nosotros resolvamos tus problemas si tu no te preocupas por intentar resolverlos tu antes.Inicio Pagina

   
 Foro Bloqueado  Tema Bloqueado
Ir a:
Los Foros de ASPTutor.com Los Foros de ASPTutor.com
Ir al principio de la Página

 Imprimir Tema
 

Descargas de manuales¦ Ejemplos de código ¦ Artículos mas visitados ¦ Envía tu articulo ¦ Foros ¦
  Libro de visitas ¦Crea un enlace con ASPTutor 
 

    © 2001-Hasta hoy  Pedro Rufo Martín  contactar