miércoles, 17 de diciembre de 2008

Refresco de DataGrid en Flex

Me he encontrado con un caso interesante que es digno de mención en este blog, y que seguro ayudará a más de uno. Aunque el caso se me ha presentado desarrollando en Flex, estoy seguro que, por su naturaleza, sea repetible en otros lenguajes, como .NET ó C# (por mencionar alguno)

Este caso no lo voy a comentar en detalle con código, si no con la teoría. Si queréis detalles de código, este problema lo planteé en el foro de Made In Flex, y cuyo enlace directo es el siguiente: http://groups.google.com/group/madeinflex/browse_thread/thread/927ccf8df69c887e?hl=es

Para empezar, comentaré el entorno tecnológico en el que se desarrolla esta historia. Por la parte backend tenemos una base de datos MySQL, un servidor web Apache y un PHP. PHP es utilizado para atender a peticiones mediante URL, acceder a base de datos, realizar operaciones con la información, y retornar un XML. Por la parte frontend tenemos un swf (Flash) creado desde Flex.

Continuamos con el propósito de la aplicación, describiendo su interfaz. Bien, es un módulo que permite gestionar datos de una tabla (en mi caso eran usuarios). Para ello, en la parte superior se incorpora un DataGrid (o tabla), que muestra la lista resumida de información de cada registro (en cada fila). En la parte inferior aparece un formulario que actúa de ficha. Cuando el usuario clica un registro en el DataGrid, éste se muestra en la ficha.

Al arrancar la aplicación, se invoca a un servicio HTTPService, el cual llama al servicio PHP correspondiente que obtiene la lista de los usuarios, genera el XML, lo devuelve, y Flex recoge este resultado y lo enlaza al DataGrid (en Flex se hace mediante la propiedad DataProvider).

Ahora vayamos a una operación sencilla de modificación de datos: la inserción. Cuando se crea un usuario nuevo, se clica en el botón "Nuevo", el cual deja la ficha de usuario vacía y desactiva el DataGrid (no se puede seleccionar filas o registros). El usuario introduce la información correspondiente al nuevo usuario. Cuando termina, hace clic en el botón "Crear". Las operaciones que se desencadenas son las siguientes:

1) Invoca al servicio HTTPService correspondiente al servicio PHP que crea un registro en la base de datos. El resultado se retorna en un XML con un tag con el resultado de OK o un mensaje de error
2) Flex recoge el resultado.
3) Si el resultado no es OK, muestra un mensaje de error (Alert.show (en otros lenguajes será MessageBox, MsgBox...).
3) Si el resultado es OK:
- Información de que ha tenido éxito (Alert.show)
- Activar el DataGrid y desactivar el formulario
- Invocar nuevamente al HTTPService para obtener la lista de usuarios
- Refrescar el DataGrid

Esta es la teoría, pero el refresco del DataGrid no funciona. Sigue estando los mismos datos que antes de crear el registro. Sin embargo, parece que el DataGrid se ha redibujado (hay un pequeño fliqueo o parpadeo).

Si salgo de la aplicación, y vuelvo a ejecutarla, el DataGrid se carga correctamente. No lo hace así cada vez que se modifica la tabla.

En realidad no hay ningún error. El problema se debe a que la llamada al HTTPService que retorna la lista de usuarios, se realiza siempre de la misma manera. Es decir, es una simple llamada, con un único parámetro que siempre tiene el mismo valor. Esto hace que el servidor web tire de la caché, con lo que retorna siempre el mismo XML.

¿Y cómo se soluciona ésto?. Pues creando un parámetro que no se utiliza, y que siempre toma un valor distinto. Puedes añadir al HTTPService para obtener la lista de usuarios, un parámetro que recoja la hora completa, o que genere un número aleatorio. De esta manera, el servidor web verá que es una llamada distinta a las ejecutadas recientemente, y ejecutará el script de php, en lugar de retornar lo que hay en la caché.

Safe Creative #1001195348693