BD en red

Hola a todos. Espero que alguien sepa de esto. Tengo una base de datos en red, realmente tengo dos bases de datos, una con los datos (tablas)que esta en el servidor, y otra con los objetos (Formularios, informes, consultas)
Cada usuario tiene en modo local la base de datos con los objetos, y en la pestaña tablas tiene vinculadas todas las tablas de la base de datos que hay en el servidor.
Con esto, cuando tengo que modificar los objetos, los usuarios siguen introduciendo datos y no hay problemas. Son 8 usuarios en total, pero claro, cuando les actualizo a cada uno de forma local la base de datos, tengo que ir uno a uno para vincular de nuevo los datos, ya que si los dejo como están dan un error. Yo creo que es debido a que todo el disco duro del servidor no está compartido, solo algunas carpetas que es donde se sitúa la BD de tablas.
He intentado que cada vez que se abra la BD de objetos se vincule directamente los datos, pero lo he intentado con una macro y lo único que consigo es abrir el cuadro de dialogo de vincular, dejando al usuario toda la responsabilidad.
Se que existe algún método utilizando las API, pero no se como hacerlo, ¿Se te ocurre alguna forma?
Gracias
Respuesta
1
Cuando vinculas tablas en access, vinculas una unidad, un directorio y un fichero concreto. Si cambias de unidad (por ejemplo un usuario el disco del servidor asignado a Z:, otro a V:, y tu que los cambias tiene C:) el vinculo no funciona.
¿Para los 8 usuarios y para ti que cambias los formularios la unidad de red del servidor tiene el mismo nombre?
En cuanto a la API.. hay un función que reconecta los vínculos. La debes ejecutar al abrir el mdb.
Esta función supone que el fichero de datos y programas se encuentran siempre en el mismo directorio. Así puede mover los dos ficheros a unidades o carpetas diferentes.
¡Ojo ! No sirve en tu caso si los usuarios tienen distintos nombre de unidad para el disco de red donde se encuentran los datos.
Function reconecta()
Dim dbActual As Database
Dim i As Integer, j As Integer
Dim cPathDB, cFuentePath, cFuente, cExaminar
Set dbActual = DBEngine.Workspaces(0).Databases(0)
cPathDB = mPathDirSplit(dbActual.Name)
'recorrer todas las tablas
For i = 0 To dbActual.TableDefs.Count - 1
If dbActual.TableDefs(i).Connect <> "" Then
cExaminar = Mid(dbActual.TableDefs(i).Connect, 11)
cFuentePath = mPathDirSplit(cExaminar)
cFuente = mFileSplit(cExaminar)
If cFuentePath <> cPathDB Then
dbActual.TableDefs(i).Connect = ";Database=" + cPathDB + cFuente
dbActual.TableDefs(i).RefreshLink
End If
End If
Next i
Set dbActual = Nothing
End Function
Function mPathDirSplit(ByVal cFile As String)
'extrae el path de un nombre de fichero
Dim i As Integer
For i = Len(cFile) To 1 Step -1
If InStr(1, Chr(92) & ":", Mid(cFile, i, 1)) <> 0 Then
mPathDirSplit = Mid(cFile, 1, i)
Exit Function
End If
Next i
mPathDirSplit = ""
End Function
La unidad se llama igual para todos, ya que pensé en ello, lo que no se es como utilizar lo que me comentas, donde pongo la ruta de acceso, el nombre de las tablas, etc... Como imaginarás tengo poca idea de programar.
Un abrazo
Tienes dos opciones:
- Si pones los datos y el programa en la misma unidad y directorio no tienes que cambiar nada del código.
- Si mantienes los dos separados tienes que poner donde pone:
cPathDB = mPathDirSplit(dbActual.Name)
cPathDB = NOMBRE_DEL_PATH_DE_LOS DATOS
El código lo copias en un modulo nuevo (llámale inicio).
Para que se ejecute, edita la macro AUTOEXEC (si no existe la creas), con
"ejecutar codigo -" reconecta()
Te adjunto el codigo completo..
Function reconecta()
Dim dbActual As Database
Dim i As Integer, j As Integer
Dim cPathDB, cFuentePath, cFuente, cExaminar
Set dbActual = DBEngine.Workspaces(0).Databases(0)
cPathDB = mPathDirSplit(dbActual.Name)
'recorrer todas las tablas
For i = 0 To dbActual.TableDefs.Count - 1
If dbActual.TableDefs(i).Connect <> "" Then
cExaminar = Mid(dbActual.TableDefs(i).Connect, 11)
cFuentePath = mPathDirSplit(cExaminar)
cFuente = mFileSplit(cExaminar)
If cFuentePath <> cPathDB Then
dbActual.TableDefs(i).Connect = ";Database=" + cPathDB + cFuente
dbActual.TableDefs(i).RefreshLink
End If
End If
Next i
Set dbActual = Nothing
End Function
Function mPathDirSplit(ByVal cFile As String)
'extrae el path de un nombre de fichero
Dim i As Integer
For i = Len(cFile) To 1 Step -1
If InStr(1, Chr(92) & ":", Mid(cFile, i, 1)) <> 0 Then
mPathDirSplit = Mid(cFile, 1, i)
Exit Function
End If
Next i
mPathDirSplit = ""
End Function
Function mPathSplit(ByVal cFile As String)
'extrae el path de un nombre de fichero
Dim i As Integer
'quitar la unidad si la tuviera
If Mid(cFile, 2, 1) = ":" Then
cFile = Mid(cFile, 3)
End If
For i = Len(cFile) To 1 Step -1
If Mid(cFile, i, 1) = Chr(92) Then
mPathSplit = Mid(cFile, 1, i)
Exit Function
End If
Next i
mPathSplit = ""
End Function
Function mFileSplit(ByVal cFile As String)
'extrae el path de un nombre de fichero
Dim i As Integer
For i = Len(cFile) To 1 Step -1
If InStr(1, Chr(92) & ":", Mid(cFile, i, 1)) <> 0 Then
mFileSplit = Mid(cFile, i + 1)
Exit Function
End If
Next i
mFileSplit = cFile
End Function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas