Introducción
Las acciones dinámicas son una de las características más importantes de APEX, puesto que nos permiten extender fácilmente la funcionalidad de nuestras aplicaciones, permitiéndonos realizar tareas de manera sencilla y sin mucha complicación.
Sin embargo, puede que les haya sucedido que “de repente” una acción dinámica en sus aplicaciones deje de funcionar sin ningún motivo aparente y que luego de que se recarga la página donde están usando dicha acción dinámica, esta vuelva a funcionar.
Aquí te voy a explicar ¿por qué? sucede esto y ¿cómo podemos solucionarlo?
El problema
Tienes una página en tu aplicación en la que has definido un reporte que puede ser clásico, interactivo o una cuadrícula interactiva, en fín cualquier reporte.
En dicho reporte has agregado una columna de tipo enlace, cuya acción es definida por una acción dinámica, la cual se dispara al hacer clic en un selector jQuery, el cual hemos definido en dicha columna. Para el tema que nos ocupa, no es importante la acción que vamos a realizar al hacer clic en dicho enlace. Podría ser definir un valor, ejecutar un procedimiento o simplemente levantar una alerta.
Cuando ejecutamos nuestra página y obtenemos nuestro reporte, inicialmente la acción dinámica que hemos definido en nuestro enlace se ejecuta sin ningún problema. Todo funciona bien.
Supongamos que nuestro reporte es un reporte clásico que muestra 10 líneas por página y nuestro reporte contiene 70 líneas. Cuando avanzamos a la siguiente página al hacer clic en la navegación del reporte, al obtener el siguiente grupo de líneas, cuando hacemos clic en uno de los enlaces de estas líneas, nuestra acción dinámica ya no funciona.
Supongamos por otra parte que nuestro reporte es interactivo o una cuadrícula interactiva y al igual que en el caso anterior, al cargar la página, cuando hacemos clic en el enlace de una línea determinada todo funciona bien. Ahora supongamos que utilizamos la casilla de búsqueda del reporte para filtrar el resultado mostrado por el reporte y luego de esto, nuevamente nuestra acción dinámica ha dejado de funcionar.
¿Qué es lo que está causando este comportamiento? ¿Es acaso de APEX tiene un problema de funcionamiento no reportado que está causando este comportamiento?
La explicación
Cuando creamos una acción dinámica, existen propiedades de la misma que tienen definidos valores por defecto, los cuales determinan el comportamiento de la misma.
Dentro de estas propiedades, tenemos las propiedades de Ejecución. Estas propiedades definen la manera en que se comportará nuestra acción dinámica a la hora de ejecutarse. Estas propiedades de ejecución inicialmente son:
- Secuencia
- Ámbito de ejecución
- Tipo
En estas propiedades está la clave para resolver el misterio que nos ocupa ¿por qué razón mi acción dinámica repentinamente deja de funcionar?
Más específicamente, una de estas propiedades: Ámbito de ejecución.
Por defecto, esta propiedad se define con un valor de Estático.
Veamos que significa esto y cuales otros valores podemos definirle y cómo se modifica el comportamiento de nuestra acción dinámica al cambiar este valor.
Antes de continuar con los posibles valores y lo que estos significan, es importante recordar que toda acción dinámica está ligada con algún elemento específico de nuestra página de aplicación, pudiendo ser la página en sí, una región, un botón o un elemento entre otras alternativas.
Pero sigamos adelante. La propiedad Ámbito de ejecución, puede tener 3 posibles valores:
- Estático
- Dinámico
- Una vez
El valor Estático le indica al motor de APEX, que el manejador de eventos va a enlazar el elemento disparador de la acción dinámica durante la vida útil de la página actual, pero que si se da una actualización del elemento disparador por medio de una acción de refrescamiento parcial de página, este enlace desaparece.
Por otra parte, el valor Dinámico, le indica al motor de APEX exactamente lo mismo que se mencionó para el valor Estático, con la salvedad de que si se realiza un refrescamiento parcial de página, el enlace con el elemento disparador se definirá nuevamente.
Finalmente, si el valor seleccionado es Una vez. El enlace con el elemento disparador se realizará una única vez y no se volverá a disparar la acción dinánica hasta tanto no se haya refrescado totalmente la página.
En estos valores está la clave para solucionar el misterio de las acciones dinámicas que dejan de funcionar. Si todavía no lo han adivinado, se los explico a continuación.
La solución
Cuando utilizamos regiones de tipo reporte, dichas regiones se pueden refrescar parcialmente, sin necesidad de ejecutar nuestra página para que se recargue, esto es lo que sucede cuando por ejemplo, hacemos clic en el elemento de páginación de un reporte, para avanzar al siguiente grupo de registros o para retroceder al anterior. También, es lo que sucede cuando utilizamos la casilla de búsqueda para filtrar nuestro reporte o cuadrícula interactiva. Se produce un refrescamiento parcial.
Como vimos en la sección anterior, si el valor de la propiedad Ámbito de ejecución está definido como Estático, si se produce un refrescamiento, el enlace entre el elemento disparador y la acción dinámica se pierde hasta que volvamos a cargar nuestra página de manera total.
Para evitar que el enlace se pierda y nuestra acción dinámica deje de funcionar, lo que debemos hacer es definir este valor como Dinámico. De esta manera nos aseguramos que si se da un refrescamiento parcial del elemento al que está ligada la acción dinámica, en nuestro caso un enlace en una columna de nuestro reporte, el enlace se vuelva a generar y la acción dinámica se mantenga funcionando.
Adicionalmente, cuando seleccionamos el valor Dinámico para el Ámbito de ejecución, aparecerá una propiedad más en en grupo de propiedades de ejecución de la acción dinámica: Contenedor Estático (Selector de jQuery).
Este es un valor que se define como un selector de jQuery y que ayuda a mejorar el desempeño de ejecución y el enlace de la acción dinámica con su elemento disparador, en nuestro caso del reporte, lo definimos como una clase más del elemento disparador (la columna del reporte) y para nuestros efectos es básicamente un identificador estático de dicho elemento. Este valor también lo vamos a utilizar dentro del grupo de propiedades “Cuando” de nuestra acción dinámica, para indicar el elemento iniciador o disparador de la acción dinámica.
Esta solución no es específica para el ejemplo que nos ocupa, es válida para cualquier acción dinámica que se dispare dentro de cualquier elemento que permita refrescamiento parcial de página, como por ejemplo una región de calendario o de gráfico entre otras.
Información Adicional
Si les interesa saber más sobre este tema acciones dinámicas, pueden utilizar el siguiente enlace: