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
A ver si puedes adaptar este código de Emilio Sancha a tus necesidades:
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
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
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.
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
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í
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)
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
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.
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
- Compartir respuesta