Existe alguna forma de paginar un ALV ?

sap-abap
Etiquetas: #<Tag:0x00007fb691579938>

#1

Holaaa a todos necesito paginar un ALV ya que el mismo devuelve mas de 12 millones de registros … alguna idea???

:neutral_face: :scream:

graciaasssss !!!


#2

Buenas @silvis,

pues si que te aparecen resultados, :sweat_smile:, jejeje.

Supongo que el ALV será para mostrar un informe en el que podrás filtrar por parámetros de selección no? Si es así, podrías obligar al usuario a introducir algún valor para reducir los resultados.

Independientemente de lo anterior, lo he hablado con un compañero y una posible solución sería añadir un botón (Página siguiente/Anterior) e implementar la funcionalidad, refrescando el ALV y controlando los registros según la página a mostrar.

A ver si te sirve, :).

Saludos!


#3

holaaaa gracias por tu respuesta :slight_smile:

alguna idea de como filtrar una cantidad de lineas en cada pagina por ejemplo 500 lineas??
como seria la funcionalidad de esos botones ?

graciassss


#4

Hola,
Lo que se me ocurre es que tengas una tabla interna previa llamésmola “Tabla_Previa”, que contendrá los millones de registros y le agregues un campo numerador . Y en el primer despliegue de información solo llenes tu “Tabla_ALV” con 500 registros de “Tabla_Previa”. Configura un botón llamado “NEXT PAGE”, y cuando lo opriman, llena la “Tabla ALV” con los siguientes 500 registros, y refresca el REUSE_ALV_GRID_DISPLAY. Guarda en variables el rango de registros que vas mostrando, por si quieres agregar el botón “PREVIOUS PAGE”. Espero te sirva.
Saludos.


#5

Buenas @silvis,

pues como indica @marh, sería tener una tabla global que contenga todos los resultados, y en el ALV inicial cargarás una tabla auxiliar que contenga los primeros 500 registros.

A partir de ahí, tienes que controlar en el evento del botón/botones los registros a mostrar cuando refresques el ALV. Un ejemplo sería.

  • Tenemos una tabla global con 1 millón de registros, pero en el ALV inicial cargamos los primeros 500 registros.
  • Cuando el usuario pulse el botón “next/previous page”, en el evento lanzado por el botón actualizas la tabla añades los siguientes/anteriores 500 registros, junto con un refresh del ALV.
  • Utiliza una variable global auxiliar para saber en qué página te encuentras. Con esta variable, sabrás registros cargar en el ALV. A partir de ahí, calculas la pagina en la que te encuentras y los resultados a mostrar:
  1. Funcionalidad al pulsar botón:
    Si es botón “next”-> variable_pagina = variable_pagina + 1.
    Si es botón “previous” -> variable_pagina = variable_pagina - 1.

  2. Cálculo para saber registros a mostrar:
    Posición_inicio: Variable_pagina * registros_a_mostrar (500) .
    Posición_fin: Posición_inicio + registros_a_mostrar (500).

La variable de pagina tendrá valor inicial 1, por ejemplo. Aquí tienes que tener en cuenta si la variable de página es <=0 (en ese caso mostrarás los primeros 500 registros de la tabla global).

No se si te puede ayudar o te puedes liar un poco más…cada uno escoge la solución que vea mejor. He pensado en esta, pero seguramente habrá soluciones más sencillas.

Un saludo!


#6

holaaa gracias por tu respuesta

estoy un poco nueva esto como cargo solo 500 registros si mi select la hago a toda una tabla ???

graciassssss :slight_smile:


#7

Buenas @silvi,

la idea sería tener una tabla interna global, que guardará todos los resultados (1 millón, por ejemplo, obtenidos de tu select). Esta tabla va a quedar intacta, es decir, no hay que modificarla.

A partir de ahí, tendrías que utilizar una tabla auxiliar global para cargar los 500 registros a partir de tu tabla global. En esta tabla auxiliar global si tendrás que actualizarla en función de la pagina en la que te encuentres y será la que utilizaras para mostrar los resultados en el ALV.

Un saludo!


#8

como meto los datos a esta tabla auxiliar global?

gracias :smiley:


#9

Una opción sería recorriendo la tabla global con DO N TIMES,…y en cada iteración añades el registro actual a la tabla auxiliar a través de un APPEND. Al final, tendrás la tabla auxiliar con N registros.

En el foro hay manuales de Programación ABAP y puedes encontrar ejemplos por internet, :).

Si no recuerdo mal, también existe una opción usando INSERT para insertar N lineas a otra tabla, informando de la posición inicio y fin de los registros a insertar, pero no la he utilizado.

Un saludo.


#10

Es lo que te comentaba en mi POST, la tabla que alojará el millón de registros le puedes agregar una columna que contenga el indice del registro. Supongamos que la columna que agregaste se llama “INDICE” y ya tienes ordenada tu tabla con este dato. Ahora, supongamos que ahora vas a mostrar el registro 501 al 1000, Entonces sería mas o menos así:

lv_registro_inicio = lv_registro_fin + 1.           "lv_registro_fin contendrá el ultimo registro 
lv_registro_fin = lv_registro_inicio + 500.
REFRESH TABLA_ALV.
LOOP AT TABLA_MILLON into wa_tabla_alv WHERE REGISTRO > lv_registro_inicio.
append wa_tabla_alv to TABLA_ALV.
if wa_tabla_alv-registro > lv_registro_fin.
EXIT.
endif.
endloop.

Espero te sirva.
Saludos.


#11

@silvis, pudiste solucionar este tema?


#12

Este tema se cerró automáticamente 91 días después del último post. No se permiten nuevas respuestas.