MUNDOSAP

MUNDOSAP (foro/index.php)
-   Programación ABAP IV (foro/forumdisplay.php?f=4)
-   -   Problema creacion de ALV OO y refresco (foro/showthread.php?t=37370)

Siem 21/06/10 21:25:31

Problema creacion de ALV OO y refresco
 
Hola compañeros:

Les expongo un caso que me esta ocurriendo y no se muy bien el motivo.

Tengo una primera dynpro 0050 con un ALV el cual tiene varios botones. Algunos de esos botones me abren una dynpro 0200 que sirve para Crear/Modificar/Copiar registros y segun los datos que rellenemos, esta llama a otra dynpro 0300 que continene un ALV orientado a objetos.

En el PBO del dynpro 0300, si no existe, creo el container, el catalogo y el ALVgrid, para finalemente llamar al método ->set_table_for_first_display.

Hasta aqui funciona correcto.

El problema viene cuando desde el dynpro 0050, pulso a un boton dde consulta que llama al dynpro 0300 sin pasar por el 0200. El PBO es el mismo, pero como ya existe el ALV OO, en lugar de crearlo, llamo al metodo ->refresh_table_display. Y me muestra la dynpro 0300 sin ALV. :confused:

He probado a destruir el ALV y crearlo de nuevo y entonces si funciona, pero me hace cosas raras con los datos. Sin embargo, el caso anterior, las tablas internas se mantienen con los datos correctos.

Mi duda es la siguiente:

Puede ser que al crear 0050 --> 0200 --> 0300 --> ALV OO y luego intentar acceder 0050 --> 0300 --> ALV OO haya algun problema por haberme saltado la dynpro 0200?

Disculpad si me he extendido demasiado, pero es que para mi este problema es muy raro.

Muchas gracias por anticipado.

ballan 22/06/10 13:43:54

Buenos dias

Creo que tu problema esta en como has definido el custom container y el objeto grid

Supongo que en tu programa habras creado el custom container y el control grid con una llamada de este estilo

CREATE OBJECT custom_container
EXPORTING
container_name = 'NOMBRE_CUSTOM_CONTAINER'
lifetime = cntl_lifetime_dynpro
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.

La clave es que cuando crees tanto el custom container como el control grid tienes que crearlo pasandole el valor cntl_lifetime_dynpro al parametro lifetime

Haciendolo asi si llamas al metodo free y luego haces un cl_gui_cfw=>flush( ).

Cuando se salga de esa pantalla los objetos "moriran"

El problema es que el parametro lifetime dynpro no se suele rellenar y por defecto es para toda la transaccion, por eso aunque llames al metodo free y hagas un flush los objetos "no mueren"

Disculpas por la explicacion un poco bananera pero espero que se me haya entendido

Siem 23/06/10 15:20:03

Muchas gracias Ballan.

Bananera o no, por ahora es la unica respuesta que tengo ;)

El caso es que lo que tu propones es destruir el ALV y volverlo a crear, pero esa prueba ya la hice y funcionaba, aunque no se por que, los datos no eran los esperados. El caso es que yo quiero dejar el ALV activo y usarlo cuantas veces me haga falta con el metodo refresh_table_display, modificando solo la tabla interna de la que se nutre.

Aun así, te digo que tu respuesta me ha aportado mas de lo que crees. Muchas gracias.

Pero sigo sin saber por que no me muestra el ALV. Se supone que cuando yo lo creo, lo creo como global para el programa, pero debe depender de algo por ahi que si no existe, no me lo muestra.

A ver si alguien da un poco de luz :) Thx.

ballan 24/06/10 09:23:16

Yo hace tiempo tuve una experiencia parecida, ya no recuerdo como era el caso exactamente pero yo cambiaba las lineas de mi tabla, hacia un refresh table display y o no me mostraba nada o bien me mostraba datos anteriores

Lo primero de todo es asegurarte que lo que ves es lo que hay y me explico, añade el boton de refrescar en tu alv (si en tu fcat le marcas el edit a algun campo el standard te añade automaticamente entre otros el boton de refrescar) y cuando veas que los datos que te aparecen en pantalla no te cuadran con lo que deberia salir pulsa el boton de refrescar porque a veces ocurre que lo que vemos en pantalla es como una version antigua de los datos

Al fin y al cabo lo que estas teniendo son problemas de sincronizacion entre R3 y el GUI, hace tiempo escribi un post donde hablaba un poco de estos temas, aqui te lo dejo para que lo eches un vistazo por si te puede ser de ayuda



Otro detalle importante es que despues de hacer un refresh_table_display haz tambien una llamada al cl_gui_cfw=>flush( ). para "asegurarte" que se sincronizan los datos

Siem 25/06/10 18:15:03

Lo que pasa es que a mi no me muestra el ALV. SOlo sale el dynpro vacio.
Es el mismo efecto que si no existiera el objeto contenedor del alv.

A modo de resumen:

