Está en la página 1de 4

Creacin de Aplicaciones multiusuario 2

Actualizar vnculos de las tablas


Una vez determinado que se ha roto un vnculo, como veamos en el captulo anterior, hay que buscar el nuevo emplazamiento de la base de datos de las tablas ubicada en el servidor. Se puede hacer manualmente, mediante el asistente de Access Administrador de tablas vinculadas que muestra un Archivo buscar. Pero esto es complicarle la vida al usuario, que tendr que ir a la Barra de mens y hacer todo el proceso manualmente. La mejor solucin es escribirlo en cdigo VBA para automatizar al mximo posible sta operacin. Actualizacin de los vnculos Para reparar el vnculo roto, tenemos que definir la informacin de conexin a las tablas remotas, empleando la nueva ubicacin y desencadenando luego el mtodo RefreshLink para volver a vincular la tabla.

Para poner en marcha sta funcin, y restablecer el vnculo roto hay que llamar a la funcin pasando tanto la nueva ruta de acceso como la tabla a vincular. Para ello escribimos el siguiente cdigo en un botn del formulario de inicio: Dim resultado as Bolean Resultado = refresca(Nombredelatabla,C:\Carpeta\Subcarpeta\Bases de datos en red.mdb)

Lo que hace el bucle For Each Next es recorrer las tablas una por una, coge su nombre y lo pasa a la base de datos externa para volver a crear el vnculo. De sta forma, nos aseguramos que todas las tablas tendrn el vnculo actualizado. Algo que debemos tener en cuenta cuando vinculamos tablas es que, aunque aparecen en la ventana de la base de datos, las tablas no residen realmente en la aplicacin. Dado que residen en la base de datos externa y no en la aplicacin, solamente notaremos que los vnculos estn rotos cuando abrimos la tabla , consulta o formulario basado en esa tabla.

Un ejemplo prctico completo


A continuacin vamos a exponer un ejemplo prctico para poder aplicarlo en nuestra aplicacin. Lo primero que debemos hacer es crear un formulario con tres botones y un cuadro de texto, como se indica en la figura.

A continuacin vamos a crear las funciones que harn funcionar todo este sistema. De forma esquemtica necesitamos los siguientes mdulos: Un mdulo que llamaremos mdTestVinculos Un mdulo que llamaremos mdDialogoAbrir Al final de la exposicin de los mdulos haremos un resumen del funcionamiento y dnde se utiliza cada mdulo. Empezaremos creando un mdulo en la Ventana de mdulos que llamaremos mdTestVinculos y que har una comprobacin de las tablas vinculadas. Para ello, copiar y pegar en dicho mdulo el siguiente cdigo: Option Compare Database Option Explicit Sub RefreshAllLinks(szNewPath As String) On Error Resume Next Dim db As Database, iCount As Integer Dim tblDef As TableDef Set db = CurrentDb() For iCount = 0 To db.TableDefs.Count - 1 Set tblDef = db.TableDefs(iCount) If tblDef.Connect <> "" Then tblDef.Connect = ";DATABASE=" & szNewPath Err = 0 tblDef.RefreshLink If Err <> 0 Then Call RelinkTables If Err = 3011 Then ' si no existe tabla MsgBox "El archivo no contiene la tabla requerida '" & tblDef.SourceTableName & "'", 16, "Refresh Error" ElseIf Err = 3024 Then ' no se encuentra MISDATOS.MDB MsgBox "No se ha encontrado la Base de datos!", 16, "Refresh Error" ElseIf Err = 3051 Then ' Acceso denegado MsgBox "El archivo no se puede abrir (debe ser readonly).", 16, "Refresh Error" ElseIf Err = 3027 Then ' MISDATOS.MDB es read-only MsgBox "Nos se pueden actualizar vinculos. El origin es read-only.", 16, "Refresh Error" End If Exit Sub End If End If Next iCount MsgBox "Todos los vinculos se han refrescado!", 64, "Refresco conseguido" Exit Sub End Sub Function RefreshTableLink(szTableName As String, szNewPath As String) As Boolean

On Error GoTo RefreshTableLinkErr Dim db As Database Set db = CurrentDb() db.TableDefs(szTableName).Connect = ";DATABASE=" & szNewPath & "" db.TableDefs(szTableName).RefreshLink RefreshTableLink = True Exit Function ' El refresco se ha realizado, devuelve True

RefreshTableLinkErr: RefreshTableLink = False ' Se encuentra un error, devueve False Exit Function End Function Function TestLink(szTableName As String) As Boolean On Error Resume Next Dim db As Database Dim rs As Recordset Set db = CurrentDb() Set rs = db.OpenRecordset(szTableName) If Err = 3024 Then ' No existe el vinculo, devuelve False TestLink = False ElseIf Err = 0 Then ' Existe el vinculo, devuelve True TestLink = True End If End Function