DataGrid que no refresca

Visto 43 veces
Saltar al primer mensaje no leído

rafinguer

no leída,
16 dic 2008, 2:34:5116/12/08
a madeinflex
Estoy con una aplicación que tiene un DataGrid en la parte superior
para realizar vistas rápidas. En la parte inferior hay una ficha que
sirve para visualizar la fila seleccionada del DataGrid. Esta ficha
sirve para crear, modificar o eliminar un registro de una tabla.

Todo lo hago mediante HTTPService, a un servicio php que me devuelve
datos en XML. Todo funciona muy bien, incluso recogiendo los valores.

El problema está en cuanto creo un registro, que lo crea bien pero no
me refresca el DataGrid. Una vez que ha insertado el registro, lo hace
el php, físicamente en la bbdd lo hace bien, muestro un Alert diciendo
que ha tenido éxito. Este es el código que se ejecuta con la propiedad
result del HTTPService que invoca al servicio que crea el usuario:


private function handleCreateUserResult
(event:ResultEvent):void
{
var xmlResult:XML;
xmlResult=XML(event.result);
var tResult:String=xmlResult.result.text();

// If user was not created
if(tResult!="OK")
Alert.show("Se ha producido un error: " + tResult,
"Creación de usuario");
else
{
srvGetUsers.send(); // Llama al servicio que
obtiene la lista de usuarios y que está enlazado al datagrid
(DataProvider)
Alert.show("El usuario '"+txtNick.text+"' se creó
con éxito", "Creación de usuario");
deactivateForm(); // Función que desactiva el
formulario y activa el DataGrid (propiedad enabled)
dgUsers.validateDisplayList();
dgUsers.validateNow();
}
}

El XML es muy simplón:

<new_user>
<result>OK|NOK</result>
</new_user>

En los casos de si hay error devuelve el NOK, y funciona
correctamente. El OK también.

La consulta está exclusivamente referida al refresco del DataGrid,
pues todo funciona correctamente salvo eso.

Carlos Rovira

no leída,
16 dic 2008, 4:49:3216/12/08
a madei...@googlegroups.com
Hola Rafa,

El problema parece estar en que no realizas ningún refresco del datagrid.
Una vez creas el registro, en el resultado tienes que habilitar una llamada para refrescar manualmente el grid.

Si usas un dataservice de LCDS verás que esto es automático debido al comportamiento de este servicio, pero en un
RPC como es el caso, solo has indicado que "quieres crear un registro" y nada acerca de que quieras ver el resultado
por pantalla.

Tiene sentido lo que te comento?

Carlos Rovira

rafinguer

no leída,
16 dic 2008, 7:06:3916/12/08
a madeinflex
Hola,

Esta función (handleCreateUserResult ) es invocada por el
HTTPService.result que crea el registro. Es decir, se invoca al
HTTPService, que es un php que recoge los parámetros y crea el
registro. Como resultado, crea el xml que he indicado, e invoca a esta
función.

Para refrescar el DataGrid se invoca a otro HTTPService, el cual
recoge todos los registros de la tabla y los mete en un XML que está
enlazado al DataProvider del DataGrid. Este HTTPService es el mismo
que se invoca en el creationComplete del este componente (y funciona).

srvGetUsers.send();

Lo que sí veo es que parece que redibuja el DataGrid, pero el
resultado es el mismo que el de antes de insertar el registro (es
decir, no aparece el nuevo registro).

No sé si con estos detalles aclara el comportamiento del DataGrid.

Gracias.


Rafael Hernampérez

On 16 dic, 10:49, "Carlos Rovira" <carlos.rov...@gmail.com> wrote:
> Hola Rafa,
>
> El problema parece estar en que no realizas ningún refresco del datagrid.
> Una vez creas el registro, en el resultado tienes que habilitar una llamada
> para refrescar manualmente el grid.
>
> Si usas un dataservice de LCDS verás que esto es automático debido al
> comportamiento de este servicio, pero en un
> RPC como es el caso, solo has indicado que "quieres crear un registro" y
> nada acerca de que quieras ver el resultado
> por pantalla.
>
> Tiene sentido lo que te comento?
>
> Carlos Rovira
>

Carlos Rovira

no leída,
16 dic 2008, 7:15:0816/12/08
a madei...@googlegroups.com
Correcto,

Ahora veo que tienes la llamada a "srvGetUsers.send();" en el manejador en caso de que todo haya ido bien.
Por tanto seguidamente debería de refrescarse el DG con la lista que contenga el nuevo registro.
Estas comprobando que realmente el registro se ha persistido en la BD? Si no, no se me ocurre a priori que podría ser o que está fallando...

C.

rafinguer

no leída,
16 dic 2008, 9:24:0916/12/08
a madeinflex
Verifico en el browser de SQL la inserción. Es correcto.

He visto e algún artículo de este foro que podría ser que se quede en
la caché del navegador la misma consulta SQL, ya que se le llama de la
misma manera (misma URL y mismo parámetro). Si cierro el navegador y
vuelvo a ejecutar la aplicación, el DataGrid recoge todos los
registros actualizados. Probaré esa vía, la de enviar un parámetro
aleatorio para obligar al servicio php a generar nuevamente otro xml y
borre el de la caché.

En cuanto obtenga esos resultados comunicaré por este foro cómo ha
ido.



Rafael Hernampérez

On 16 dic, 13:15, "Carlos Rovira" <carlos.rov...@gmail.com> wrote:
> Correcto,
>
> Ahora veo que tienes la llamada a "srvGetUsers.send();" en el manejador en
> caso de que todo haya ido bien.
> Por tanto seguidamente debería de refrescarse el DG con la lista que
> contenga el nuevo registro.
> Estas comprobando que realmente el registro se ha persistido en la BD? Si
> no, no se me ocurre a priori que podría ser o que está fallando...
>
> C.
>

Alexis Tejeda

no leída,
16 dic 2008, 9:29:0816/12/08
a madei...@googlegroups.com
Viejo, no tienen nada que ver con cache ni nada, cuando te llegue el ok de la insercion, teni que de nuevo hacer el httpService para el poblado del datagrid, solo eso, te ahogas en un vaso de agua.

2008/12/16 rafinguer <rafi...@gmail.com>

rafinguer

no leída,
16 dic 2008, 9:50:5916/12/08
a madeinflex
Precisamente eso realiza la línea con srvGetUsers.send(); Llama al
HTTPService que carga el DataGrid. Ambos están "Binded" mediante la
propiedad DataProvider del DataGrid. Esta misma llamada se hace en el
creationComplete del componente, y lo realiza correctamente.



Rafael Hernampérez


On 16 dic, 15:29, "Alexis Tejeda" <alexis.tej...@gmail.com> wrote:
> Viejo, no tienen nada que ver con cache ni nada, cuando te llegue el ok de
> la insercion, teni que de nuevo hacer el httpService para el poblado del
> datagrid, solo eso, te ahogas en un vaso de agua.
>
> 2008/12/16 rafinguer <rafing...@gmail.com>

rafinguer

no leída,
16 dic 2008, 11:57:5616/12/08
a madeinflex
Hola a todos

YA HE RESUELTO el problema, y todo era debido a la caché del servidor
de aplicaciones, y que siempre retornaba el mismo XML porque se hacía
la misma llamada. Intentaré explicar paso a paso qué he hecho para
ilustrarlo detenidamente.

Una vez insertado el registro con éxito, invocaremos a un generador de
números aleatorios, para ellos se ha creado una variable y una función
para tal efecto:

[Bindable]
private var iRandom:int;

private function generateRandom():void
{
iRandom=Math.random()*32000;
}

Para que las llamadas siempres sean distintas, y, por tanto, la caché
no devuelva el mismo XML, se añade un parámetro extra a la llamada al
php de forma aleatoria, o, lo que es lo mismo, que invoque a nuestra
variable con el valor aleatorio:

<mx:HTTPService fault="handleUsersFault(event);"
id="srvGetUsers" resultFormat="e4x"
url="http://localhost/miruta/srv_get_users.php"
useProxy="false">
<mx:request xmlns="">
<id_client>{pIdClient}</id_client>
<nRandom>{iRandom}</nRandom>
</mx:request>
</mx:HTTPService>

Para que todo esto funcione, hay que generar un número aleatorio antes
de invocar al servicio HTTPService. De esta manera, retomamos la
función anterior y antecedemos la primera línea que genera el número
aleatorio:

private function handleCreateUserResult
(event:ResultEvent):void
{
var xmlResult:XML;
xmlResult=XML(event.result);
var tResult:String=xmlResult.result.text();

// If user was not created
if(tResult!="OK")
Alert.show("Se ha producido un error: " + tResult,
"Creación de usuario");
else
{
generateRandom(); // AQUI ESTA LA CLAVE PARA QUE
FUNCIONE
deactivateForm(); // Función que desactiva el
formulario y activa el DataGrid (propiedad enabled)
Alert.show("El usuario '"+txtNick.text+"' se creó
con éxito", "Creación de usuario");
srvGetUsers.send(); // Llama al servicio que
obtiene la lista de usuarios y que está enlazado al datagrid

dgUsers.dataProvider="{srvGetUsers.lastResult.user}",
dgUsers.validateDisplayList();
dgUsers.validateNow();
}
}

Espero que este ejemplo sea ilustrativo y pueda servir a otros Flexers
que tengan este problema. Me gustaría dar las gracias a Fabián Brussa,
que contribuyó en otro debate similar con esta pista (http://
groups.google.com/group/madeinflex/browse_thread/thread/
be43e604f6a94ae0/607a2e6c592f5d0a?lnk=gst&q=refrescar
+DataGrid#607a2e6c592f5d0a)



Rafael Hernampérez



Rafael Hernampérez

Alexis Tejeda

no leída,
16 dic 2008, 12:04:1316/12/08
a madei...@googlegroups.com
Sabi que no es el cache, siempre trabajo con xml desde php con flex y nunca
he tenido problema alguno, quizas pudo haber sido el cache de tu flash que
queda en el browser y no te muestra la aplicación con los cambios hechos, ya
que en llamadas dinamicas a scripts php y sobre todo si trabajas con bases
de datos no te generar "cache".
Bueno, saludos y bacan que hayas solucionado el problema.

-----Mensaje original-----
De: madei...@googlegroups.com [mailto:madei...@googlegroups.com] En
nombre de rafinguer
Enviado el: martes, 16 de diciembre de 2008 13:58
Para: madeinflex
Asunto: [madeinflex] Re: DataGrid que no refresca
Responder a todos
Responder al autor
Reenviar
0 mensajes nuevos