Access - revincular tablas desde bases de datos

 
Vista:
sin imagen de perfil

revincular tablas desde bases de datos

Publicado por carlos (46 intervenciones) el 15/07/2023 23:04:10
Hola, soy aprendiz de programación en Access, estoy haciendo un programa y por seguridad oculto las bases de datos. Preví la posibilidad de que el Font-end se conecte a varias back-end según se necesite datos de otros años pero al borrar tablas y vincular nuevamente se pierde el ocultado de las mismas. Buscando en internet encontré un ejemplo que lo hace pero solo si está ubicada en C:\ y este ejemplo se adapta a lo que necesito solo que al tratar de hacerlo e estando ubicadas en D:\ me da error y necesito ayuda para resolverlo

El código
Private Sub Form_Load()
Dim strBaseDatos As String

Me.lstAños.RowSource = ""

' establezco el directorio activo
ChDir CurrentProject.Path & "\"
' recorro en un bucle las bases de datos "*Datos*" del directorio
strBaseDatos = Dir("*.mdb")
Do While Not strBaseDatos = ""
' selecciono los archivos que cumplan las condiciones necesarias
If InStr(strBaseDatos, "BD") <> 0 And InStr(strBaseDatos, "Datos") <> 0 Then
' inserto en el cuadro combinado los años y correspondientes bases de datos (en columna oculta)
Me.lstAños.AddItem "Año " & Mid(strBaseDatos, InStr(strBaseDatos, ".") - 4, 4) & ";" & strBaseDatos
End If
strBaseDatos = Dir
Loop

' selecciono el año actualmente vinculado, para ello lo extraigo de la actual ruta
strBaseDatos = CurrentDb.TableDefs(0).Connect
Me.lstAños = "Año " & Mid(strBaseDatos, InStr(strBaseDatos, ".") - 4, 4)

'AjustarTamaño Me

'DoCmd.OpenForm "frmINFO", , , , , acDialog
End Sub ' Form_Load


Private Sub lstAños_AfterUpdate()
' al seleccionar el año, revinculo las tablas.
ReVinculaTablas Me.lstAños.Column(1)
End Sub ' lstAños_AfterUpdate


Tiene un modulo también

'*******************************************************************************
'* ReVinculaTablas
'* recorro las distintas tablas de la base de datos revinculandolas a la ruta
'* indicada
'* Argumentos: strBDRemota => ruta de la base de datos remota
'* uso: ReVinculaTablas "48-DatosAño2005.mdb"
'* ESH 30/04/06 12:16
'*******************************************************************************

Public Function ReVinculaTablas(strBDRemota As String)
Dim i As Long, _
dbs As DAO.Database

On Error GoTo ReVinculaTablas_TratamientoErrores

Set dbs = CurrentDb

For i = 0 To dbs.TableDefs.Count - 1
' si dbs.TableDefs(i).connect no está vacio, es por que se trata de una tabla vinculada
If (dbs.TableDefs(i).Connect <> "") Then
' así pues asigno la "nueva" ruta a la tabla vinculada
dbs.TableDefs(i).Connect = ";DATABASE=" & strBDRemota & ";"
dbs.TableDefs(i).RefreshLink
End If
Next i

ReVinculaTablas_Salir:
Set dbs = Nothing
On Error GoTo 0
Exit Function

ReVinculaTablas_TratamientoErrores:
If Err.Number = 3024 Or Err.Number = 3078 Or Err.Number = 3011 Then
MsgBox "La base de datos " & strBDRemota & vbCrLf & CurrentProject.Path, vbCritical + vbOKOnly, "ATENCION"
Else
MsgBox "Error " & Err.Number & " en proc. ReVinculaTablas de Módulo mdlGeneral (" & Err.Description & ")", vbOKOnly + vbCritical
End If
GoTo ReVinculaTablas_Salir

End Function ' ReVinculaTablas

En el formulario ve las bases de datos pero no las revincula


Sin-titulo2
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

revincular tablas desde bases de datos

Publicado por carlos (46 intervenciones) el 15/07/2023 23:33:00
omití decir que había hecho estos cambios en el código

Private Sub Form_Load()
Dim strBaseDatos As String

Me.lstAños.RowSource = ""

