MUNDOSAP

Regresar   MUNDOSAP > DESARROLLO > Programación ABAP IV
Nombre de Usuario
Contraseña
Home Descargas Registrar FAQ Miembros Calendario Buscar Temas de Hoy Marcar Foros Como Leídos




 
Respuesta
 
Herramientas Buscar en Tema Desplegado
  #11  
Viejo 02/07/10, 11:49:29
Siem Siem is offline
Member
 
Fecha de Ingreso: jul 2009
Mensajes: 33
Lo habia mirado ya y es correcto el tipo que habias puesto. Es de tipo i.

El simple hecho de llamar al metodo is_alive, me da un dump, y no deberia
Responder Con Cita
  #12  
Viejo 02/07/10, 12:16:50
ballan ballan is offline
Senior Member
 
Fecha de Ingreso: oct 2006
Mensajes: 671
Pero g_grid_act es inicial o no?

Pegame el dump para que veamos que es lo que pasa
Responder Con Cita
  #13  
Viejo 02/07/10, 12:44:00
Siem Siem is offline
Member
 
Fecha de Ingreso: jul 2009
Mensajes: 33

He hecho la prueba al reves y tampoco va.

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


La primera vez que intento acceder a la dynpor 0300, evidentemente es initial, por lo que crea el ALV y lo muestra correctamente. Si vuelvo a acceder por el mismo camino,el refresh_table_display lo muestra correctamente. Pero si ahora accedo por el otro camino (Sin pasar por la dynpro 0200) el refresh_table_display no muestra el alv. En este caso el
g_grid_act no es initial.


Pego ahora el dump que da el metodo is_alive( )

Texto breve
Access via 'NULL' object reference not possible.

¿Qué ha sucedido?
Error in the ABAP Application Program

The current ABAP program "ZRFCTA_DEPOS" had to be terminated because it has come across a statement that unfortunately cannot be executed.

Anál.errores
An exception occurred that is explained in detail below.
The exception, which is assigned to class 'CX_SY_REF_IS_INITIAL', was not caught in procedure "STATUS_0300" "(FORM)", nor was it propagated by a RAISING clause.
Since the caller of the procedure could not have anticipated that the exception would occur, the current program is terminated.
The reason for the exception is:
You attempted to use a 'NULL' object reference (points to 'nothing')
access a component (variable: "G_GRID_ACT").
An object reference must point to an object (an instance of a class)
before it can be used to access components.
Either the reference was never set or it was set to 'NULL' using the
CLEAR statement.

Eso es lo que me dice, simplemente por poner la linea:

DATA lv_state type i.

>>>>> lv_state = g_grid_act->is_alive( ).


De nuevo muchas gracias por tu tiempo, Ballan
Responder Con Cita
  #14  
Viejo 02/07/10, 13:49:37
ballan ballan is offline
Senior Member
 
Fecha de Ingreso: oct 2006
Mensajes: 671
El dump te esta dando porque g_grid_act es inicial, esta intentando llamar a un metodo de un objeto que no esta instanciado

Bien yo creo que aqui se abren dos caminos y tendria que ver el codigo para saber lo que esta pasando exactamente pero te digo las opciones que hay tal y como yo lo veo

Opcion 1.- Corregir el algoritmo para la creacion o refresco del ALV

Deberia quedar algo mas o menos asi


Opcion 2 Tendria que ver el codigo, pero es posible que en algun momento se este llamando al metodo free de g_grid_act o bien que lo hayas creado con lifetime_dynpro y al hacer alguna operacion el objeto se "libera" automaticamente, con esto lo que quiero decir es que por ejemplo puede ser que tu veas que g_Grid_act NO ES INICIAL, es decir que contiene "algo" pero realmente eso es falso porque luego si llamas al metodo IS_ALIVE te devuelve state_dead

Si te devuelve state_dead tendras que crearlo aunque no sea inicial porque la unica la razon por la que no es inicial es porque todavia no ha pasado el "garbage collector" (aunque este concepto es mas de otros lenguajes)

Para explicar esto pongo un ejemplo, si yo escribiera el siguiente codigo


Asi que tambien deberias buscar si en algun sitio se esta haciendo un free ya sea del objeto grid o del container sobre el que esta definido y es eso lo que te esta trastocando
Responder Con Cita
  #15  
Viejo 05/07/10, 05:41:47
Siem Siem is offline
Member
 
Fecha de Ingreso: jul 2009
Mensajes: 33
Yo me inclino mas por la segunda opcion, pero: ¿Que pasa si el parámetro lifetime no esta indicado? ¿Toma algun valor por defecto?.Si se queda con state_dead al cerrar la dynpro donde se creo el ALV, pues entonces estará ahi el problema, aunque si vuelvo a llamar a la dynpro porel mismo camino,el ALV sigue ahí. Si la llamo por otro camino, el ALV no aparece.

La aplicacion la he hecho yo al completo, asi que se que no hay ningun free en el codigo.

De todos modos, hay una cosa que no entiendo. Y es que como puede dar un dump, el metodo IS_ALIVE si precisamente sirve para ver si existe o no.

