dic 21

Paginador de registros

En el articulo anterior, proponiamos una solución a un problema concreto, como siempre, una solucion sencilla a un problema aparentemente complejo, ¿Quitar o no quitar los punteros sigular de plural?

Pues bien, como no debemos quitar nada, porque “Quitar” es sinonimo de “Robar” y eso no esta bien, he decidido que para este ejemplo la frase apropiada es “¡Divide y venceras!”

Ademas, esta división tambien nos reporta beneficios, y no solo en tiempo, sino también economicos (cuando las tarifas de moviles se calculan por volumen de transmisión de datos), aunque el mejor, es la menor carga soportarda por el servidor, y que se traduce en beneficio para el resto de usuarios que trabajan simultaneamente. Ya sabeis, si mis operaciones no saturan la capacidad de vServer, este estará disponible para realizar otras operaciones en menos tiempo y de forma más eficiente.

Basicamente, cuando programamos mal, nos damos cuenta porque la consulta o tarea que esta realizando el servidor es excesivamente lenta y debemos mejorarla para ganar esa velocidad que nos falta. Pero cuando un proceso funciona aparentemente bien, pocas veces intentamos mejorarlo simplemente para quitar carga al servidor y mejorar las tareas de los demas.

Basandonos en esto, voy a explicar como realizar un paginador, que nos permita ver los registros de una tabla (con un volumen de datos elevado).

¿Quien ha pensado alguna vez en hacer una web  mostrando enormes volumenes de datos sin utilizar paginadores?

La respuesta es sencilla, en internet, son tan habituales que no hacerlo seria una excepción.

Y sin embargo, ¿porque? cuando mostramos una rejilla con vClient, nadie piensa en poner un paginador.

Sera porque la respuesta es rapida y no tenemos necesidad, y nos da igual.

En cualquier caso, aqui dejo el ejemplo, y para realizarlo vamos a necesitar los siguientes objetos:

  • una variable global, una para saber el numero de pagina actual
  • otra variable global, para saber el numero de registros a mostrar en cada pagina
  • una busqueda, para mostrar los registros de la tabla, en nuestro ejemplo, sera una busqueda por el indice ID completo, que retorne todos los registros.
  • un proceso para ejecutar la busqueda y retornar la lista de registros
  • una rejilla para mostrar el resultado
  • un formulario, con un control objeto para ejecutar el proceso y mostrar la rejilla y sobre todo, con algunos botones y eventos para controlar nuestro paginador, que es a fin de cuentas, el ejercicio que nos proponemos aqui.

Empecemos pues,

Aqui esta el resultado de nuestro formulario con la rejilla y el paginador, y ahora los vamos a desmenuzar para ver todos sus componentes.

En este momento, necesitaras crear una rejilla de la tabla para la que vas a realizar el ejercicio, y sobre el formulario, como puedes ver, aparece un control objeto que es donde se muestra la rejilla.

El control objeto ejecuta un proceso para retornar la rejilla. Este proceso se encarga de ejecutar la búsqueda y seleccionar los registros a visualizar dependiendo de la página activa en cada momento.

En este punto, si aún no has creado las variables globales, deberias crearlas para usarlas en el proceso, y recuerda que deben ser numéricas. Necesitas una variable global llamada $PAGINA_ACT, para saber en que página nos encontramos y otra llamada $PAGINADOR para saber el nº de registros a mostrar en cada página.

La búsqueda que vamos a definir no es nada compleja. Solo una simple búsqueda por ID con todos los registros de la tabla.

Ahora que yatenemos todos los objetos necesarios para realizar el ejercicio, ha llegado el momento de crear los Eventos del formulario, y el primer evento que vamos a ver es el de inicio del formulario. En este evento le vamos a indicar a las variables globales, los valores por defecto, página actual = 1 y el nº de registros que queremos visualizar en cada página.

Ahora, crea una conexión de evento y le asocias el evento creado, para que el evento se ejecute al inicar el formulario.

Seguimos creando el evento para movernos a la primera pagina y es muy similar al anterior, unicamente tenemos que refrescar el control objeto al finalizar el evento para actualizar nuevamente la rejilla.

Ahora veamos el evento para movernos a la página anterior, solo debemos comprobar si la página actual es > 1 y restar 1 a la variable global.

Ahora que ya tenemos los eventos, solo queda ir a las propiedades de los botones y asociarles su evento correspondiente a cada uno, mediante la propiedad “Ejecutar evento”.

El artículo esta incompleto, solo hemos visto los eventos para movernos a la “Primera página” y para ir a la “Página anterior“, pero con estos ejemplos, ya no deberia resultar dificil crear otros 2 eventos para ir a la “Página siguiente” y a la “Ultima página“, asi pues, consideralo parte del ejercicio y terminalo tú mismo.

En realidad, a pesar de todo este rollo que he metido, se tarda menos en realizar el ejercicio completo que en escribir el articulo.

PDF Printer    Enviar artculo en formato PDF   
comments: Closed

15 Responses to “Paginador de registros”

  1. agustin dice:

    Gracias por compartir tus ideas y tus conocimientos, Jose Luis.
    Lo vuelvo a repetir ” voy en hombros de Gigantes”

  2. Juan Diaz dice:

    Muchas gracias Pepeto, esto me biene fenomenal para el programa de contabilidad.
    Juan Diaz

  3. gegeo dice:

    Grandeeee, si señor.

  4. agustin dice:

    No pido lo del N4 que luego hay gente que se ofende, pero mínimo un N2 ó un N3, este hombre sí que se lo merece ¿ o no?

  5. Pepeto dice:

    Muy agradecido, de verdad.

    Os mantendre informado para los proximos dias, que no vais a tener ni siquiera un dia de descanso esta navidad.

    un abrazo para todos,
    o mejor aún, un abrazo para cada uno de los que me leeis,
    Jose Luis

  6. Miguel dice:

    Ya vamos haciendo uso de la nueva utilidad enviar artuiculo en PDF. Este merece la pena tenerlo en casita.Gracias Jose Luis,

    Un saludo

  7. Miguel dice:

    Hola, Jose Luis, como siempre, sublime, gracias mil.

    PD:Tienes un voto + para que te den el Nx. :-)

  8. Miguel dice:

    La idea está bien, pero hay un problema. La rejilla debe estar ordenada por el ID, ya que si se nos ocurre dar doble click por ejemplo en la columna de nombre, la paginación por ID ya no nos serviría y se iría rodo “al carajo”

  9. Pepeto dice:

    @Miguel

    No hay ningun problema, pruebalo. Si se te ocurre ordenar por la columna “Nombre”, y despues pulsas en “Pagina Siguiente”, te llevara a la pagina siguiente por el indice ID, y funcionara exactamente igual que si no hubieras ordenado nada.

    Esto quiere decir, que el indice para el uso del paginador, lo decides tú, y da igual que el usuario ordene por cualquier columna, el paginador seguira funcionando siempre por el mismo indice.

    un saludo.
    Jose Luis

  10. Miguel dice:

    Hola Pepeto, en primer lugar agradecerte este tipo de articulos que esultan interesantes, pero en este caso no acabo de ver claro que aporta.

    Te comento esto por que la rejilla ya es un paginador, el scroll lateral ya funciona como tal y una vez te ha presentado la primera pantalla, al usuario no el afecta la velocidad, pues si sigue descargando lo hara en segundo plano.

    Además de estar mas optimizado pues, con el paginador, realizar procesos en primer plano que lo relentizan, pero esa es otra cuestión.

    La cuestion es que si la rejilla te presenta la primera pantalla y deja de trabajar, cuando te mueves con el scroll o vas al final, es realmente un paginados pero superoptimizado y si a eso le sumas que el orden de aparicion lo puedes establecer tu con el indice, no acabo de ver ninguna ventaja.

    Ojo igual me estoy equivocando y desde luego como ejemplo se cosas que se pueden hacer esta perfecto, pero en este caso no veo la optimización de lo que viene de serie.

    Y gracias por tus aportaciones constantes de nuevo

  11. admin dice:

    @Miguel Perez

    La verdad es que no se que responderte.
    Como bien dices, es una utilidad y he mostrado como desarrollarla de forma sencilla.
    Si la rejilla es un paginador en si misma, o no, eso lo tiene que decidir cada usuario por si mismo.
    Si a alguien le resulta util, aqui está, yo he indicado unas razones para usarla y de hecho la uso, no muy frecuentemente, pero si donde hay “muuuuuuchoooooos” registros.

    Jorge Hontoria tambien la usa con frecuencia en muchos de sus proyectos de PaaSOS.

    Si en Velneo es apropiada o no, teneis que decidirlo vosotros. Yo he tomado mis propias decisiones.

    un saludo y felices fiestas
    Jose Luis

  12. Miguel dice:

    Me refiero a lo de paginador, no al tema estético el cual es optativo de cada uno como bien dices, sino a tus comentarios sobre una optimización para internet.

    En la rejilla solo viajan los datos que se visualizan y creo que no es más optimizable, aunque por su rendimeinto lo parezca, no carga la lista completa, cuando te desplazas va cargando a medida lo necesita.

  13. Miguel dice:

    Hola, Jose Luis, he estado jugando un poco con esto, pero no me funciona, seguro hago algo mal, lo que veo al poner mensajes en los procesos, es que me ejecuta primero el proceso de búsqueda que el evento inicializado del formulario, esto hace que la variable pagina actual valga 0, lo veo en el mensaje de el proceso de búsqueda. ¿?¿?

    Saludos.
    Miguel.

  14. admin dice:

    @Miguel

    No se que puedes estar haciendo, si me quieres enviar alguna imagen de los eventos, te los revisare.
    Solo puedo decirte que este ejemplo lo tengo funcionando correctamente dentro del E.R.P. , y no tiene nada especial.
    Aclararte unicamente, que todos los procesos se ejecutan en 1 plano, por si te sirve de ayuda.

    un saludo
    Jose Luis



Pings responses to this post