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
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
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
------
Ya sé Excel, pero necesito más.
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