[SOLUCIONADO] Problema con ajax y dos combos.

Estimados amigos.
Tengo un problema con los eventos de un ef que paso a detallar en un documento adjunto, en el que encontrarán imágenes que les ayudarán a comprenderlo más rápido.

Espero vuestra atenta respuesta.

Un cordial saludo.


Hola Claudio,
Si entendí bien el .doc lo que querés hacer es armar una cascada entre Barrio y Calle, pero en lo posible manteniendo el valor de esta última en caso de cambio de barrio.
Es una feature interesante para facilitar la tarea del usuario, creo que se puede implementar de forma sencilla en el mismo núcleo, voy a revisarlo así ya queda.

Con respecto a tu implementación creo que tenés dos problemas. El último es el que entiendo mejor, ese mensaje de “Error interno. No posee la fila tal entre las enviadas” es un error de seguridad, lo que se quiere evitar es que maliciosamente alguien pueda seleccionar cosas que no se ofrecieron. Para ello el formulario guarda en sesión las filas enviadas, y controla que la seleccionada este entre las enviadas. Lo que deberías hacer en el método ajax__carga_calles_del_barrio es decirle al ef cuales son los datos que se enviaron. Sería algo así


//$datos = traigo el arreglo asociativo clave => valor
$this->dep('frm_identificatorios')->ef('p01codcadom')->guardar_dato_sesion($datos);

De esa forma creo evitaría el mensaje.

Por otro lado esta el comportamiento que ‘resetea’ la calle que parece muy extraño. Lo primero que veo es que se muestra el alert, con lo cual se esta lanzando el __procesar del barrio. Suponiendo que esto sucede se estaría disparando un AJAX justo antes de ir al server (o durante la ida, ya que es asincronico). Proba definir el siguiente método en javascript


{$this->objeto_js}.evt__aceptar = function() {
    alert('antes de enviar');
}

y fijate cual de los dos alerts se disparan primero, si lo hace este evt__aceptar podes dejar un flag que lea el __procesar para que no hacer nada en este caso.

Estimado Sebastián, gracias por responder y por analizar el problema.

Te cuento:
Agregué la linea que manda el arreglo asociativo en el método que invoca ajax, pero no parece dar resultado; sigue sin encontrar el código de calle en la lista. Voy a seguir probando por ese lado a ver si por ahí no le estoy mandando el arrego como a él le gusta.

Por otro lado, esta mañana detecté el por qué resetea barrio y calle:
Sucede que, cuando el toba encuentra el error que nos aqueja, cancela el resto del método del evento aceptar, por lo que no se produce la actualización del recordset. Luego, al refrescar la pantalla vuelve a ejecutar el evento de configuración del formulario que, necesariamente, toma los datos del recordset, donde aún están los datos anteriores.

toba_error_seguridad: El ef 'p01codcadom' no posee a la opción '625' entre las enviadas [trAZA]exception ‘toba_error_seguridad’ with message ‘Error Interno’ in /var/toba_1.4.4/php/nucleo/componentes/interface/efs/toba_ef_combo.php:184 Stack trace: #0 /var/toba_1.4.4/php/nucleo/componentes/interface/toba_ei_formulario.php(285): toba_ef_seleccion->cargar_estado_post() #1 /var/toba_1.4.4/php/nucleo/componentes/interface/toba_ci.php(201): toba_ei_formulario->disparar_eventos() #2 /var/toba_1.4.4/php/nucleo/componentes/interface/toba_ci.php(201): toba_ci->disparar_eventos() #3 /var/toba_1.4.4/php/nucleo/toba_solicitud_web.php(127): toba_ci->disparar_eventos() #4 /var/toba_1.4.4/php/nucleo/toba_solicitud_web.php(45): toba_solicitud_web->procesar_eventos() #5 /var/toba_1.4.4/php/nucleo/toba_nucleo.php(54): toba_solicitud_web->procesar() #6 /var/toba_1.4.4/proyectos/personal/www/aplicacion.php(25): toba_nucleo->acceso_web() #7 {main}

Mensaje a usuario: Error Interno

Te mando la traza del error por si te es de utilidad.

De nuevo gracias y espero que uds., que tienen más conocimientos del toba, neuronas y más jovenes le encuentren la vuelta.

Un abrazo.

Estimado Sebastián, orientado con tu propuesta de solución, cambié el método invocado desde el ajax que quedó de esta manera:

//------ Para cargar el combo de "p01codcadom" del formulario de datos identificatorios.
function ajax__carga_calles_del_barrio($barrio, toba_ajax_respuesta $respuesta)
{	
	$filtro=" where codba=".$barrio;
	$datos=array();
	$resultado=consultas::get_calles_del_barrio($filtro);
					
	foreach($resultado as $i => $fila)
	{
		$datos[$fila['codca']]=$fila['nomca'];
	}
	
	$this->dep('frm_identificatorios')->ef('p01codcadom')->set_opciones($datos);
	$respuesta->set($resultado);
}

y, aunque no lo creas ¡¡¡FUNCIONA!!!

Un abrazo, y quedo a tu disposición para lo que pueda serte de utilidad.