paginacion del Grid

19/01/2006 - 18:50 por Imac_man | Informe spam
Saludos,


Es posible crear un grid paginado..¿Como se hace?


gracias por su ayuda

Preguntas similare

Leer las respuestas

#6 Jesús López
20/01/2006 - 14:32 | Informe spam
Explicar como implementar la paginación no es algo que se pueda hacer en unas
cuantas líneas. Así que este será el primero de una serie de respuestas hasta
terminar de explicarlo todo.

Primero habría que decir que para que una paginación sea eficiente, hay que
solicitar al servidor de base de datos sólo los datos correspondientes a la
página que se va a mostrar. Hay por ahí buenas y malas implementaciones de la
paginación, una de las peores que he visto es la que lleva incorporada el
DataGrid de ASP.NET 1.1, es muy facilito de hacer, pero tremendamente
ineficiente.

Primero voy a empezar por explicar la parte SQL suponiendo además que
estamos trabajando con SQL Server 2005, da igual que sea express o cualquier
otra edición.

La paginación más eficiente es aquella en la que sólo se permite ir a la
página siguiente y a la anterior. Bueno, esto no es de extrañar, cuanto más
sencillas son las cosas más eficientes suelen ser.

Esta parte la voy a explicar por medio de un ejemplo sencillo. Voy a tomar
la tabla Person.Contact de la base de datos AdventureWorks que tiene unos
20.000 registros.

Generalmente mostraremos ciertos campos de la tabla, no todos, ordenados por
alguno en concreto. Supongamos que ordenamos por LastName y que mostramos os
siguientes campos: ContactID, FirstName, MiddleName, LastName, EmailAddress,
Phone. Lo más eficiente para obtener los datos así, es tener un índice de
cobertura que incluya todos los campos y su clave sea LastName, ContactID. De
esta manera SQL Server no tendrá que leerse toda la tabla y ordenarla sino
que irá al índice que ya está ordenado y contiene todos los campos
necesarios. Para crear este índice ejecutamos la siguiente instrucción:

CREATE INDEX Contact_LastName
ON Person.Contact(LastName, ContactID)
INCLUDE(FirstName, MiddleName, EmailAddress, Phone)
GO

Para implementar la paginación sencilla, vamos a usar los siguientes
procedimientos almacenados:

CREATE PROCEDURE GetContactsFirstPage
@PageSize int
AS
SELECT TOP (@PageSize) ContactID, FirstName, MiddleName,
LastName, EmailAddress, Phone
FROM Person.Contact
ORDER BY LastName, ContactID
GO

El siguiente procedimiento nos devuelve la siguiente página de contactos
conociendo el último registro de la página anterior. Así que la aplicación
cliente tendrá que guardar el último registro de la página que está mostrando.

@PageSize: el tamaño de la página
@PreviousBotomLastName: el LastName del último registro de la página
anterior a la que queremos obtener.
@PreviousBottomContactID: el ContactID del último registro de la página
anterior a la que queremos obtener

CREATE PROCEDURE GetContactsNextPage
@PageSize int,
@PreviousBottomLastName nvarchar(50),
@PreviousBottomContactID int
AS
SELECT TOP (@PageSize) ContactID, FirstName,
MiddleName, LastName, EmailAddress, Phone
FROM Person.Contact
WHERE LastName > @PreviousBottomLastName OR
(LastName = @PreviousBottomLastName AND
ContactID > @PreviousBottomContactID)
ORDER BY LastName, ContactID


GO

El siguiente procedimiento nos devuelve la página anterior conociendo el
primer registro de la página siguiente.

@PageSize: el tamaño de la página
@NextTopLastName: el LastName del primer registro de la página siguiente a
la que queremos obtener.
@NextTopContactID: el ContactID del primer registro de la página siguiente a
la que queremos obtener.

CREATE PROCEDURE GetContactsPreviousPage
@PageSize int,
@NextTopLastName nvarchar(50),
@NextTopContactID int
AS
SELECT TOP (@PageSize) ContactID, FirstName,
MiddleName, LastName, EmailAddress, Phone
FROM Person.Contact
WHERE LastName < @NextTopLastName OR
(LastName = @NextTopLastName AND
ContactID < @NextTopContactID)
ORDER BY LastName DESC, ContactID DESC
GO

Esta técnica es muy eficiente y puede implementarse de manera similar en
otros sistemas de bases de datos. Cabe señalar que SQL Server 2000 no admite
un parámetro en la cláusula TOP, sólo admite literales. Así en SQL Server
2000 habría que usar ejecución dinámina, preferiblemente con sp_executesql,
dentro de los procedimientos almacenados, o bien, no usar procedimientos
almacenados y generar la instrucción SQL en el cliente concatenando cadenas
para la parte TOP.

El próximo mensaje trarará de implementar una paginación donde esté
permitido ir a una página en concreto sin tener que pasar por todas las
anteriores.

Quizá sería mejor publicar un artículo acerca de la paginación, por ejemplo
en la página del Guille, en vez de andar con mensajes en el grupo.

Saludos:

Jesús López
MVP VB
Solid Quality Learning
www.solidqualitylearning.com



"Imac_man" escribió:

Saludos,


Es posible crear un grid paginado..¿Como se hace?


gracias por su ayuda



Respuesta Responder a este mensaje
#7 Eduardo Alvarado Meza
20/01/2006 - 18:58 | Informe spam
Ese mismo es el codigo que tengo implementado, aunque te cuento que me
hicistes sentir mal con lo del RowNumber y Between del SQL2005, realmente me
hicieron trabajar para nada esta gente de la microsoft, aunque cuando lo
implemente aun ni existia el 2005 lastima.
Respuesta Responder a este mensaje
#8 Jesús López
20/01/2006 - 19:20 | Informe spam
Hiciste muy bien en implementar la paginación de esa manera, es más
eficiente que usar el row number, sobre todo al final de la paginación
porque SQL Server se tiene que leer todos los registros anteriores, al menos
para contarlos. Así que si el usuario solicita la siguiente página o la
anterior, lo mejor es pasar del row number y hacerlo como lo has hecho y
como lo he comentado yo en la primera entrega, pero si el usario solicita
una página cualquiera, entonces el row number es estupendo. Lástima que SQL
Server 2000 no tenga lo del row number. Aunque os tengo preparada una
sorpresa de como implementar lo de ir a una página cualquiera en SQL Server
2000 por medio de cursores de servidor. Sí como lo oyes, cursores de
servidor !!. Aunque los cursores de servidor tienen muy mala fama, es la
mejor opción en este escenario con SQL 2000. Lástima que ADO.NET no tenga
soporte para cursores de servidor (en la beta 1 de .NET 2.0 estaban, pero
los quitaron en la beta 2), pero podemos echar mano del antiguo ADO, ¿Aunque
quizás exista otra alternativa?. ¿Pueden usarse cursores de servidor en
ADO.NET aunque no haya soporte para ellos ?. Lo veremos en el siguiente
capítulo :-)

Saludos:

Jesús López
MVP


"Eduardo Alvarado Meza"
escribió en el mensaje news:u%
Ese mismo es el codigo que tengo implementado, aunque te cuento que me
hicistes sentir mal con lo del RowNumber y Between del SQL2005, realmente
me hicieron trabajar para nada esta gente de la microsoft, aunque cuando
lo implemente aun ni existia el 2005 lastima.

Respuesta Responder a este mensaje
#9 Eduardo Alvarado Meza
21/01/2006 - 16:41 | Informe spam
Eso me alegra, y estare muy ancioso para ver eso, ahora solo me lo puedo
imaginar vagamente...
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida