setry2
06-02-2007, 12:50:26
Hola a todos,
Por falta de experiencia creo que me estoy dejando algo sin hacer. A ver si me podéis ayudar.
Estoy haciendo un programa con Delphi 5 sobre Access 97. Tengo 7 bases de datos access, una para cada año, 2000.mdb, 2001.mdb etc. Todas estas bd las conectaba al iniciar el programa, pero ahora quiero conectar el programa a la bd correspondiente según el año indicado en un combo. Al cambiar del año, en un dbgrid se muestra la info correspondiente a ese año.
El problema que tengo es que si selecciono 2007, muestra la info de 2007, y al cambiar a 2006, me sigue mostrando la info de 2007. Lo que hago cuando vario el año es desconectar la bd de 2007 y conectarle la de 2006, pero parece que no tengo algo en cuenta porque parece que mantiene la conexión con 2006. KeepConection está a false.
Este es el código. Os añado las propiedades de la bd para que veáis como la tengo configurada por si falla algo:
if dbContabilidad.Conected = true then
begin
dbContabilidad.Conected = false;
dbContabilidad.CloseDatasets;
dbContabilidad.Close;
end
dbContabilidad.params.add('DATABASE NAME=' + rutaBD); //Es la ruta a la bd segun el año
dbContabilidad.databasename := 'BDContabilidad';
dbContabilidad.drivername := 'MSACCESS';
dbContabilidad.exclusive := false;
dbContabilidad.HandleShared := false;
dbContabilidad.KeepConnection := false;
dbContabilidad.LoginPrompt := false;
dbContabilidad.Name := 'dbConta';
dbContabilidad.ReadOnly := false;
dbContabilidad.SessionName := 'Default';
dbContabilidad.Tag := 0;
dbContabilidad.TransIsolation := tiReadCommitted;
dbContabilidad.connected := true;
Luego ejecuto la qry que muestra los datos en el grid.
Como no conseguía que fuera he pensado crear la bd en ejecución cada vez que hacía la consulta a la bd. Pero de nuevo vuelvo a hacer algo mal, porque al seleccionar un nuevo año trato de liberar la anterior antes de crear la nueva pero no la encuentra:
He probado de dos formas:
if Assigned(dbConta) then FreeAndNil(dbConta), pero siempre me da falso.
y, por probar (un poco bruto), buscando el componente en la aplicación:
Al código anterior le añado: dbContabilidad := TDataBase.Create(self);
var dbContabilidadAux: TDataBase; //declaro.
dbContabilidadAux := Application.FindComponent('dbConta') as TDataBase;
if Assigned(dbContabilidadAux) then
begin
dbContabilidad.connected := false;
dbContabilidad.CloseDatasets;
dbContabilidad.Close;
freeandnil(dbContabilidad);
freeandnil(dbContabilidadAux)
end;
Pero no localizo el conponente. No se si lo estoy creando mal o que.
Otra opción que sí funciona es crear en mi bd tablas adjuntas al resto de bd y hacer la qry sobre ella, pero es justo lo que trato de evitar.
Bueno, un poco lioso, pero seguro que tiene que ser una tontería.
Gracias de antemano.
Por falta de experiencia creo que me estoy dejando algo sin hacer. A ver si me podéis ayudar.
Estoy haciendo un programa con Delphi 5 sobre Access 97. Tengo 7 bases de datos access, una para cada año, 2000.mdb, 2001.mdb etc. Todas estas bd las conectaba al iniciar el programa, pero ahora quiero conectar el programa a la bd correspondiente según el año indicado en un combo. Al cambiar del año, en un dbgrid se muestra la info correspondiente a ese año.
El problema que tengo es que si selecciono 2007, muestra la info de 2007, y al cambiar a 2006, me sigue mostrando la info de 2007. Lo que hago cuando vario el año es desconectar la bd de 2007 y conectarle la de 2006, pero parece que no tengo algo en cuenta porque parece que mantiene la conexión con 2006. KeepConection está a false.
Este es el código. Os añado las propiedades de la bd para que veáis como la tengo configurada por si falla algo:
if dbContabilidad.Conected = true then
begin
dbContabilidad.Conected = false;
dbContabilidad.CloseDatasets;
dbContabilidad.Close;
end
dbContabilidad.params.add('DATABASE NAME=' + rutaBD); //Es la ruta a la bd segun el año
dbContabilidad.databasename := 'BDContabilidad';
dbContabilidad.drivername := 'MSACCESS';
dbContabilidad.exclusive := false;
dbContabilidad.HandleShared := false;
dbContabilidad.KeepConnection := false;
dbContabilidad.LoginPrompt := false;
dbContabilidad.Name := 'dbConta';
dbContabilidad.ReadOnly := false;
dbContabilidad.SessionName := 'Default';
dbContabilidad.Tag := 0;
dbContabilidad.TransIsolation := tiReadCommitted;
dbContabilidad.connected := true;
Luego ejecuto la qry que muestra los datos en el grid.
Como no conseguía que fuera he pensado crear la bd en ejecución cada vez que hacía la consulta a la bd. Pero de nuevo vuelvo a hacer algo mal, porque al seleccionar un nuevo año trato de liberar la anterior antes de crear la nueva pero no la encuentra:
He probado de dos formas:
if Assigned(dbConta) then FreeAndNil(dbConta), pero siempre me da falso.
y, por probar (un poco bruto), buscando el componente en la aplicación:
Al código anterior le añado: dbContabilidad := TDataBase.Create(self);
var dbContabilidadAux: TDataBase; //declaro.
dbContabilidadAux := Application.FindComponent('dbConta') as TDataBase;
if Assigned(dbContabilidadAux) then
begin
dbContabilidad.connected := false;
dbContabilidad.CloseDatasets;
dbContabilidad.Close;
freeandnil(dbContabilidad);
freeandnil(dbContabilidadAux)
end;
Pero no localizo el conponente. No se si lo estoy creando mal o que.
Otra opción que sí funciona es crear en mi bd tablas adjuntas al resto de bd y hacer la qry sobre ella, pero es justo lo que trato de evitar.
Bueno, un poco lioso, pero seguro que tiene que ser una tontería.
Gracias de antemano.