PDA

Ver la Versión Completa : ejecutar un alv en proceso de fondo


minerva0112
20/04/10, 20:38:16
Se tiene un reporte Z que cuando lo crearon era funcional, pero ultimamente tiene problemas con tiempo de respuesta dando un time out,

Antes de que me asignaran este requerimiento se le informo al usuario que solo podia correr este reporte en proceso de fondo,
pero esto para el usuario no es funcional ya que no trae toda la informacion

se me ha recomendado llevar este reporte de manera que el usuario pueda consignar toda la informacion en proceso de fondo.

favor si me pueden asesorar de como realizar esto?

gracias :confused: :confused: :confused:

jcflores
20/04/10, 20:48:37
Y se me ocurre generar un archivo excel en algun directorio luego de ejecutado en proceso de fondo el programa.

minerva0112
20/04/10, 21:20:23
Y se me ocurre generar un archivo excel en algun directorio luego de ejecutado en proceso de fondo el programa.


ok, me parece chevere, ya que el usuario realiza algunos subtotales.

pero si este reporte tiene varias opciones, me explico

al ejecutarse aparece un alv con una informacion, este alv tiene unos botones que te realizan otras busquedas, por ejemplo:

boton para reporte de gastos
boton de ingresos
boton de errores y advertencias.

en un proceso de fondo como se llevaria para que me realice todos estos procesos.

gracias

juanphys
21/04/10, 07:23:21
Hola,

Si no es posible mejorar la performance del código, otra opción es añadir la función sapgui_progress_indicator dentro del algunos loop que haya en el código (en los que más tiempo de procesamiento gasten).

Esta función muestra en la barra de mensajes el habitual reloj que aveces se ve en algunas transacciones estandar. Este reloj interactúa de tal manera que no daría time out, aunque claro, no mejora el tiempo de procesamiento, para eso mejor analizar posibles mejoras de performance.

Saludos

ppchico
21/04/10, 07:38:38
Saludos Minerva,

En principio, puedes generar el ALV normal en fondo usando para ello los ALV orientados a objetos (Clase CL_GUI_ALV_GRID) El único matiz, es que debes usar como contenedor la clase CL_GUI_DOCKING_CONTAINER ya que de otra manera no te funcionará. Así, de esta forma a través de la SP01 (Transacción de SPOOL), pueden ver el ALV generado por el report (PERO NO PODRÁN INTERACTUAR CON EL).

En el caso de los botones si lanzas el proceso en fondo, no es posible que el usuario interactue con el ALV, por lo que lo más cómodo sería darle la opción desde la pantalla de selección de realizar las distintas operaciones. Imagina que lo que estás mostrando son pedidos, y que tienes las opciones de borrarlos, contabilizarlos, darles salida etc... pues en este caso, puedes poner un RADIO BUTTON con las opciones de solo mostrar información, de contabilizar los pedidos, de borrarlos, de darles salida... de esta forma, una vez que obtengas la información, si el usuario eligió la contabilización directa, no se muestra la información, sino que se contabilizan todos los pedidos obtenidos, y directamente se muestra el LOG final.

En principio eso sería lo más cómodo. Por otro lado, te aconsejo que hagas un estudio de la selección de datos, de manera que optimices todo el código para intentar que muestre la información lo antes posible, incluso puedes meter la selección de datos en un módulo de funciones que devuelva la información. Intenta eliminar SELECT dentro de SELECT, SELECT dentro de LOOP, usa mejor el FOR ALL ENTRIES y después un READ TABLE... incluso en ocasiones los INNER JOINS pueden ser perjudiciales. Puedes probar las optimizaciones de código a través de la transacción SE30 pulsando sobre el botón TRIPS & TRICKS puedes comparar dos códigos, y así ver cual tiene mejor tiempo de ejecución etc.

Suerte con tu desarrollo.
Un Saludo,
Javier.

minerva0112
23/04/10, 12:44:16
Gracias a todos por su apoyo, se decidio mejorar el performance del codigo aplicando una reingeniería ya que el reporte actual nunca dio los resultados esperados....



mil gracias