Buenas quisiera saber como cambiar la ruta de una tabla vinculada con un modulo o una función VDA

Tengo una aplicación y dos bases de datos

Que tienen las mismas tablas

Lo que quiero hacer es poder coger una y me cambie la ruta de las tablas vinculadas  cuando coja la otra base de datos me revincule a la base datos seleccionada

Gracias

1 respuesta

Respuesta
1

A ver si puedes adaptar este código de Emilio Sancha a tus necesidades:

@Base dividida: cambio de la ruta de la base datos servidor

si ya lo eh visto pero no lo entiendo del todo en mi caso mi base de datos no tiene password y no veo donde poner la ruta  de la base de datos real y donde poner los campos de las tablas vinculadas 

¿Cómo haces para abrir una u otra BD vinculada?

Te explico tengo una aplicación con formularios y informes que en un formulario

Me da a escoger entre dos empresas que son bases de datos diferentes pero con tablas iguales lo que quiero es escoger una y la aplicación pueda vincularce una una empresa y cuando vuelva a escoger otra empresa redirigir las vinculaciones a la otra base de datos

quiero crear un modulo que cuando haga click en una empresa me cambie la ruta 
a una base de datos en concreto y cuando la cambie me lo rediriga a la que yo le diga 

Ok,

1º/ copia este código en un módulo nuevo y guárdalo como mdlCodigos (o el nombre que prefieras):

'* Código original sacado de http://www.mvp-access.es/emilio/ y adpatado
'* ReVinculaTablas
'* Revincula las tablas remotas a la base de datos pasada como parámetro
'* Argumentos: strBaseDatos => ruta de la base de datos
'* strPassword => (opcional) contraseña de la base de datos
'* uso: ReVinculaTablas (miRuta & "\NombreBD.accdb")
'* ESH 28/08/04 16:30
'* ESH 12/08/08 17:25 incluyo la posibilidad de usar contraseñas
Function ReVinculaTablas(strBaseDatos As String, Optional strPassword As String) As Boolean
Dim i As Long, _
dbs As DAO.Database, _

