Agregar Validacion previa a Sincronizacion o Mejorar Mensaje a Usuario

Buenos Dias, cree un “ABM Simple” usando el asistente.
Cree algunas restricciones en la Base de Datos ( Unique Constrains) ademas de la PK.

La integridad de los datos funciona bien.
Pero el mensaje al usuario es incomprensible …

Tengo dos opciones:
1)Validar “manualmente” antes de invocar la sincronizacion.
2)Trapear el error en la sincronizacion y mostrar un texto mas entendible.

Lo que no comprendo es donde poder hacer alguna de esas dos opciones.

Mirando el php q genero el Asistente, veo que solamente tengo acceso a los datos en este metodo.

function evt__formulario__modificacion($datos)
	{
		$datos['fecha_alta_mod_reg'] = date("Y-m-d");;
		//print_r(toba::usuario()->get_id());
		$datos['alta_mod_reg_usuario_id'] = toba::usuario()->get_id();
		if (!isset($datos['extension']))
			$datos['extension'] = 0;
		$this->dep('datos')->tabla('t_calles')->set($datos);
	}

Como veran ya estoy actualizando algunos datos.

Otra pregunta es :

como saber si entre por el alta o la modificacion ?

Saludos

Hola Ricardo,

podes hacer ambas opciones:

  1. Previo a hacer la modificacion en el evt__formulario__modificacion podes llamar a otro metodo que realice la validacion sobre los datos y dependiendo del resultado actuar en consecuencia.

  2. El tema con este punto es el siguiente:

  • Poner un try/catch que capture el error de BD puede hacer que captures mas cosas que solo el error que buscas y entonces termines informando un mensaje incorrecto.

  • Tengas que meter logica en la operacion para capturar SQL_STATEs puntuales, complicandote de gusto la rutina que atrapa el error.

Incluso te diria que en este caso, es mejor utilizar un manejador de errores para todo el motor, el cual te de un mensaje mas claro (pero igualmente generico) sobre el error para un SQL STATE determinado.

Saludos

Hola Richard.
Te vuelvo a preguntar.

Lo modifique asi:

	function evt__formulario__modificacion($datos)
	{
		error_reporting(E_ALL);
		if (!existeDuplicado($datos)) {
			$datos['fecha_alta_mod_reg'] = date("Y-m-d");;
		//print_r(toba::usuario()->get_id());
			$datos['alta_mod_reg_usuario_id'] = toba::usuario()->get_id();
			if (!isset($datos['extension']))
				$datos['extension'] = 0;
			$this->dep('datos')->tabla('t_calles')->set($datos);
		} else {
			//void get_error_toba( $codigo, $descripcion  )
			toba::notificacion()->agregar('El nombre o el número ya fue registrado, verifique!');
			return false;
		}
	}
	
	function existeDuplicado($datos) 
	{
		echo "estoy en existe duplicado";
		var_dump($datos);die();
		$ret = false;
		$sql = 'SELECT id FROM t_calles where nombre_numero="'.$datos['nombre_numero'].'" or nombre="'.$datos['nombre'].'" ;';
		echo $sql;
//        if (!empty(toba::db()->consultar($sql))
//            $ret = true;
//        //toba::notificacion()->agregar($ret.'El nombre o el número ya fue registrado, verifique!');    
		return $ret;
	}

El tema es que al parecer no invoca a la funcion existeDuplicado, y me da ningun mensaje de error.
Que es lo que sucede ?
por que no me da ningun mensaje ? si hay algo mal en el codigo deberia al menos ver el error de PHP …
En el LOG no aparece nada, no tengo manera de saber que anda mal!
Saludos

Hola Ricardo,

creo que el problema esta en el scope de la llamada, vos tenes ‘if (!existeDuplicado($datos))’ … pero como estas dentro de una clase, deberia ser
‘if (! $this->existeDuplicado($datos))’, de otra forma no te va a acceder al metodo xq no lo estas invocando sobre un objeto.

Saludos

Richard, disculpa la demora en la respuesta.
Funciono tal cual lo del Scope.

Ahora, me quedan 2 dudas:

  1. para saber si el evento es alta o modificacion supongo que deberia evaluar la clave primaria, en mi caso : id.
    si es null es alta, sino modificacion, es correcto ?

  2. existe algun metodo que se invoque antes que este ? por el fw ?
    ya que logre atrapar el error, pero me vuelve a la pantalla de seleccion, y eso que yo finalice el evento devolviendo FALSE …

Saludos
Gracias

El punto 2) lo solucione asi:

		$dup = $this->existeDuplicado($datos);
//		echo "estoy en formulario__modificacion despues de existe duplicado : >$dup<";
		if (!$dup) {
			$datos['fecha_alta_mod_reg'] = date("Y-m-d");;
			$datos['alta_mod_reg_usuario_id'] = toba::usuario()->get_id();
			if (!isset($datos['extension']))
				$datos['extension'] = 0;
			$this->dep('datos')->tabla('t_calles')->set($datos);
		} else {
			//void get_error_toba( $codigo, $descripcion  )
			//toba::notificacion()->agregar('El nombre o el número ya fue registrado, verifique!');
			throw new toba_error("El nombre o el número ya fue registrado, verifique!!");	
			return false;
		}

El throw del error, al parece hace lo que necesito, quiza el return false esta demas?

Hola Ricardo,

Es una forma, queda a gusto tuyo.

2) existe algun metodo que se invoque antes que este ? por el fw ? ya que logre atrapar el error, pero me vuelve a la pantalla de seleccion, y eso que yo finalice el evento devolviendo FALSE ...

En dicha etapa se atienden los eventos que procesan las interacciones del cliente, osea que lo unico que se puede haber llamado es otro metodo para atender un evento de otro componente de la misma pantalla.
Y el return FALSE si esta de mas, ya que nunca llega a ejecutarse esa sentencia.