Mas de una conexión a BD en un proyecto

Sebastián: siguiendo con las pruebas paso lo siguiente: desde el editor de toba borre los esquemas de la fuente de datos porque era uno de los errores que me tiraba, luego previsualizo el proyecto y me da el error que te mande en el mensaje anterior, pero si recargo la página, me muestra los datos correctos, o sea que conecta a la Base que corresponde.
Por ahí con esto te doy alguna pauta mas de lo que puede suceder.

Perdón por las molestias!!!

Gracias!

Claudia
UNLu

Según entiendo lo que no está funcionando es el recambio de base en el mismo request donde se determina la UA correspondiente. Voy a ver si en la 1.3 cambia algo en relación a esto (yo lo probé con la 1.4), después hago la prueba y te posteo una alternativa. Saludos

Ahi vamos de nuevo, para hacerlo mas limpio proba de hacer dos fuentes de datos: la actual (predeterminada) es la que se va a usar restringida a la UA, y otra (la llame ‘central’) que es la que tiene la conexión con la base principal. . Lo que hace este codigo es previo a conectarse a la principal, se conecta a la central y cambia los parametros de conexion en base a la unidad académica. Tambien cambie set_dato_instancia/get_datos_instancia por set_dato/get_dato ya que el tiempo de vida de lo anterior se extendía luego del logout.


<?php


class proyecto_fuente_datos extends toba_fuente_datos
{
	/**
	 * Previo a conectarse a la fuente de datos chequea en la base central
	 */
	function pre_conectar()
	{
		$base_uacad = toba::memoria()->get_dato("base_uacad");
		if (!isset($base_uacad)) {
			//Busca la UA del usuario actual en la base central
			$db_central = toba::db('central');
			$datos = $db_central->consultar_fila("SELECT uacad FROM person WHERE persona = ". $db_central->quote(toba::usuario()->get_id()));
			if (empty($datos)) {
				throw new toba_error("No existe la persona ".toba::usuario()->get_id());
			}
			$base_uacad = $datos['uacad'];
			toba::memoria()->set_dato("base_uacad", $base_uacad); 
			
		}
		//Crea el id de bases.ini, por ejemplo [desarrollo toba_referencia toba_referencia]
		$base_id = toba::instancia()->get_id().' '.$this->definicion['proyecto'].' '.$this->definicion['fuente_datos'];
		//Obtiene los parametros actuales
		$parametros = toba_dba::get_parametros_base($base_id);
		//Cambia unicamente la base
		$parametros['base'] = $base_uacad;
		//Hace que el DBA recuerde los nuevos parametros por este request
		toba_dba::set_parametros_base($base_id, $parametros);
	}
	
	
}


?>

Esto te permite en cualquier momento desde el código poder acceder a la base central con toba::db(‘central’)

Buenisimo! Pruebo y te cuento!

Gracias!

Claudia
UNLu

Sebastian: estuve probando lo último que me enviaste y me sigue dando el mismo error (te adjunto imagen). Si recargo la página el error no da y me muestra el filtro y el cuadro.

Creé dos fuentes de datos: UA y central. UA es predeterminada. Extendí UA y funciona, se conecta a la base que corresponde (recargando la página luego del error).

Mas alla del error que da, me surge la siguiente duda: si tengo varias UAs como funcionaría en este caso el tema de la fuente predeterminada?

Gracias!

Claudia
UNLu


Hola Claudia,

nos podrias pegar el codigo de la subclase para la fuente UA? asi vemos si quedo algo viejo haciendo conflicto. Gracias :slight_smile:

Saludos
Richard

Richard: te paso el script tal cual lo ejecuto. Me puede estar faltando alguna otra configuración en el editor que haga que se genere este error? Porque Sebastian lo habia probado y le funcionaba.

Gracias!

Claudia
UNLu


Hola Claudia,

si te fijas en la respuesta #10 en la que Seba te comenta sobre el uso de dos fuentes distintas, el tambien adjunto un codigo, ese seria el codigo a tener en la clase proyecto_fuente_datos se me ocurre que por ahi puede venir el inconveniente, lo que te pediria es que pruebes reemplazando el codigo por el nuevo y nos avises como fue.

Saludos
Richard

Richard: tenias razón!! Se me habían mezclado los scripts. Funciona bárbaro cuando se trata de listados pero estuve probando con datos tabla y no funciona, será por los componentes de persistencia? Porque trato de ponerles la fuente que tiene la subclase (o sea UA) y no me lo permite.

