Desvincular tablas vinculadas mediante código

4 envíos / 0 nuevos
Último envío
Cron
Imagen de Cron
Offline
última acción: Hace 9 horas 47 mins
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 8840
Desvincular tablas vinculadas mediante código

Hola

 

Tengo un problema en una rutina que estoy preparando.

Trabajo con un sistema de dos archivos: una base de datos servidor y un archivo access front end que actúa como cliente, con todas las rutinas, formularios, consultas, etc.

 

El caso es que necesito preparar algo que funcione a lo largo de los años, y cada año se le introducirá una hoja excel (por ejemplo del INE) desde la que importará datos.

Lo que quiero es que mi rutina valore una tabla, localice si existe el campo para el año en cuestión.

Si existe, canta un error. Si no existe, debe crear un campo para el año que le estamos introduciendo.

 

Y ahí está el problema.

Cuando ejecuto el cliente, este abre el servidor, ya que tiene todas sus tablas vinculadas.

Por lo tanto, cuando intento el método .Append para añadir un campo, Access me dice que tururú, que está bloqueado por otro usuario.

 

He intentado desvincular las tablas con el código siguiente:

For Each tbfSrc In CurrentDb.TableDefs

  If Left(tbfSrc.Name, 4) <> "MSys" Then

    CurrentDb.TableDefs.Delete (tbfSrc.Name)

    CurrentDb.TableDefs.Refresh

  End If

Next

 

 

Aun así, sigue cantando el error.

 

 

Este es el código:

 

Sub creacampo(ByVal fecha As String, ByVal ruta As String)

  Dim db As DAO.Database

  Dim td, tbfSrc As DAO.TableDef

  Dim fld As DAO.Field

  Dim flag As Boolean

  

'Desvincula las tablas provisionalmente y la cierra

For Each tbfSrc In CurrentDb.TableDefs

  If Left(tbfSrc.Name, 4) <> "MSys" Then

    CurrentDb.TableDefs.Delete (tbfSrc.Name)

    CurrentDb.TableDefs.Refresh

  End If

Next

 

 

'Abre el archivo de tablas en modo exclusivo

Set db = OpenDatabase(ruta, True)

Set td = db.TableDefs("Población")

'Establece el marcador a falso

flag = False

'recorre los campos para comprobar si ya se añadió el campo y establece verdadero si ya existe

For Each fldSrc In td.Fields

If fldSrc.Name = "Pob" & fecha Then

flag = True

End If

Next

'Si no existe el campo, lo crea

If Not flag Then

Set fld = td.CreateField("Pob" & fecha, dbLong)

td.Fields.Append fld                                          <------------------AQUÍ SALTA EL ERROR

End If

 

'volvemos a conectar la base de datos

Form_FPass.Cambiaruta (ruta)

'Liberamos memoria

db.Close

Set fld = Nothing

Set td = Nothing

Set db = Nothing

 

 

End Sub

 
 
Creo que lo que me falta es cerrar la base de datos, para lo que debo comprobar primero que está abierta. Y esto no lo sé hacer.
Pista: la variable "ruta" es del tipo "C:\bla bla\blablabla\basededatos\noséqué\nosécuántos.accdb" y se refiere a la base de datos que quiero cerrar.
 
 
Como siempre, agradecería la ayuda.
 
Un saludo
Cron
Imagen de Cron
Offline
última acción: Hace 9 horas 47 mins
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 8840
Re: Desvincular tablas vinculadas mediante código

He probado a sustituir el código para ejecutar una orden SQL, pero el problema es el mismo:

 

'Si no existe el campo, lo crea

If Not flag Then

    fieldname = "Pob" & fecha

    db.Execute "ALTER TABLE [Población] ADD COLUMN [" & fieldname & "] LONG", dbFailOnError

'Set fld = td.CreateField("Pob" & fecha, dbLong)

'td.Fields.Append fld

End If

 
pacomegia
Imagen de pacomegia
Offline
última acción: Hace 6 horas 29 mins
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntosadministrador
alta: 27/12/2006 - 23:26
Puntos: 7570
Re: Desvincular tablas vinculadas mediante código

Abrir la base de datos en modo exclusivo requiere que no haya nada en uso en la base de datos, pero tú sólo necesitas que no esté en uso la tabla donde vas a añadir el campo nuevo, que ya no está en uso porque la has desvinculado.

Esto te debería dar un error al abrir la base de datos, antes de ejecutar ninguna consulta ni actualización

prueba a abrir sin modo exclusivo

Set db = OpenDatabase(rutaDB,false) 

De hecho puedes añadir campos con la tabla vinculada siempre que no se esté utilizando

Acabo de probar a añadir campos con la base de datos del servidor abierta (pero sin abrir la tabla) y puedo hacerlo

 

¿tienes cargado algún formulario con esa tabla? 

¿has utilizado esa tabla en el código antes de intentar crear el campo?

¿hay algún otro usuario con la aplicación abierta?

 

yo no consigo reproducir tu error, a mí me permite añadir el campo sin desvincular la tabla

 

 

 

Data Tools Suite
datos y tablas con Excel

Cron
Imagen de Cron
Offline
última acción: Hace 9 horas 47 mins
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 8840
Re: Desvincular tablas vinculadas mediante código

Pues tienes razón, pero no me daba ningún error al abrirla. Es probable que si hubiera alguien más conectado sí se quejara, pero solo estaba yo mismo, y acababa de desvincular las tablas.

He probado sin modo exclusivo, pero me da el mismo problema.

Sin embargo, tu primera pregunta sobre el formulario ha dado en el clavo. Sí tengo cargado un formulario que tiene un objeto que presenta los datos de la tabla. Intentaré cerrarlo o simplemente desvincularlo antes de añadir nada.

 

Como siempre, tu respuesta sirve para hacerme abrir los ojos. Muchas gracias.

 

 

Un saludo