miRuta as string 
On Error GoTo ReVinculaTablas_TratamientoErrores
' Verifico que la ruta de la base de datos remota es correcta
If Len(Dir(strBaseDatos)) = 0 Then
Call miMsg("No se encuentra la base de datos """ & strBaseDatos & """", 1)
GoTo ReVinculaTablas_Salir
End If
Set dbs = CurrentDb
For i = 0 To dbs.TableDefs.Count - 1
' Si dbs.TableDefs(i).connect no está vacío, es por que se trata de una tabla vinculada
If (dbs.TableDefs(i).Connect <> "") Then
' aplico la "nueva" ruta a la tabla vinculada
dbs.TableDefs(i).Connect = "MS Access;PWD=" & strPassword & ";DATABASE=" & strBaseDatos & ";"
' actualizo la conexión
dbs.TableDefs(i).RefreshLink
End If
Next i
' Confirmo la correcta ejecución
ReVinculaTablas = True
ReVinculaTablas_Salir:
Set dbs = Nothing
On Error GoTo 0
Exit Function
ReVinculaTablas_TratamientoErrores:
Select Case Err
Case 3024, 3055
MsgBox "No se encuentra la base de datos """ & strBaseDatos & """", vbInformation+vbOkOnly,"ERROR"
Case 3055, 3078, 3011 ' la tabla no pertenece a esta base de datos
Resume Next
Case Else
MsgBox "Error " & Err.Number & " en proc. ReVinculaTablas de mdlConfiguracion (" & Err.Description & ")", vbInformation+vbOkOnly,"ERROR"
End Select
Resume ReVinculaTablas_Salir
End Function

2º/ Imagino que escoges una u otra empresa por medio de botones. Supongo que tienes un botón que se llama cmdEmpA y otro cmdEmpB (Propiedades-> Otros ->Nombre)
En el código del botón cmdEmpA, le pones:

ReVinculaTablas (C:\MisDocumentos\EmpresaA.accdb")

Es decir, llamas a la función y le pasas como argumento la ruta completa, el nombre y la extensión de la BD de la empresa A.

3º/ Haces lo mismo con el otro botón, con la ruta, nombre y extension de la otra BD.

Se me coló un error:

Cambia esta línea:

Call miMsg("No se encuentra la base de datos """ & strBaseDatos & """", 1)

por esta otra.

MsgBox "No se encuentra la base de datos """ & strBaseDatos & """", vbInformation+vbOkOnly,"ERROR"

Como llamo a la función mira en el código del botón puse esto

Que es donde esta la base de datos de la empresa a

Option Compare Database
Option Explicit

Sub cambiarRuta_Click()
ReVinculaTablas (C:\Users\DYalta\Desktop\DATOS.mdb")
End Sub

Sub cambiarRuta_Click()
ReVinculaTablas ("C:\Users\DYalta\Desktop\DATOS.mdb")
End Sub

Te faltan las comillas al principio

Me da error en esa línea

Si, eso es un fallo al copiar-pegar el código

Quítale la línea en blanco, para que quede así:

Dim i As Long, _
dbs As DAO.Database, _
miRuta As String

Te adjunto un mini ejemplo:
http://filebig.net/files/vX5qHPgUZ2 

En este caso uso rutas relativas (Application. CurrentProject. Path), porque las tres BDs están en el mismo directorio, y si las mueves de carpeta, van a seguir funcionando.

Perfecto eres un crack! Muchas gracias tío te debo una

Perdona que te molestes una pregunta Sveinbjorn El Rojo es posible poner una variable que me saque el valor de una registro por ejemplo una tabla empresas que cuando selecciones una por ejemplo carpeta saque el valor c://documento/datos.accdb
y esta dirección sea igual a una variable carpeta

En este modulo

No te entendí muy bien, ¿podrías explicarte un poco más?

Si mira lo que pasa es que yo tengo este formulario

Cada vez que selecionno una hay una variable que guarda la ubicación de la base de datos

Y lo que yo quiero hacer es que cada vez que selecciono una empresa se rediriga las tablas vinculadas a la dirección de la base datos de la empresa había pensado en poner algo así

Y quiero guardar el valor de ese campo para ejecutarlo en esa función

¿[Lista]![Carpeta] a que hace referencia? 

ES UN FORMULARIO y dentro tengo un sub formulario que es una consulto 

se supone que cuando yo le doy click al registro le asigna  a la consulta 

Ok, puedes hacer esto:

En el módulo donde tienes la función RevinculaTablas, al principio, después del Option Explicit, declaras una variable pública:

Public dirCarpeta as String

Al hacerlo así, esa variable es accesible desde cualquier parte de tu BD.

Luego, en el código que tienes para hace click, tienes que asignarle el valor a la variable, añadiendo:

dirCarpeta=Forms("LISTA").Carpeta

Luego ya puedes llamar a la función desde cualquier parte, no te hace falta crear otra:

RevinculaTablas (dirCarpeta)

por que pones   Forms("LISTA").Carpeta

mira este es el formulario que coge los valores 

Forms("LISTA"). Carpeta es para asignar a la variable el valor del campo carpeta del formulario Lista. Pero como no tengo tu BD, no sé si es correcto o no.

Vamos a ver si entiendo como funciona tu sistema:

Tienes un formulario (de nombre ¿fselempresa lista?) Con un subformulario (de nombre ¿LISTA? ). Además en el formulario, tienes un cuadro de texto llamado CARPETA, que coje el valor del campo CARPETA de tu subformulario.

Luego tienes un botón (con el caption Vincular), que imagino que es donde haces la llamada a la función para vincular las tablas.

Si es así, no te hace falta ni crear la variable pública, bastaría con que al boton vincular le pongas este código:

RevinculaTablas (Me. Carpeta)

lo siento  pues tengo una consulta que de llama cempresa que es la que utilizo en
el formulario  fselempre lista que es el sub formulario de el formulario fsempresa

mira te mando mi bd http://filebig.net/files/ckKay2Ef2F 

Tengo un formulario principal que es fselempresa que tiene un sub formulario 
fselempresa lista que es una consulta que lo que hace es pedirte el nombre de la empresa y la carpeta que es la direciion donde se encuentra la bd  cada vez que yo hago click en el registro se mete a la subconsulta yo ese valor lo quiero meter como variable en la funcion 

A ver si así te vale, porque yo no lo puedo probar al no tener las BDs vinculadas

http://filebig.net/files/veVggVPDWZ 

Lo que hice fue en tu función nueva, asignarle el valor a la variable antes de revincular:

Option Compare Database
Option Explicit
'dirCarpeta = Forms("LISTA").CARPETA

'------------------------------------------------------------
' REDIRIGIR_BD_ANISOL
'
'------------------------------------------------------------
Function REDIRIGIR_BD_ANISOL()

'ReVinculaTablas ("C:\EinsGes\Test\DATOS.mdb")
dirCarpeta = [Formularios]![FSELEMPRESA]![LISTA]![CARPETA]
ReVinculaTablas (dirCarpeta)

End Function

Al tener la variable declarada como publica, te guardará ese valor mientras no le des otro, y lo puedes usar en cualquier código o macro

me sale esto 

¿Tu crees que me de guarde los valores cuando selecciono alguna empresa? En el formulario digo

Ni idea de a que se debe eso..

Otra idea:

Crea esta función en el módulo de la función Revincula:

Public Function fncCarpeta() As String

On error goto Salida

fncCarpeta=Nz([Formularios]![FSELEMPRESA]![LISTA]![CARPETA],"")

Exit Function

Salida:

fncCarpeta=""

End Function

Esta función en teoría te devuelve el valor del cuadro carpeta de tu formulario. La puedes usar para asignarle el valor a la variable ( dirCarpeta=fncCarpeta()) o usarla directamente con la otra función (RevinculaTablas(fncCarpeta())

En un formulario no puedes guardar valores. Lo que puedes hacer es crear una tabla con un solo campo, en el que vas guardando en cada momento el valor de la carpeta.

Claro por que en realidad en ese cuadro de texto se guarda la dirección de la empresa seleccionada

¿Estoy también me sacaría la información de la etiqueta?

dirCarpeta = Me.CARPETA.Value

Si, te valdría siempre q estés en el formulario, es decir, que pongas ese código en cualquier evento de un cuadro de texto, botón... De tu formulario. No te valdría si lo haces desde el subformulario, o desde otro formulario

si que raro me sale el mismo error 

una pregunta como hago para aumentar /datos.accdb 

por que eh estado viendo y ese campo solo me da esta ruta 
C:\EinsGes\Polisol\   y claro falta selecionar el archivo  

Tienes que añadirle:

& "\datos.accdb"

Ya sea al código o la macro.

Por ejemplo:

dirCarpeta = Me.CARPETA.Value & "\datos.accdb"

RevinculaTablas (dircarpeta & "\datos.accdb")

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas