Hola! Mi nombre es Claudia y estoy dando mis primeros pasos con el TOBA. Actualmente estoy tratando de migrar a TOBA una aplicación externa propia de mi Universidad la cual se utiliza como Interfaz para los usuarios de SIU-Pampa Postgres.
Esta Interfaz incluye listados, asi como también exportaciones para otros sistemas.
La idea es generar un único proyecto en TOBA que se encontrará alojado en el servidor donde se encuentran las Bases de Datos de las Dependencias de SIU-Pampa y que, según cada usuario que se conecte, se tenga acceso a una Base u otra.
Cabe aclarar que debido al funcionamiento propio del SIU-Pampa, las Bases son independientes unas de otras: mas alla de que la estructura es la misma, los datos no lo son.
Hasta el momento no pude determinar como lograrlo porque no estoy segura de que sea posible.
Existe alguna otra opción que no implique un proyecto distinto para cada Dependencia?
Desde ya muchas gracias!
Claudia Reinaudi
Universidad Nacional de Luján
Te cuento que en la reunion Anual de Guarani, el año pasado, los tecnicos que estan haciendo la reingenieria del sistema en TOBA. Comentaron que para otorgar mayor seguridad al acceso desde las Unidades de Gestión (como las UAs) extenderian la API para poder definir más de un usuario de conexión a la Base de datos.
La definición de los usuarios de conexión quedaria reflejada en Bases.ini
Tal vez, esta funcionalidad estaria incorporada en próxima versión de TOBA.
Veremos que dicen los tecnicos de TOBA.
Fabian, gracias por tu respuesta. Lo que yo necesitaría es poder tener solo un proyecto para mantener y que cada usuario, cuando se loguee, ingrese a la Base que le corresponde según su Dependencia. No se si esto es lo que modificaran en la API de TOBA.
Mi inconveniente es que no puedo modificar la estructura de la Base (o sea crear una sola base con distintos esquemas) por un tema de funcionamiento de SIU-Pampa, cosa que se solucionaría una vez que migremos a SIU-Mapuche.-
Hola! Lo que necesitaríamos sería: conectarnos a una tabla (una Base) para verificar a que dependencia pertenece el usuario, tomar de la misma el nombre de la Base a la cual debe conectarse y luego realizar esa conexión.
Lo podés hacer extendiendo la fuente de datos (Solapa Datos de toba_editor, la editas con el lapiz y definis una subclase), el código de dicha subclase sería algo así,
<?php
class proyecto_fuente_datos extends toba_fuente_datos
{
/**
* Si ya se determino la unidad academica correcta, cablear la conexion a la base de la misma
*/
function pre_conectar()
{
$base_uacad = toba::memoria()->get_dato_instancia("base_uacad");
if (isset($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);
}
}
/**
* Si aún no se determino la UA, hacerlo y forzar que se refresque la base
*/
function post_conectar()
{
$base_uacad = toba::memoria()->get_dato_instancia("base_uacad");
if (!isset($base_uacad)) {
//Busca la UA del usuario actual (esto depende del esquema)
$datos = $this->db->consultar_fila("SELECT uacad FROM person WHERE persona = ". quote(toba::usuario()->get_id()));
if (empty($datos)) {
throw new toba_error("No existe la persona ".toba::usuario()->get_id());
}
//Deja el nombre de la base en sesion
toba::memoria()->set_dato_instancia("base_uacad", "base_".$datos['uacad']);
//Fuerza la reconexion de la base
$this->db->destruir();
$this->db = null;
$this->get_db(true);
}
}
}
?>
Fijate de cambiar la forma de encontrar la UA de una persona. Lo que hace este código es cambiar los parametros en ejecución de la fuente de datos (definida contra la base principal en bases.ini) y forzar una reconexión. Si necesitas tener ambas conexiones al mismo tiempo en una operación (la principal y la de la UA) se podría hacer teniendo dos fuentes de datos, en el pre_conectar de la fuente de la UA usar la conexión de la principal para determinar los parámetros. Cualquier duda o problema la seguimos
Sebastián: te cuento que estuve probando lo que me mandaste y se produce el siguiente error:
Fatal error: Call to a member function exec() on a non-object in C:\toba_1.3.2\php\lib \db\toba_db.php on line 164
La consulta la hace de forma correcta, me trae el nombre de la base a la que se debe conectar el usuario pero el error se produce en la última línea del post_conectar(), $this->get_db(true);
Otra cosa que sucede es que cuando previsualizo, me da el error y recargo la página, se produce un error de esquema (no lo encuentra), lo que me da la pauta de que esta apuntando a una base distinta a la definida en la fuente de datos del editor (porque en la definición de esa fuente existe un esquema que no esta ninguna de las otras bases).
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.
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’)
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?
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.
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.
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.
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?
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!
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.