[SOLUCIONADO] Problema de fijación de datos con ABM tabular

Hola, tengo un problema, con un ABM como el de Personas en el proyecto referencia. Seguro es algún tilde por ahi, pero no puedo figurarme cual.
Por código “pareciera” estar todo bien.

Tengo 2 tablas en una relacion, rel_materias_dictados, que son: materias_dictados y docentes_materias. Se vinculan de esta forma: materias_dictados.id = docentes_materias.id_materia_dictado (padre e hijo respectivamente).

Aparentemente, es evt__formulario_materia_dictado__modificacion quien no produce el efecto deseado. Con solo cambiar de solapa y luego volver, los efs del formulario_materia_dictados aparecen re-inicializados.

La edición de algún dato ya cargado funciona sin problemas, por lo que el conf__ de dicho formulario, está funcionando.

Adjunto el código del ci de edición:


<?php
class ci_materias_dictados_edicion extends toba_ci
{
	function get_relacion()	
	{
		return $this->controlador->get_relacion();
	}
	
	//-------------------------------------------------------------------
	//--- Pantalla 'materia_dictado'
	//-------------------------------------------------------------------

	function conf__formulario_materia_dictado(toba_ei_formulario $form)
	{
		if ($this->get_relacion()->esta_cargada()) {
			$datos = $this->get_relacion()->tabla('materias_dictados')->get();
			$form->set_datos($datos);
		} 
	}

	function evt__formulario_materia_dictado__modificacion($datos)
	{
		var_dump($datos); //llega con datos pero no se guardan (cuando vuelvo al formulario, está inicializado)
		$this->get_relacion()->tabla('materias_dictados')->set($datos);
	}

	//-------------------------------------------------------------------
	//--- Pantalla 'docentes'
	//-------------------------------------------------------------------

	function conf__formulario_docentes(toba_ei_formulario_ml $form)	
	{
		$datos = $this->get_relacion()->tabla('docentes_materias')->get_filas(null, true);
		$form->set_datos($datos);
	}

	function evt__formulario_docentes__modificacion($datos)
	{
		$i = 1; 
		foreach ($datos as &$fila) {
			$fila['nro_orden'] = $i++;
		}
		$this->get_relacion()->tabla('docentes_materias')->procesar_filas($datos);	
	}
}
?>

Mil gracias

Hola Martin,

creo que el inconveniente puede estar justamente en el conf__ de dicho formulario, el detalle radica en una sutil diferencia en la interpretacion de lo que hace el metodo datos_relacion::esta_cargada() , ese metodo surgio para determinar cuando una relacion fue cargada exitosamente desde la bd, que es distinto a determinar si la relacion tiene datos o no. Creo que la documentacion es responsable de esta diferencia de interpretacion ya que no explicita desde donde se carga.

Por lo pronto hay 2 opciones:

  • En los metodos de modificacion utilizas el metodo set_cargado(true) para indicar que la relacion esta cargada, el problema de esto es que te puede traer fantasmas en alguno de los formularios ya que dicho metodo afecta toda la relacion y no individualmente a las tablas
  • Modificar el metodo conf__ del formulario para contemplar la diferencia de interpretacion:

        function conf__formulario_materia_dictado(toba_ei_formulario $form)
	{
                $cant_datos = $this->get_relacion->tabla('materias_dictados')->get_cant_filas(); //Contamos la cantidad de filas que tiene, debe tener 1 fila si hay datos
		if ($cant_datos > 0) {
			$datos = $this->get_relacion()->tabla('materias_dictados')->get();
			$form->set_datos($datos);
		} 
	}

Probalo, creo que con esto puede funcionar
Saludos
Richard

No pude probarlo de momento, porque no estoy con el ambiente de trabajo a mano, pero evidentemente pareciera funcionar.
Te hago una consulta, porque estoy definiendo también la metodologia de trabajo y venía basado en el proyecto referencia en líneas generales.
Conviene en principio controlar de esta forma? más que utilizar el método esta_cargada()?
En cuanto lo pruebe te confirmo como anduvo…

Nop… no anduvo, con tu código ni siquiera tengo salida HTML (le agregué los () a get_relacion pero igual no funciona).
Te paso las salidas de logger de tu codigo, y de mi codigo al cargar datos y pasar al segundo tab (ahi aparecen los datos), y luego, cuando vuelvo y se reinicializa.


Hola Martin,

la falta de salida HTML indica que se produjo un fatal error, si no ves ningun mensaje por el estilo te recomendaria que miraras en el php.ini y activaras las opciones de error_reporting = E_ALL y display_errors= On de esa manera cuando palme por algo php te vas a enterar por medio de un mensaje.

Por otro lado, el tema con el codigo que te pase es que la funcion se llama “get_cantidad_filas” y yo por escribirlo de memoria y no ir a la documentacion le mande “get_cant_filas” fijate si haciendo ese pequeño cambio de nombre funciona. A futuro compara los nombres de las funciones que te paso con la documentacion porque como veras mi memoria es peligrosa XD.

Saludos

Funcionó, no me di cuenta tampoco de cant y cantidad, y la falta de conocimiento profundo me lo complicó.
De esa forma se solucionó.

Ahora, la consulta de rigor.
Porqué en este caso particular no me funcionó esta_cargada(), y en otras relaciones que involucran más tablas y mayor complicación, no he tenido problemas? (si fuera algo de MS estaría autoexplicado… pero… :slight_smile: )
y otra, como sigo trabajando, o que modalidad de trabajo recomendas? en datos_tablas utilizar esta_cargada() y en relaciones este chequeo por cantidad_filas()? o todo de esta forma, o todo de la otra… (no entendí bien tu explicacion sobre el particular… es lo que hay… perdón).
Perdón que moleste, pero estoy iniciando con Toba, estableciendo formas de trabajo y atrás tendré que “capacitar!!!” (como si fuera posible) a los que me sigan.

Mil gracias!!!

En realidad no depende del tamaño de la relacion, sino mas bien de como trabaja la operacion. Si la operacion necesita de manera fija que un registro venga cargado entonces el esta_cargada te viene barbaro, si es una operacion en la cual no hay tabs… y se vuelve a una pantalla de seleccion al guardar entonces no te das cuenta del ‘error’, el tema surge cuando hay varios tabs y se navega libremente entre ellos, sumado a que se entra en modo ‘Alta’.

En particular si lo que necesitas es saber si hay datos para mostrarlos te diria que uses siempre el get_cantidad_filas(), si necesitas saber si los registros existen en bd para tomar alguna accion en base a eso ahi si utilizaria el esta_cargada, ya que es molesto elegir una tabla “testigo”. En gral creo que a nivel de Ci’s vas a usar casi siempre la cantidad de filas como indicador, el otro metodo quizas te venga mejor para clases de negocio.

Perdón que moleste, pero estoy iniciando con Toba, estableciendo formas de trabajo y atrás tendré que "capacitar!!!" (como si fuera posible) a los que me sigan. Mil gracias!!!

Jajajaja… no hay problema… hace 5 años atras yo pensaba lo mismo… y aca me tenes (confundiendo a la gente), con el tiempo uno gana seguridad y aprende a ponerle el pecho a las balas (previa compra de chaleco :P).

Saludos
Richard

Ya fue puesto en práctica:
esta_cargada cuando en la operación asocio solo una tabla.
get_cantidad_filas cuando utilizo una relación y una operación con tabs.
Igualmente, esto es para lo ya desarrollado. De acá en adelante, será solo get_cantidad_filas para unificar el código de la aplicación.
Mil gracias!!!