Úlima edición por Siem fecha: 05/07/10 a las 08:56:03.
Responder Con Cita
  #16  
Viejo 08/07/10, 10:09:18
ballan ballan is offline
Senior Member
 
Fecha de Ingreso: oct 2006
Mensajes: 671
Si el parametro lifetime no esta indicado por defecto toma lifetime_transaction
que significa que el control existira mientras exista el modo que lo creo

El metodo IS_ALIVE es un metodo de instancia, lo que significa que tienes que tener la clase instanciada (has tenido que hacer previamente un create object)
si te da dump es porque la clase no esta instanciada o porque el lifetime ha expirado y el objeto ha "muerto" (aunque tu debugenado veas que la variable NO ES INICIAL)

De hecho hablar de INITIAL para variables declaradas con type ref no es del todo correcto por esta razon, para objetos type ref en lugar de utilizar IS INITIAL seria mas correcto utilizar IS BOUND
Responder Con Cita
  #17  
Viejo 09/07/10, 12:37:35
Jonathan Barrio Jonathan Barrio is offline
Junior Member
 
Fecha de Ingreso: nov 2008
Mensajes: 25
¿ con BOUND tal vez?

Ya no me acuerdo de esto de los objetos y los ALV.

Pero? para llamar a los metodos no tenían que estár capturados mediante una sentencia? Cómo el del doble click...

¿ Si en vez de preguntar si es initial o llamar a ese metodo haces un
IF objeto IS BOUND.
ENDIF.
podría valer ?
Responder Con Cita
  #18  
Viejo 09/07/10, 14:28:11
Avatar de DavidXD_XD
DavidXD_XD DavidXD_XD is offline
Moderator
 
Fecha de Ingreso: ago 2006
Localización: Lima - Perú
Mensajes: 1,251
Hola, a mi me ha tocado hace poco realizar ese tipo de tratamiento de objetos con 2 ALV, uno que siempre existira y el cual llama a otro para mostrar diferentes reportes a partir de un solo contenedor, lo que pasaba era que en la primera ejecucion de la segunda pantalla siempre funcionaba y me mostraba x ejemplo 5 registros, luego regresaba a la pantalla anterior y cuando modificaba datos en otras transaccion para que se reflejara cambios en la segunda pantalla resulta q siempre me salian esos 5 registros y nunca refrescaba, pero justo trabaje con una funcion llamada MD_PEGGING y en la ultima parte llama a un screen 1000, esa funcion me muestra un ALV y en el cual a la hora de darle BACK, EXIT o CANCEL te mata todos los objetos

1. Ir a la parte final de la funcion y entrar al dynpro 1000
2. Ir al module check_fcode
3. No tomar en cuenta el cl_gui_cfw=>dispatch xq matara tu primer ALV
4. Ir al PERFORM check_fcode
5. Ir al PERFORM exit_from_alv el cual como veras se encuentra habilitado para los botones BACK, ENDE, STOP, OTHR
6. Mirar la rutina y de que manera mata los objetos para que cuando los vuelvas a llamar nuevamente los instancies (CREATE OBJECT) como si fuera la primera vez
7. Fijate que mata sobretodo el grid y el contenedor con un metodo publico de instancia FREE, y luego al final matas la instancia de la clase local si es que has creado el ALV desde una ...

Espero q esta info t sirva xq yo lo aplique y si me funciono ...

PD: Lei el primer post y los 3 ultimos xq son un monton , y tal vez estoy dando una mala interpretacion del problema
__________________
David Carballido Córdova
Responder Con Cita
  #19  
Viejo 14/07/10, 19:56:15
Siem Siem is offline
Member
 
Fecha de Ingreso: jul 2009
Mensajes: 33

Disculpa que haya tardado en responder, pero es que he estado un poco enfermo. (Los aires acondicionados, que son muy traicioneros).

El IS BOUND tambien lo habia probado, pero el resultado es el mismo.

Si el lifetime es por defecto lifetime_transaction (yo no pongo nada en ese parametro, asi que debe serlo) y eso quiere decir que debe durar mientras dure el modo, entonces puede ser ese el problema.

¿Cuando haces un CALL SCREEN 0300 STARTING AT 20 5, se supone que la ventana modal que abre es otro modo? Si es eso, entonces esta claro que si el ALV, al haber cerrado la ventana donde se creo, no me permite hacer el metodo refresh_table_display.


DavidXD_XD, el problema que comentas me suena que me ha pasado cuando uso el plan B, que es destruir el ALV y volverlo a crear. En ese caso el ALV me mostraba algo distinto a mi tabla interna, pero creo recordar que la primera vez si lo mostraba correctamente. Se parece mucho al problema que comentas.

Gracias a los dos. Parece que ya va estando mas cerca la explicacion de este problema.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Reglas de Mensajes
no puedes crear nuevos temas
no puedes responder temas
no puedes adjuntar archivos
no puedes editar tus mensajes

El código vB está On
Las caritas están On
Código [IMG] está On
Código HTML está Off
Saltar a Foro


Husos Horarios son GMT. La hora en este momento es 20:40:45.


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