Buenas tardes:
Estamos trabajando en la migración de aplicaciones desarrolladas en VB 6 a Siu-toba en la versión 2.1.0 y nos surgió un problemita.
Adjunto una captura de pantalla de una relación que estuvimos trabajando, la cual continene varias tablas persona, persona_dato_censal, persona_carrera y persona_inscripcion.
La particularidad y por la forma en que encaramos la solución necesitabamos traer los datos de la persona, las carreras y las inscripciones de la persona pero solo el último dato censal.
Hasta donde lleguamos a probar utilizando el método cargar de la relación nos llenaba todos los datos de persona_dato_censal y no solo el último como necesitábamos, entonces en la ayuda de datos_tabla vimos que había un método que en vez de cargar toda la relación se carga_con_datos y ahí si se pudo traer solo el último dato censal. El código nos quedó así
function evt__cua_persona__seleccion($id)
{
$dato_persona = $this->get_relacion()->tabla('persona')->get_persona($id['idpersona']);
$this->get_relacion()->tabla('persona')->cargar_con_datos($dato_persona);
$dato_censal = $this->get_relacion()->tabla('persona')->get_persona_dato_censal($id['idpersona']);
$this->get_relacion()->tabla('persona_dato_censal')->cargar_con_datos($dato_censal);
$dato_persona_carreras = $this->get_relacion()->tabla('persona')->get_persona_carreras_desc($id['idpersona']);
if (isset($dato_persona_carreras)){
$this->get_relacion()->tabla('persona_carrera')->cargar_con_datos($dato_persona_carreras);
}
$dato_persona_inscripciones = $this->get_relacion()->tabla('persona')->get_persona_inscripciones($id['idpersona']);
if (isset($dato_persona_inscripciones)){
$this->get_relacion()->tabla('persona_inscripcion')->cargar_con_datos($dato_persona_inscripciones);
}
$this->set_pantalla('edicion');
}
Pero este método no nos ha completado la carga externa de las tablas, cuestión que se ha resuelto por codigo por ejemplo:
function evt__form_pers_carr__modificacion($registro)
{
$registro['nombrecarrera']=dt_carrera::get_nombre_carrera($registro['idcarrera']);
$registro['nombresede']=dt_sede::get_nombre_sede($registro['idsede']);
$registro['nombrefacultad']=dt_facultad::get_nombre_facultad($registro['idfacultad']);
$this->get_relacion()->tabla('persona_carrera')->set($registro);
$this->evt__form_pers_carr__cancelar();
}
Por ahí existe alguna otra forma de resolver esta situación que no nos hemos dado cuenta y por eso escribo o por ahí es algún problema con el método del datos_tabla.
segun entiendo la unica tabla que necesitaria tener una carga particular es la que pertenece a los datos censales.
Una cosa que se me ocurre es cargar toda la relacion como viene y luego resetear la tabla ‘persona_dato_censal’ y cargarla nuevamente usando el metodo cargar_con_datos (del persistidor !!)
De esa forma podrias tener el resto de las tablas cargadas automaticamente en lugar de tener que cargarlas a mano.
Con respecto a la carga de columnas externas, para que se actualicen esos datos deberias (como te digo mas arriba) utilizar el metodo del persistidor y no directamente el del datos_tabla.
Richard:
Buenos días, es como interpretaste de que solo la tabla de datos censales es la que tiene la particularidad de ser una bitácora pero tener que cargar solo un dato, miré en la documentación off-line para ver donde estaba el objeto persistidor que comentaste para cargar con datos y no encontré el método que mencionás dentro de toba_datos_relacion y toba_ap_relacion_db
, entonces probé con lo que encontré sería más o menos así.
pero al ir a la pantalla de edición larga un cartel de que tiene cargada con dos datos la tabla de persona_dato_censal (yo le puse la restricción en el datos_relacion de que sea un solo dato).
Por ahí no interpreté bien que es lo que debía hacer.
De todas maneras, si te esta dando ese error es porque es probable que $dato_censal tenga mas de un registro. Te fijaste cual es el contenido de la variable?
Richard:
Te cuento que probé lo que me propusiste y en
$this->get_relacion()->cargar($id);
está dando el error de que trae dos registros para una persona determinada. Esto se dió porque configuré en el datos relación a que la tabla persona_dato_censal tuviera como mínimo y máximo 1 fila aunque en la base de datos tenga más de una, luego cambié esto y si ejecutó todo, lo que si no me trajo algunas cargas externas que estaban seteadas a mano mediante sql en los métodos de la tabla persona.
Lo otro que pasó al modificar la cantidad de filas de la tabla en el datos_relación es que no muestró los campos del dato censal, pero era porque no estaba seteado el cursor, cuestión que después de ejecutar las lineas
$dato_censal = $this->get_relacion()->tabla('persona')->get_persona_dato_censal($id['idpersona']);
//Usa SQL? Si, usa sql y trae el último dato censal de la persona (lo verifiqué con ei_arbol($…), luego al momento de sincronizar testeo si es un dato válido para el año de inscripción generando un nuevo registro en la base (si corresponde a un año anterior) o modificando el mismo si es que es el dato censal para el año de inscripción de la persona.
$this->get_relacion()->tabla('persona_dato_censal')->resetear();
$this->get_relacion()->tabla('persona_dato_censal')->get_persistidor()->cargar_con_datos($dato_censal, false, true);
$this->get_relacion()->tabla('persona_dato_censal')->set_cursor(0);
// No se si está bien usado, para este caso que siempre trae un solo registro anduvo ok :)
$this->set_pantalla('edicion');
después de esto ya mostró los campos que trajo de la base de datos para la tabla persona_dato_censal, ahora me queda por ver el tema de la carga externa de las tablas, que hasta ahora era manejado a mano.
Luego en otro hilo preguntaré como manejar una cascada para llegar al país a partir de tener registrada a la localidad.
Más que respuesta, es una pregunta adicional para Richard o alguno de los muchachos que conoce a fondo el Toba:
¿No sería posible definir un DT para la tabla que debe devolver solo un registro, específicamente el último, indicándole el tipo de persistencia como ‘específico’ y allí escribir la consulta de carga utilizando ‘distinct on’.
Por ejemplo, para levantar el úntimo movimiento de alguien usando fechas como referencia sería:
select distinct on (docum) docum,fecha,dato3,dato4 from tabla order by docum,fecha desc
Hola! algo así he resuelto desde la misma consulta… SELECT…blablabla ORDER BY… LIMIT 1…
Te devuelve la primer tupla del resultado de la consulta (hay que ordenarla debidamente claro).
Ahhh… revisá la sintaxis del SELECT con el LIMIT porque no me acuerdo si el blablabla iba ahí o en otro lado!!! jejejeje (no la tengo a mano, pero alto así era).
Espero te sirva!