Foros del Web » Programando para Internet » Javascript » Frameworks JS »

ExtJs + error en commit + [Error: r is undefined]

Estas en el tema de ExtJs + error en commit + [Error: r is undefined] en el foro de Frameworks JS en Foros del Web. Estoy con la librería Ext, tratando de rastrear un bug. Se trata de una llamada Ajax, que estoy siguiendo paso a paso con el debugger ...
  #1 (permalink)  
Antiguo 12/05/2011, 15:06
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 7 meses
Puntos: 101
ExtJs + error en commit + [Error: r is undefined] SOLUCIONADO

Estoy con la librería Ext, tratando de rastrear un bug. Se trata de una llamada Ajax, que estoy siguiendo paso a paso con el debugger de Firefox.

La respuesta a la llama es success: true. Se evalua un try catch, pero el try falla en la linea de .commit

Lo raro es que esto pasa con cierta consulta pero no en la primera vez que se consulta, sino a partir de la segunda. Aunque no me queda claro esto porque no siempre lo hace a la segunda. Que puede ser?

Última edición por mayid; 13/05/2011 a las 17:47
  #2 (permalink)  
Antiguo 13/05/2011, 06:10
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años, 6 meses
Puntos: 343
Respuesta: Ext.Ajax.request no interpreta success

Sino hay codigo dificil saber.
__________________
blog | @aijoona
  #3 (permalink)  
Antiguo 13/05/2011, 09:11
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 7 meses
Puntos: 101
Respuesta: ExtJs : error en commit

Si, es cierto. Intentaré volcar algo de codigo.

El objeto rec es el que hace el commit que falla. Se que falla ahí porque estoy debuggeando con Firebug linea por linea.

Se trata de una consulta de una ficha por numero de documento. El resultado solo es uno, por eso se toma el [0] del grid...

Código Javascript:
Ver original
  1. var grdConsulta = Ext.getCmp('mdcGrdConsulta');
  2.       var recs = grdConsulta.getSelections();
  3.  
  4.   if (recs.length > 0)
  5.       rec = recs[0];
  6.  
  7. ....
  8.  
  9. datos.idCliente = rec.id;

Ese "rec" se va llenando en diferentes lineas. Juesto en el try catch se setean algunos datos y se intenta el commit. Y ahí salta el error del catch.

Código Javascript:
Ver original
  1. rec.set('tipo_doc', datos.tipoDocumento);
  2. rec.set('nombreTipoDoc', cmbModiTipoDoc.getRawValue());
  3. rec.set('nro_doc', datos.numeroDocumento);
  4. rec.commit();

Que mas mostrar? El panel con la grilla? El store de la grilla desde se originan recs y rec?

Voy a intentar que la excepcion me de un error descriptivo. Hasta ahora me dice cosas como "Error: r is undefined" o en vez de "r" alguna otra variable que no se de donde sale. Supongo que se trata variables propias de ExtJs.

Última edición por mayid; 13/05/2011 a las 09:24
  #4 (permalink)  
Antiguo 13/05/2011, 09:17
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años, 6 meses
Puntos: 343
Respuesta: ExtJs : error en commit

Es ExtJS3? Que exception te tira exactamente?
__________________
blog | @aijoona
  #5 (permalink)  
Antiguo 13/05/2011, 09:27
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 7 meses
Puntos: 101
Respuesta: ExtJs + error en commit + [Error: r is undefined]

Gracias por comentar. Mira, la libreria es la 2.1, y el error suele ser:

"Error: r is undefined"

A ver si soy mas grafico. Esta es la seccion de success / error. Se evalua el success, se entra en el try, y cuando se llega al commit salta el error definido el catch, que es "ta ta ta... [Error: r is undefined]"

Código Javascript:
Ver original
  1. success: function(response, options)
  2.                   {
  3.                    try
  4.                     {
  5.                       respObj = Ext.util.JSON.decode(response.responseText);
  6.                       if (respObj.success)
  7.                       {
  8.                         var cmbModiTipoDoc = Ext.getCmp('mdcCmbModiTipoDoc');
  9.                         if(IsDefined(cmbModiTipoDoc))
  10.                         {
  11.                           rec.set('tipo_doc', datos.tipoDocumento);
  12.                           rec.set('nombreTipoDoc', cmbModiTipoDoc.getRawValue());
  13.                           rec.set('nro_doc', datos.numeroDocumento);
  14.                           rec.commit();
  15.                         }
  16.                         else
  17.                         {
  18.                           grdStore.load();
  19.                         }
  20.                         sgc.mDocumentosClientes.modificacion.cerrar();
  21.                         msgWait.hide();
  22.                       }
  23.                       else if (IsDefined(respObj.errors))
  24.                       {
  25.                         Ext.Msg.alert('Aviso', 'No se pudo guardar la modificaci'+ooo+'n: <br/>' + respObj.errors);
  26.                       }
  27.                       else
  28.                       {
  29.                         Ext.Msg.alert('Aviso', 'No se pudo guardar la modificaci'+ooo+'n');
  30.                       }
  31.                     }
  32.                     catch(err)
  33.                     {
  34.                       ErrorInesperado(err);
  35.                     }
  36.                   },
  37.                   failure: function(response, options)
  38.                   {
  39.                     Ext.Msg.alert('Aviso', 'No se pudo guardar la modificaci'+ooo+'n: <br/>' + response.responseText);
  40.                   }
  #6 (permalink)  
Antiguo 13/05/2011, 10:13
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 7 meses
Puntos: 101
Respuesta: ExtJs + error en commit + [Error: r is undefined]

Con Firebug veo que tanto el Store como el objeto rec (que deriva del store, y que se crea al hacerle doble click al usuario listado en el grid como para editarlo) son destruidos en determinado momento. Sin embargo, cuando se actualiza un segundo usuario siempre se esta actualizando el primero!

Encontré aparentemente ese mismo problema en el foro Sencha, sin solucion:
http://www.sencha.com/forum/showthre...e-update-fails
http://www.sencha.com/forum/showthre...l=1#post302089

Y quizas esto tenga relación:
http://thelampposts.blogspot.com/200...ore-reset.html

La manera en que se está eliminando el store es esta:

Código Javascript:
Ver original
  1. grdStore.removeAll();
  2.      
  3.       grdStore.baseParams.filtros = Ext.util.JSON.encode(
  4.       {
  5.         nombres: '',
  6.         apellidos: '',
  7.         tipoDoc: '',
  8.         nroDoc: ''
  9.       });
  10.       grdStore.baseParams.accion = '';

En cuanto al objeto rec, se lo genera y regenera así cada vez que se hace doble click un el grid:
Código Javascript:
Ver original
  1. var recs = grdConsulta.getSelections();
  2.       var rec;
  3.      
  4.       if (recs.length > 0)
  5.       {
  6.         rec = recs[0];
  7. ...}

Habrá manera de forzar un garbage collector o algo de eso?

Última edición por mayid; 13/05/2011 a las 11:10
  #7 (permalink)  
Antiguo 13/05/2011, 13:28
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 7 meses
Puntos: 101
Respuesta: ExtJs + error en commit + [Error: r is undefined]

Esta claro que el problema es el objeto rec, que es el que llena el formulario. Por qué, a la hora de mostrar los datos en pantalla muestra los corrector pero a la hora de enviarlos envia los erroneos (los del primer usuario y no los del actual)?

El sistema es así:
- se muestra un buscador por DNI.
- se muestra el resultado de la busqueda en un grid (solo un usuario correspondiente al DNI)
- se hace doble click sobre el usuario
- se abre una segunda ventana que se llena con los datos del usuarios (objeto rec).

Llegado este punto, no se por qué, no puedo leer más la variable rec con firebug.

- se cambia el DNI del usuario.
- Se presiona ok y se hace un envio por ajax al lado servidor con lo cual se hace un UPDATE sql.
- se hace el commit de rec y se cierra la ventana

En el commit da error para el segundo usuario. Esto es porque al dar ok al boton de update se esta enviando el id del primer usuario a lado servidor. Pero por que? Si en pantalla estoy viendo los datos correctamente y con el firebug se que el id esta ok a la hora de mostrarlos? Por que el id cambia repentinamente antes de enviar data al lado servidor? Y por que no puedo rastrear la variable rec con Firebug cuando esta abierta la ventana de modificion (solo puedo evaluarla en la venta del grid)?
  #8 (permalink)  
Antiguo 13/05/2011, 14:34
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 7 meses
Puntos: 101
Respuesta: ExtJs + error en commit + [Error: r is undefined]

SOLUCIONADO

El problema era que la declaracon de la variable rec debía ser global. Eso daba los problemas tan raros!
  #9 (permalink)  
Antiguo 13/05/2011, 18:04
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años, 6 meses
Puntos: 343
Respuesta: ExtJs + error en commit + [Error: r is undefined]

Justo me iba a hacer un tiempo para leerlo.

Ante la duda, en la parte de codigo que posteaste del callback success, tenes la variable respObj declarada implicitamente como global (dentro del try catch), es intencionado?
__________________
blog | @aijoona
  #10 (permalink)  
Antiguo 13/05/2011, 18:08
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 7 meses
Puntos: 101
Respuesta: ExtJs + error en commit + [Error: r is undefined]

No tengo el codigo a mano ahora, pero quizas esa variable haya sido declarada antes. Igual, aunque no diga "var" explicitamente su ambito sería local, creo

El problema que tenía estaba en la variable rec, que se declaraba al generarse la ventana de edición así: var rec;

Esto funcionaba al ahora de mostrar la ventana de edición y de llenar los campos del form, pero al cerrar la ventana, rec se ponía rara y tomaba los datos del primer usuario editado

La solucion fue declarar rec a principio del objeto, y no dentro de un metodo.

  #11 (permalink)  
Antiguo 13/05/2011, 18:36
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años, 6 meses
Puntos: 343
Respuesta: ExtJs + error en commit + [Error: r is undefined]

Si no dice var sin estar declarada previamente estás creando una global implícita, lo cual no es bueno (y no es posible en modo estricto).

Pero me parecería raro que una variable que contiene la respuesta de una consulta ajax esté previamente declarada, cuando su uso debería estar acotado al callback.
__________________
blog | @aijoona
  #12 (permalink)  
Antiguo 13/05/2011, 19:13
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 7 meses
Puntos: 101
Respuesta: ExtJs + error en commit + [Error: r is undefined]

Tenes razon en lo del ambito de las variables. Gracias por recordarmelo, porque estoy saturado de lenguajes y a veces pierdo los principios de algunos.

Como no estoy en la oficina no se decirte nada sobre la variable que comentas. Quizas se declare antes de declarar success. No me había fijado. En todo caso el lunes lo puedo revisar.

Saludos!
  #13 (permalink)  
Antiguo 13/05/2011, 19:19
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años, 6 meses
Puntos: 343
Respuesta: ExtJs + error en commit + [Error: r is undefined]

Está en el post #5 el codigo que menciono.
__________________
blog | @aijoona
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:45.