Gracias y disculpa por la confusión de scripts!!

Claudia
UNLu

Consulta, el error se te presenta al momento de la creacion del datos_tabla o en la ejecucion de la operacion que usa el datos_tabla?.. podrias pegarme/copiarme el error?

Gracias y disculpa por la confusión de scripts!!

No problemo … estamos para ayudar.

Saludos
Richard

Richard: me suceden un par de cosas distintas: si yo pongo como predeterminada la fuente extendida, cuando creo el datos_tabla me muestra el error que te adjunto como Error Fuente 01.jpg y el warning que te adjunto como warning.jpg.
Si cambio la fuente y pongo como predeterminada la que no esta extendida, me permite cambiarla por la extendida, pero me da el error que te adjunto como Error Fuente 02.jpg. Si dejo la predeterminada, cuando previsualizo, realiza la conexión correctamente, o sea los listados traen los datos que le corresponden al usuario logueado, pero la modificación del datos_tabla la realiza
sobre la base de la fuente predeterminada, no la cambia.

Uf! que complicado de explicar! Espero haber sido clara!

Cualquier duda consultame!

PD: Estoy usando la versión 1.3.2

Gracias!

Claudia
UNLu


Hola Claudia,

gracias por las imagenes ahora me doy una idea mejor del tema, voy a probar la ejecucion del asistente con varias fuentes de datos… quizas el problema pueda esta alli. En cuanto lo tenga probado te aviso… o te vuelvo con mas preguntas :D.

Saludos
Richard

Hola! Les escribo para consultar si pudieron ver algo sobre mi problema porque sigo avanzando con el proyecto y, de no ser factible mi planteo, tendré que empezar a buscar otras opciones de implementación.

Gracias!

Claudia
UNLu

Hola Claudia,

disculpa que no volvi para responderte la verdad se me quedo colgado el tema… gracias por recordarmelo, hice la prueba con varias fuentes de datos y el asistente me funciono correctamente. La duda que me surge es… ¿porque en el mensaje de error hace referencia a toba_editor? (me quede ciclando con esto XD). Vos tenias dos fuente distintas ¿solo las diste de alta en tu proyecto verdad?

Saludos
Richard

Richard: no hay drama, yo igual seguí avanzando con el proyecto.
Yo tengo dos fuentes en el proyecto. La fuente predeterminada es la que esta extendida. Cuando quiero crear un ABM, el asistente me da error con la otra fuente, la creada que no esta ni extendida ni es la predeterminada. Y si la cambio me da otros errores (adjunté las imágenes en un mensaje anterior). Más alla de los errores, probamos anteriormente con una compañera de trabajo algo similar a lo que me planteaste y las modificaciones se hacían sobre las tablas de la base relacionada al datos_tabla durante su creación y no sobre la base a la que me conecté según mi usuario. ¿A vos esto te funcionó? Porque si es así por ahí es mi instalación de toba y lo reinstalo.

Lo que estuve viendo (todavía no pude probarlo del todo) es no usar los componentes de persistencia, ya que los ABMs que debo hacer son muy simples, y usar .php que hagan todo el proceso, conectándome dinámicamente a la base según el usuario logueado. Es un poco mas de trabajo, pero si funciona es una alternativa si me siguen dando errores.

Cuando tenga algo probado te aviso.-

Gracias!

Claudia
UNLu

Buenas…

Perdón por reflotar un tema tan viejo, pero actualmente me veo en la necesidad de aplicar lo que aquí se discutió, y me gustaría dejar constancia de lo que me paso, para futuras aplicaciones…

Lo que claudia comenta en el post 18, que desde el toba_editor le arroja un error al intentar hacer referencia a las tablas pertenecientes a la fuente de datos extendida, se da porque el editor intenta buscar la base “central” entre las pertenecientes al toba_editor como proyecto.

Lo que hice para evitar este problema es determinar si al momento que se dispara el pre_conectar() se lo hace con el toba_editor presente, si es así, no ejecuto lógica alguna dejando la fuente de datos con las definiciones establecidas en el editor, con esto no arroja error alguno, y se puede usar el toba_editor sin inconvenientes; a continuación el código siguiendo la linea del ejemplo:


<?php


class proyecto_fuente_datos extends toba_fuente_datos
{
	/**
	 * Previo a conectarse a la fuente de datos chequea en la base central
	 */
	function pre_conectar()
	{
		// si el editor esta activado, entonces la fuente funciona con los
		// parametros indicados en el editor (bases.ini)...
		if (toba_editor::activado()) {
			toba::logger()->debug('*** MODO EDITOR ***');
			return;
		}

		$base_uacad = toba::memoria()->get_dato("base_uacad");
		if (!isset($base_uacad)) {
			//Busca la UA del usuario actual en la base central
			$db_central = toba::db('central');
			$datos = $db_central->consultar_fila("SELECT uacad FROM person WHERE persona = ". $db_central->quote(toba::usuario()->get_id()));
			if (empty($datos)) {
				throw new toba_error("No existe la persona ".toba::usuario()->get_id());
			}
			$base_uacad = $datos['uacad'];
			toba::memoria()->set_dato("base_uacad", $base_uacad); 
			
		}
		//Crea el id de bases.ini, por ejemplo [desarrollo toba_referencia toba_referencia]
		$base_id = toba::instancia()->get_id().' '.$this->definicion['proyecto'].' '.$this->definicion['fuente_datos'];
		//Obtiene los parametros actuales
		$parametros = toba_dba::get_parametros_base($base_id);
		//Cambia unicamente la base
		$parametros['base'] = $base_uacad;
		//Hace que el DBA recuerde los nuevos parametros por este request
		toba_dba::set_parametros_base($base_id, $parametros);
	}
	
	
}
?>

Saludos

José

Genial Jose, gracias por el aporte :slight_smile:

Buenas gente…

Estoy haciendo un proceso que necesita conectarse a varias bases de datos dentro de la misma operación.
Todas las bases tienen la misma estructura pero distintos datos.

Extendí la fuente de datos tal cual se explica en los mensajes de este hilo, pero me falta una vuelta de rosca, ya que el cambio lo necesito hacer dentro de la misma operación.
Uso el refrescar de la clase toba_dba, pero no logro hacerlo funcionar.

Acá pego el código y el error que me da al navegar el proyecto.


foreach ($this->bases as $base){
	$parametros = toba_dba::get_parametros_base($base['id_base']);

	try {
		toba::memoria()->set_dato("base_testeo", $parametros['base']);
                toba_dba::refrescar($id);

                // Acá ejecuto las consultas a las bases de datos,

	}
	catch (Exception $e){
		$this->log->set_mensaje('Se produjo un error al ejecutar RHUN'. $e,'error', true);
	}
}

Cuando se va a ejecutar la primer consulta tira el error que pego aca abajo:

Fatal error: Call to a member function query() on a non-object in /home/emiliano/proyectos/toba/php/lib/db/toba_db.php on line 394

Esto lo estoy ejecutando con:

  • toba 1.5.10
  • PHP 5.3

Desde ya muchas gracias.

Emiliano Jaureguiber

Hola Emiliano,

asi como esta no creo que funque, hay una llamada a toba::memoria ahi que no entiendo muy bien que significado tiene, eso se tendria que resolver todo dentro de toba_dba, proba con lo siguiente y avisame:


foreach ($this->bases as $base){
	$parametros = toba_dba::get_parametros_base($base['id_base']);
              toba_dba::set_parametros_base('base_testeo', $parametros);         //Con esto pisas la definicion de la base 'base_testeo'

	try {
                  $db = toba_dba::get_db('base_testeo', false);       //Aca obtenes una nueva conexion, no reusa la actual

                // Acá ejecuto las consultas a las bases de datos,
	}
	catch (Exception $e){
		$this->log->set_mensaje('Se produjo un error al ejecutar RHUN'. $e,'error', true);
	}
}

Saludos

Hola Richard,

te cuento que el toba::memoria lo que hace es cargar un dato en memoria que después es consumido desde el método pre_conectar de la fuente de datos que tengo extendida y uso como general del proyecto.

Lo que necesito que se me actualice es la fuente general del proyecto, el comportamiento que quiero lograr es

Estas en una operación, vas cambias la base a la cual te conectas en el bases.ini y cuando haces un nuevo pedido de página te trae los datos de la base que acabas de poner.
en definitiva seria como hacerle creer a toba que hubo un pedido de página nueva entonces tiene que recargar la fuente desde el bases.ini

El db = get_db, no me sirvió porque me deja la conexión en el $db y no en la fuente que usa toba para hacer los pedidos a la base de datos, se entiende.

Desde ya muchas gracias por el tiempo… Sigo intentando…

Emiliano