' establezco el directorio activo
ChDir "D:\RevinculandoTablas\"
' recorro en un bucle las bases de datos "*Datos*" del directorio
strBaseDatos = Dir("D:\RevinculandoTablas\*.mdb")
Do While Not strBaseDatos = ""
' selecciono los archivos que cumplan las condiciones necesarias
If InStr(strBaseDatos, "48") <> 0 And InStr(strBaseDatos, "Datos") <> 0 Then
' inserto en el cuadro combinado los años y correspondientes bases de datos (en columna oculta)
Me.lstAños.AddItem "Año " & Mid(strBaseDatos, InStr(strBaseDatos, ".") - 4, 4) & ";" & strBaseDatos
End If
strBaseDatos = Dir
Loop

' selecciono el año actualmente vinculado, para ello lo extraigo de la actual ruta
'strBaseDatos = CurrentDb.TableDefs(0).Connect
'Me.lstAños = "Año " & Mid(strBaseDatos, InStr(strBaseDatos, ".") - 4, 4)

AjustarTamaño Me

'DoCmd.OpenForm "frmINFO", , , , , acDialog
End Sub ' Form_Load
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

revincular tablas desde bases de datos

Publicado por carlos (46 intervenciones) el 16/07/2023 02:14:31
Necesito la ayuda, por favor, hay cosas que he ido aprendiendo adaptando ejemplos a mis necesidades
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Joan
Val: 414
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

revincular tablas desde bases de datos

Publicado por Joan (91 intervenciones) el 16/07/2023 10:12:04
Hola,

Si lo que te interesa es ocultar las tablas, pon un password en el backend, que solo se puedan abrir introduciendo un password.

1
dbs.TableDefs(i).Connect = ";DATABASE=" & strBDRemota & ";PWD=Mipasswordr" & ";"

Un saludo,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

revincular tablas desde bases de datos

Publicado por carlos (46 intervenciones) el 16/07/2023 15:06:23
Saludos amigo, es buena solución solo que para ello debo lograr revincular los datos que es lo que no he podido hacer hasta ahora porque en alguna parte de del código se para el proceso y da el error que puse en la imagen, solo se hace si los datos y la aplicación está en C:\ estado en D:\ es un problema
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

revincular tablas desde bases de datos

Publicado por carlos (46 intervenciones) el 16/07/2023 15:06:58
Saludos amigo, es buena solución solo que para ello debo lograr revincular los datos que es lo que no he podido hacer hasta ahora porque en alguna parte de del código se para el proceso y da el error que puse en la imagen, solo se hace si los datos y la aplicación está en C:\ estado en D:\ es un problema
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Joan
Val: 414
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

revincular tablas desde bases de datos

Publicado por Joan (91 intervenciones) el 17/07/2023 10:28:02
Hola,

Omite la parte del tratamiento de errores a ver en qué línea del código te marca el error.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

revincular tablas desde bases de datos

Publicado por carlos (46 intervenciones) el 17/07/2023 14:13:44
el error lo da aquí

dbs.TableDefs(i).RefreshLink

sigue buscando un camino a C:\

No se puede encontrar el archivo
'C:\Users\ECONLAPTOP\Documents\BDSGRv2.mdb\'.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Joan
Val: 414
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

revincular tablas desde bases de datos

Publicado por Joan (91 intervenciones) el 17/07/2023 15:37:10
En C:\Users\ECONLAPTOP\Documents\BDSGRv2.mdb\, te sobra la barra invertida al final por eso no lo encuentra.

Escribe directamente la ruta: C:\Users\ECONLAPTOP\Documents\BDSGRv2.mdb al re vincular las tablas, si te lo revincula es que tienes mal la parte en la que introduces la ruta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

revincular tablas desde bases de datos

Publicado por carlos (46 intervenciones) el 17/07/2023 20:32:45
amigo del tema yo expliqué que esta aplicación que estoy tomando como referencia esta programada para que trabaje en C:, si se usa desde ahí no hay problemas, yo la copie en D: para usar ese ejemplo después en mi BD, y da todos los problemas que le he ido diciendo, antes de cambiar estas líneas

' establezco el directorio activo
ChDir CurrentProject.Path & "\"
' recorro en un bucle las bases de datos "*Datos*" del directorio
strBaseDatos = Dir("*.mdb")

por esto

' establezco el directorio activo
ChDir "D:\RevinculandoTablas\"
' recorro en un bucle las bases de datos "*Datos*" del directorio
strBaseDatos = Dir("D:\RevinculandoTablas\*.mdb")


no me mostraba ni los años en el formurario
form


luego, al hacer el cambio en las líneas
form2


pero al tratar de revincular me da este error
Sin-titulo2

usted me dijo
Omite la parte del tratamiento de errores a ver en qué línea del código te marca el error.

y entonces, omitiendo el tratamiento de errores en el módulo da esto
modulo

el error lo da en el módulo, en la la línea
dbs.TableDefs(i).RefreshLink

que es por ello le decía que aún busca en C:

gracias por toda la ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

revincular tablas desde bases de datos

Publicado por carlos (46 intervenciones) el 17/07/2023 21:06:49
hice una prueba modificando esta línea del módulo

dbs.TableDefs(i).Connect = ";DATABASE=" & "D:\RevinculandoTablas\48-DatosAño2005.mdb" & ";"

y si le pongo

dbs.TableDefs(i).Connect = ";DATABASE=" & "D:\RevinculandoTablas\48-DatosAño2006.mdb" & ";"

y lo que necesito es que cambien según se selecciones en el formulario, el año que se seleccione

esta es la línea original

dbs.TableDefs(i).Connect = ";DATABASE=" & strBDRemota & ";"

la función está en los primeros mensajes
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Joan
Val: 414
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

revincular tablas desde bases de datos

Publicado por Joan (91 intervenciones) el 18/07/2023 15:02:38
No entiendo:

hice una prueba modificando esta línea del módulo

dbs.TableDefs(i).Connect = ";DATABASE=" & "D:\RevinculandoTablas\48-DatosAño2005.mdb" & ";"

y si le pongo

dbs.TableDefs(i).Connect = ";DATABASE=" & "D:\RevinculandoTablas\48-DatosAño2006.mdb" & ";"


esto te funciona? Poniendo la ruta absoluta?

Ya sé que quieres seleccionar la tabla, pero es para saber si la parte de:

ChDir "D:\RevinculandoTablas\"
' recorro en un bucle las bases de datos "*Datos*" del directorio
strBaseDatos = Dir("D:\RevinculandoTablas\*.mdb")


es correcta, si te vincula la tabla indicando la ruta completa tienes posiblemente ahí el error.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

revincular tablas desde bases de datos

Publicado por carlos (46 intervenciones) el 18/07/2023 17:58:27
te voy a enviar la base de datos que estoy tratando de modificar para que trabaje desde D:, la original solo copiándola en C: trabajaba bien, estoy tratando de modificar este ejemplo para luego llevarlo a mi BD

gracias por todo amigo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Joan
Val: 414
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

revincular tablas desde bases de datos

Publicado por Joan (91 intervenciones) el 19/07/2023 11:58:21
Hola,

El codigo quedaría así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Option Compare Database
Option Explicit
 
 
Private Sub cboAño_Click()
End Sub        ' cboAño_Click
 
 
Private Sub Form_Load()
Dim strBaseDatos As String
 
Me.lstAños.RowSource = ""
 
' establezco el directorio activo
ChDir "D:\RevinculandoTablas\"
' recorro en un bucle las bases de datos "*Datos*" del directorio
strBaseDatos = Dir("D:\RevinculandoTablas\*.mdb")
Do While Not strBaseDatos = ""
' selecciono los archivos que cumplan las condiciones necesarias
If InStr(strBaseDatos, "48") <> 0 And InStr(strBaseDatos, "Datos") <> 0 Then
' inserto en el cuadro combinado los años y correspondientes bases de datos (en columna oculta)
Me.lstAños.AddItem "Año " & Mid(strBaseDatos, InStr(strBaseDatos, ".") - 4, 4) & ";" & strBaseDatos
End If
strBaseDatos = Dir
Loop
 
 'selecciono el año actualmente vinculado, para ello lo extraigo de la actual ruta
strBaseDatos = CurrentDb.TableDefs(0).Connect
Me.lstAños = "Año " & Mid(strBaseDatos, InStr(strBaseDatos, ".") - 4, 4)
 
AjustarTamaño Me
 
'DoCmd.OpenForm "frmINFO", , , , , acDialog
End Sub ' Form_Load
 
Private Sub lstAños_AfterUpdate()
' al seleccionar el año, revinculo las tablas.
ReVinculaTablas Me.lstAños.Column(1)
End Sub        ' lstAños_AfterUpdate

------------------------------------------------------------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
Option Compare Database
Option Explicit
 
 
'*******************************************************************************
'* AjustarTamaño
'* Ajusta el tamaño del formulario pasado como parámetro
'* Argumentos: frmFormulario => Formulario llamante
'* uso: AjustarTamaño Me
'* ESH 06/03/05 12:25
'* ESH 08/10/05 19:50 incluyo el alto de las distintas secciones
'* ESH 08/03/06 18:15 me aseguro de ajustar la altura solo en los formularios
'*                    simples
'*******************************************************************************
 
Public Sub AjustarTamaño(frmFormulario As Form)
 
Dim i As Long
 
On Error GoTo AjustarTamaño_TratamientoErrores
 
' ajusto el ancho del formulario teniendo en cuenta si tiene o no selector de registros
If Not frmFormulario.RecordSelectors Then
    frmFormulario.InsideWidth = frmFormulario.Width
Else
    frmFormulario.InsideWidth = frmFormulario.Width + 250
End If
 
' si se abre en vista formulario simple
If frmFormulario.DefaultView = 0 Then
   ' ajusto el alto incluyendo las distintas secciones, encabezado, pie, grupos...
   ' como no sé el número de secciones del formulario, me salgo al producirse un error
   frmFormulario.InsideHeight = 0
   For i = 0 To 100
      frmFormulario.InsideHeight = frmFormulario.InsideHeight + frmFormulario.Section(i).Height
   Next
End If
 
AjustarTamaño_Salir:
   DoCmd.Restore
   On Error GoTo 0
   Exit Sub
 
AjustarTamaño_TratamientoErrores:
   If Not Err = 2462 Then  ' "El número de sección que introdujo no es válido."
      MsgBox "Error " & Err.Number & " en proc.: AjustarTamaño de Módulo: Módulo1 (" & Err.Description & ")"
   End If
   Resume AjustarTamaño_Salir
End Sub         ' AjustarTamaño
 
 
'*******************************************************************************
'* ReVinculaTablas
'* recorro las distintas tablas de la base de datos revinculandolas a la ruta
'* indicada
'* Argumentos: strBDRemota => ruta de la base de datos remota
'* uso: ReVinculaTablas "48-DatosAño2005.mdb"
'* ESH 30/04/06 12:16
'*******************************************************************************
 
Public Function ReVinculaTablas(strBDRemota As String)
Dim i As Long, _
    dbs As DAO.Database
 
On Error GoTo ReVinculaTablas_TratamientoErrores
 
Set dbs = CurrentDb
 
For i = 0 To dbs.TableDefs.Count - 1
   ' si dbs.TableDefs(i).connect no está vacio, es por que se trata de una tabla vinculada
   If (dbs.TableDefs(i).Connect <> "") Then
      ' así pues asigno la "nueva" ruta a la tabla vinculada
      dbs.TableDefs(i).Connect = ";DATABASE=" & CurrentProject.Path & "\" & strBDRemota & ";"
      dbs.TableDefs(i).RefreshLink
   End If
Next i
 
ReVinculaTablas_Salir:
Set dbs = Nothing
On Error GoTo 0
Exit Function
 
ReVinculaTablas_TratamientoErrores:
If Err.Number = 3024 Or Err.Number = 3078 Or Err.Number = 3011 Then
   MsgBox "La base de datos " & strBDRemota & vbCrLf & CurrentProject.Path, vbCritical + vbOKOnly, "ATENCION"
Else
   MsgBox "Error " & Err.Number & " en proc. ReVinculaTablas de Módulo mdlGeneral (" & Err.Description & ")", vbOKOnly + vbCritical
End If
GoTo ReVinculaTablas_Salir
 
End Function    ' ReVinculaTablas

le has de indicar donde está con CurrentProject.Path & "\" & strBDRemota:

dbs.TableDefs(i).Connect = ";DATABASE=" & CurrentProject.Path & "\" & strBDRemota & ";"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

revincular tablas desde bases de datos

Publicado por carlos (46 intervenciones) el 19/07/2023 14:03:40
amigo, disculpa, funciona bien lo que olvidé decirte que las bd tienen contraseña (no la del ejemplo, las mías) y da error en mi bd al conectarla, como ubicarle la contraseña?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Joan
Val: 414
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

revincular tablas desde bases de datos

Publicado por Joan (91 intervenciones) el 19/07/2023 14:40:47
1
dbs.TableDefs(i).Connect = ";DATABASE=" & CurrentProject.Path & "\" & strBDRemota & ";PWD=Mipasswordr" & ";"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

revincular tablas desde bases de datos

Publicado por carlos (46 intervenciones) el 19/07/2023 18:22:43
Amigo, un millón de gracias es poco para darle, todo quedó ok, Dios lo bendiga
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar