Crear Vinculo/Actualizar tablas desde base de datos externas. Access VBA

Me comunico con ustedes ya que deseo hacer una vinculación desde una base de datos a otra, la cuestión es que puedo hacer la vinculación en mi pc, pero a los compañeros de la oficina no le funciona ya que la dirección del archivo es distinta, lo que quiero hacer es en este caso eliminar la tabla vinculada y volverla a vincular cada vez que se abra la base de datos de la siguiente manera:

Private Sub Command107_Click()
    Dim db As DAO.Database
    Dim CRuta As String
    Dim Tabla As TableDef
    Set db = CurrentDb
    CRuta = ";DATABASE=" & Replace(Application.CurrentProject.Path, "Carpeta del equipo Equipo ICOL\Proyecto - Estructura de Costo", "Sales\Project Summary Log\Project Summary Log2.accdb")
    MsgBox CRuta
    'db.TableDefs.Delete ("tboportunidades")
    Tabla.Connect = CRuta
End Sub

pero me saltan ciertos errores,  y me pregunto, si hago un link con esa tabla y mi base de datos, al borrarla y agregarla nuevamente se mantendria ese link?

1 Respuesta

Respuesta
2

No termino de ver clara tu pregunta, pero te comento que si vas a la página de Emilio Sancha, en la sección de descargas (http://www.mvp-access.es/emilio/Access/Descargas.asp), prácticamente todos sus ejemplos ( trabajan con tablas vinculadas a la base de datos Neptuno, y en todos ellos primero comprueba que el vínculo sea correcto, y en caso de no serlo, revincula las tablas con Neptuno.

Yo creo que es una solución para tu problema. Tendrías que usar los códigos del módulo mdlRevincula (o algo parecido)

En la web del Búho también tienes códigos para comprobar y revincular tablas: http://www.mvp-access.es/buho/Buscadorb.asp y busca "vincular"

Lo que no entiendo es como ejecutar el comando como sub publica, y porque no privada?

Y me parece muy complicado todo, lo único que necesito es crear el vinculo nuevamente cada vez

Pues no le veo la complicación...

.- Copias el módulo a tu BD (puedes personalizar los avisos si lo consideras conveniente)

.- En el evento "al cargar" del primer formulario (o en el código de un botón...) pones las líneas para comprobar y/o revincular:

If Not ComprobarVinculacion("NombreUnaTabla") Then ReVinculaTablas

Si la vinculación no es correcta, te saldrá una ventana para seleccionar la BD a la que vincularte y listo.

Ejecutar un procedimiento Private no es diferente a ejecutar uno Public, la única diferencia qes que uno Public lo puedes llamar desde cualquier parte y uno Private solo desde el módulo en el que está.

Si lo quieres simplificar más:

Private Sub Command107_Click()
    Dim CRuta As String
    Dim Tabla As TableDef
    CRuta = ";DATABASE=D:\\Sales\Project Summary Log\Project Summary Log2.accdb;" 'Aquí la ruta a la BD a vincular
    Tabla.Connect = CRuta
    Tabla.RefreshLink
End Sub

¿Y el nombre de la tabla donde iría?

Private Sub Command107_Click()
    Dim CRuta As String
    Dim Tabla As TableDef
    CRuta = ";DATABASE=D:\Dropbox (Equipo ICOL)\Carpeta del equipo Equipo ICOL\Proyecto - Estructura de Costo\Estructura de Costos35.accdb;" & "D:\Dropbox (Equipo ICOL)\Sales\Project Summary Log\Project Summary Log2.accdb"
    Tabla.Connect = CRuta
    Tabla.RefreshLink
End Sub

Despues de ;DATABASE= la tabla base y despues la que quiero vincular no?

Te falta un ciclo que recorra todas las tablas:

For Each Tabla In CurrentDb.TableDefs
    If (Tabla.Connect <> vbNullString) Then
       Tabla.Connect = CRuta
       Tabla.RefreshLink
    End If
Next Tabla

O bien, usar la Propiedad Name de Tabla para elegir la que quieres revincular.

For Each Tabla In CurrentDb.TableDefs
    If (Tabla.Connect <> vbNullString) And Tabla.Name="TablaX" Then
       Tabla.Connect = CRuta
       Tabla.RefreshLink
    End If
Next Tabla

La cuestión es que en la pc de mis compañeros de trabajos tienen asignado una letra distinta al didoco duro, la mía empieza con "D", los de ellos empiezan con "C" (cambiar nombre del disco duro no me parece una opción)

Esa seria la tabla que se encuentra vinculada con mi base de datos, "D:\Dorpbox.......", al hacer el botón que me ayudaste a realizar no noto ningún cambio, dado a que el vinculo sigue bien, la cuestión es al hacer click en el botón para modificar ese "D" por un "C", en la dirección y que se mantenga todo igual me muestra este error:

Ese error se da dado a que en esa PC la dirección de la base da datos es idéntica solo que con DE en lugar de C,

Lo trate de hacer con el siguiente código:

Private Sub Command107_Click()
Dim CRuta As String
Dim Tabla As TableDef
CRuta = ";DATABASE=" & Replace(Application.CurrentProject.Path, "Carpeta del equipo Equipo ICOL\Proyecto - Estructura de Costo", "Sales\Project Summary Log\Project Summary Log2.accdb;")
MsgBox CRuta
For Each Tabla In CurrentDb.TableDefs
    If (Tabla.Connect <> vbNullString) And Tabla.Name = "tbOportunidades" Then
       Tabla.Connect = CRuta
       Tabla.RefreshLink
    End If
Next Tabla
End Sub

Espèro pueda haberme explicado mejor.

Saludos

Que la BD a la que te vinculas esté en C, D o Z es indiferente mientras la ruta que le indiques sea la correcta... Ese error te dice que la ruta está mal (yo desconozco dónde...), ya sea porque está mal escrita o la BD no esta ahí...

Si en el formulario pones, en el botón:

Private Sub Command107_Click()
    Dim CRuta As String
    Dim Tabla As TableDef
    CRuta = ";DATABASE=D:\Dropbox (Equipo ICOL)\Sales\Project Summary Log\Project Summary Log2.accdb"
    For Each Tabla In CurrentDb.TableDefs
       If (Tabla.Connect <> vbNullString) And Tabla.Name = "tbOportunidades" Then
          Tabla.Connect = CRuta
          Tabla.RefreshLink
       End If
   Next Tabla
End Sub

Al ejecutarlo en el PC de tu compañero la tabla se vinculará a la BD  D:\Dropbox (Equipo ICOL)\Sales\Project Summary Log\Project Summary Log2.accdb. Obviamente, si ejecutas el código en tu PC, no te funcionará, porque la BD con la tabla la tienes en otro sitio.

A todo esto, necesitarías otro botón para volver a vincularla a la tabla de tu PC, con el mismo código, pero cmabiando la ruta y nombre de la BD

¡Gracias! solucionado!!!!! parcialmente jejeej lo logre hacer de la siguiente manera: 

Private Sub Form_Load()
    Dim CRuta As String
    Dim Tabla As TableDef
    CRuta = ";DATABASE=" & Replace(Application.CurrentProject.Path, "Carpeta del equipo Equipo ICOL\Proyecto - Estructura de Costo", "Sales\Project Summary Log\Project Summary Log.accdb")
    For Each Tabla In CurrentDb.TableDefs
       If (Tabla.Connect <> vbNullString) And Tabla.Name = "tbMoneda" Then
          Tabla.Connect = CRuta
          Tabla.RefreshLink
       End If
   Next Tabla
End Sub

el evento se hace al cargar el formulario principal de la basae de datos, y actualiza la tabla a la direccion de la carpeta donde se cuentre al remplazar parte de la ruta del (Y) me funciona perfecto, la cuestion es que con la tabla tb oportunidades me salta un error, quien sabe que pasara, seguire revisando. un millon de gracias 

Me di cuenta que es como un problema con una variable, dado a que me muestra un problema con un link que ya no estoy usando: 

COmo ves dice que no es una ruta de acceso valida pero ya no estoy usando "project sumary log 2.Acccdb" eese valor lo asigne hace un tiempo. este error no ocurre si hago lo mismo con otra tabla de la otra base de datos

Eso te pasa porque no actualizas los vínculos de todas las tablas, solo el de la que se llama tbMoneda

No no, puedo tener todas las tablas de la otra base de datos pero al agregar tbOportunidades salta ese error: 

(en esta imagen hace la actualizacion perfectamente desde otra pc) me agarra la direccion donde esta perfectamente, pero al agregar la tabla tboportunidades: 

(esto desde la misma pc sin) solamente al agregar esa tabla nisiquiera me actualiza la ruta manualmente agregandola desde esa pc) :S 

alguna idea?

    Dim CRuta1 As String
    Dim Tabla1 As TableDef
    CRuta1 = ";DATABASE=" & Replace(Application.CurrentProject.Path, "Carpeta del equipo Equipo ICOL\Proyecto - Estructura de Costo", "Sales\Project Summary Log\Project Summary Log.accdb")
    For Each Tabla1 In CurrentDb.TableDefs
       If (Tabla1.Connect <> vbNullString) Then
       'And Tabla1.Name = "tbOportunidadesProveedores" Then
          Tabla1.Connect = CRuta1
          Tabla1.RefreshLink
       End If
   Next Tabla1

ese es el codigo utilizado, saludos

Pues ni idea, lo siento...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas