Toma posiciones en internet

Paginado en ASP con Access

Publicado por el martes, 05 de abril de 2011.

En mis años de programador me he encontrado constantemente con la necesidad de incorporar un paginado a mis desarrollos, ya fueran noticias, productos o cualquier otra cosa que almacenara en grandes cantidades en la base de datos y que luego tuviera que mostrar al usuario de forma ordenada.

Como suele ser habitual, reutilizo el código de un proyecto a otro, lo que me facilita y agiliza muchas tareas, pero que en ocasiones me hace arrastrar errores.

Y digo errores porque en mi primer paginado en ASP allá por el 2006, realizaba una consulta SQL a la base de datos que me devolvía todos los registros, para después por programación mostrar los 10 que necesitaba en cada momento. Para pequeños proyectos esto no supone un problema pero cuando hablamos de miles de registros y millones de bytes la cosa cambiaba ya que todo se ralentizaba mucho. Por eso investigué la mejor manera de hacer estas consultas y descubrí lo que creo que es la mejor manera de hacerlo.

Aunque poco populares entre los desarrolladores en general, considero que las bases de datos en Access sí pueden ser una buena elección para pequeños proyectos. Tal vez estas bases de datos son las que más limitaciones presentan a la hora de crear un paginado ya que no disponen de ninguna función que nos sirva de ayuda. Por eso, en este caso vamos a necesitar 2 recordsets para hacer el paginado. El primero de ellos nos devolverá todos los identificadores de la base de datos con una consulta similar a esta:

Dim rs_paginado
Dim rs_paginado_cmd
Dim rs_paginado_numRows

Set rs_paginado_cmd = Server.CreateObject ("ADODB.Command")
rs_paginado_cmd.ActiveConnection = cnf_conexion
rs_paginado_cmd.CommandText = "SELECT id_noticia FROM noticias ORDER BY fecha DESC"
rs_paginado_cmd.Prepared = true

Set rs_paginado = rs_paginado_cmd.Execute
rs_paginado_numRows = 0

Los registros que nos ha devuelto esta consulta vamos a pasarlos a un array con el que seleccionaremos los que necesitamos mostrar en nuestra página. Dependerá de varios factores, por ejemplo la página actual que la identificaremos a través del querystring de la página y la cantidad de noticias que queremos mostrar que está representado por la variable cnf_paginarNoticias.

if not rs_paginado.eof then
	arrayPaginado = rs_paginado.GetRows()
	
	paginaActual = 1
	if Request.QueryString("pg") <> "" then paginaActual = Request.QueryString("pg")
	
	paginas = (Ubound(arrayPaginado,2) + 1) \ cnf_paginarNoticias
	if (Ubound(arrayPaginado,2) + 1) mod cnf_paginarNoticias <> 0 then paginas = paginas + 1
	
	inicio = paginaActual * cnf_paginarNoticias - cnf_paginarNoticias
	fin = paginaActual * cnf_paginarNoticias - 1
	if fin > Ubound(arrayPaginado,2) then fin = Ubound(arrayPaginado,2)
	
	for i = inicio to fin
		strPaginado = strPaginado & ", " & arrayPaginado(0,i)
	next
end if

El string que hemos creado finalmente en strPaginado nos servirá para añadirlo a la clausula where de la próxima consulta SQL y así traernos todos los datos de los registros que realmente le queremos mostrar al usuario.

Dim rs_noticias
Dim rs_noticias_cmd
Dim rs_noticias_numRows

Set rs_noticias_cmd = Server.CreateObject ("ADODB.Command")
rs_noticias_cmd.ActiveConnection = cnf_conexion
rs_noticias_cmd.CommandText = "SELECT titular, entradilla, cuerpo FROM noticias WHERE id_noticia IN (0" & strPaginado & ") ORDER BY fecha DESC"
rs_noticias_cmd.Prepared = true

Set rs_noticias = rs_noticias_cmd.Execute
rs_noticias_numRows = 0

Con esto hemos evitado traernos el titular, la entradilla y el cuerpo de todas las noticias que supondría una carga bastante grande para nuestra base de datos para traernos sólo las que vamos a mostrar.

Espero que os haya servido de ayuda y que si teneis alguna duda o mejora que hacer me la sugirais a continuación.

Categoria: programación. Etiquetas: asp, access, paginado.

Posts relacionados

Comentarios

Código antispam: seo2584

© 2010. Desarrollado por mí.