Cuando lo creo:
0050 --> 0200 --> 0300 --> ALV OO
Al hacer el refresh_table_display
0050 --> 0200 --> 0300 --> ALV OO -----> OK
0050 --> 0300 --> ALV OO --------------> No se ve el ALV

Supuestamente el ALV esta asociado al dynpro 0300, pero se ve que debe haber alguna referencia que quede por ahi al crearlo pasando por la dynpro 0200.

Gracias de nuevo.

lehua768 26/06/10 02:43:25

ya no recuerdo como era el caso exactamente pero yo cambiaba las lineas de mi tabla, hacia un refresh table display y o no me mostraba nada o bien me mostraba datos anterioresLo primero de todo es asegurarte que lo que ves es lo que hay y me explico, añade el boton de refrescar en tu alv (si en tu fcat le marcas el edit a algun campo el standard te añade automaticamente entre otros el boton de refrescar) y cuando veas que los datos que te aparecen en pantalla no te cuadran con lo que deberia salir pulsa el boton de refrescar porque a veces ocurre que lo que vemos en pantalla es como una version antigua de los datosAl fin y al cabo lo que estas teniendo son problemas de sincronizacion entre R3 y el GUI, hace tiempo escribi un post donde hablaba un poco de estos temas, aqui te lo dejo para que lo eches un vistazo por si te puede ser de ayudaEl caso es que lo que tu propones es destruir el ALV y volverlo a crear, pero esa prueba ya la hice y funcionaba, aunque no se por que, los datos no eran los esperados. El caso es que yo quiero dejar el ALV activo y usarlo cuantas veces me haga falta con el metodo refresh_table_display, modificando solo la tabla interna de la que se nutre.

Siem 28/06/10 05:59:36


A ver, centrémonos. El problema no es que el alv me muestre datos incorrectos, o que el metodo de refresco no lo haga correctamente. El problema es que no aparece el ALV, ni botones ni nada. Solo una pantalla vacia, cuando se supone que el contenedor y el ALV estan creados, porque yo en ningun momento los destruyo, y ademas, haciendo el debug, los objetos existen:

IF G_grid_ACT IS INITIAL. " Este es el objeto ALV
PERFORM CREA_ALV_ACT.
ELSE. " En el debugg, se mete por aqui, luego existe el objeto.
CALL METHOD G_GRID_ACT->REFRESH_TABLE_DISPLAY.
ENDIF.

Con lo cual, si existe, no se por que no lo muestra. LAs tablas internas tiene los datos correctos, pero al no mostrar el ALV, no muestra los datos.

Gracias a ti tambien lehua768 :)

ballan 28/06/10 08:31:11

Ok, habia entendido mal el problema, no obstante todo lo que hemos hablado creo que tambien aplica a tu caso, por ejemplo el fragmento de codigo que me has puesto

IF G_grid_ACT IS INITIAL. " Este es el objeto ALV
PERFORM CREA_ALV_ACT.
ELSE. " En el debugg, se mete por aqui, luego existe el objeto.
CALL METHOD G_GRID_ACT->REFRESH_TABLE_DISPLAY.
ENDIF.

No es del todo correcto

en lugar de preguntar

IF G_grid_ACT IS INITIAL

deberias preguntar (no tengo sap delante por lo que quiza lo que pongo debajo no es del todo correcto sintacticamente pero es para que te hagas una idea)

if g_grid_act->is_alive( ) = g_grid_act->state_alive

En resumen, lo primero que haria es ver cual es el estado REAL del grid, porque puede ser que NO SEA INICIAL, pero por ejemplo si anteriormente han llamado al metodo FREE, aunque el valor del grid no sea inicial ya no seria "utilizable" por lo tanto no te lo mostraria, para poder ver el status puedes introducir el siguiente codigo

data: lv_state type i.

lv_state = g_grid_act->is_alive( ).

Siem 02/07/10 07:10:32


He probado lo que me has dicho, y esta linea, aunque compila correctamente, me devuelve un dump. ???

No entiendo por que porque mira que es simple la instruccion :)


El metodo is_alive( ) nofunciona en mi sistema. Que raro.

ballan 02/07/10 11:11:04

Si te esta dando dump puede ser porque la clase no este instanciada o bien porque no devuelva un valor de tipo i, no tengo sap delante asi que no te lo puedo mirar pero si te fijas en la clase CL_GUI_ALV_GRID en los parametros del metodo IS_ALIVE fijate en cual es el tipo que te devuelve, yo creia que era tipo I pero puede ser que sea alguno diferente

El codigo quedaria algo asi

data: lv_state type (tipo que hayas visto en la clase CL_GUI_ALV_GRID).

if not g_grid_act is initial.
lv_state = g_grid_act->is_alive( ).
endif.


Husos Horarios son GMT. La hora en este momento es 03:38:03.

www.mundosap.com 2006 - Spain
software crm, crm on demand, software call center, crm act, crm solutions, crm gratis, crm web