Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki

Access: Cómo modificar cadena conexión DSN ODBC de tablas vinculadas Access usando VBA
Bases de Datos


Tutorial donde mostramos paso a paso cómo añadir un módulo, macro y formulario en una base de datos Microsoft Access que permita actualizar (modificar o cambiar) el DSN (cadena de conexión ODBC) de las tablas vinculadas. Para ello usaremos VBA (Visual Basic for Application). Además, mostraremos un método para actualizar todas las tablas vinculadas de una base de datos Access. Mostramos este procedimiento para Access 97 pero el proceso es similar en Access 2000, Access 2003 e incluso en las nuevas versiones de Access que siguen manteniendo VBA.



Base de datos Microsoft Access con tablas vinculadas, qué es una tabla vinculada en Access

La base de datos Microsoft Access (en este tutorial usaremos la versión 97, pero es perfectamente válido para el resto de versiones 2000, 2003, 2008, etc.) permite utilizar tablas de la propia base de datos y tablas de motores de base de datos externos. En una base de datos Microsoft Access se puede trabajar con tablas de otras bases de datos usando ODBC, a estas tablas externas se les llama tablas vinculadas.

A continuación mostramos un tutorial donde explicamos paso a paso cómo crear un origen de datos ODBC y cómo vincular una tabla de MySQL en una base de datos Access:

Lo que explicaremos en este tutorial es cómo cambiar el DSN de una tabla ya vinculada en Access. Este procedimiento es muy útil cuando tenemos varias tablas vinculadas en una base de datos Access y necesitamos cambiar usuario y contraseña o IP o nombre de servidor del motor de base de datos de las tablas vinculadas. Este procedimiento, una vez cambiado el ODBC en el equipo, nos permitirá actualizar el DSN correspondiente en todas las tablas vinculadas de forma automática.

Un ejemplo de base de datos Access con tablas vinculadas, en el ejemplo, las tablas CLIENTES y FACTURAS corresponden a una base de datos Oracle 11g, han sido vinculadas usando el ODBC correspondiente (como indicamos en el tutorial anterior):

Base de datos Microsoft Access con tablas vinculadas, qué es una tabla vinculada en Access

Crear formulario en Access para modificar la vinculación DSN automática de tablas

Abriremos nuestra base de datos Microsoft Access, en la pestaña "Tablas" tendremos las tablas tanto de la propia base de datos como las tablas vinculadas. En nuestra base de datos de ejemplo tenemos dos tablas vinculadas de un origen de datos ODBC correspondientes a un servidor de base de datos Oracle: CLIENTES y FACTURAS:

Crear formulario en Access para modificar la vinculación DSN automática de tablas

A continuación explicamos paso a paso cómo añadir la utilidad de actualizar el vínculo DSN de todas las tablas vinculadas de esta base de datos de forma automática. Para ello pulsaremos en la pestaña "Formularios" y pulsaremos en "Nuevo":

Crear formulario en Access para modificar la vinculación DSN automática de tablas

Seleccionaremos "Vista Diseño" y pulsaremos "Aceptar":

Crear formulario en Access para modificar la vinculación DSN automática de tablas

Añadiremos los siguientes componentes al formulario:

  • Un Cuadro de texto para introducir el DSN, para ello pulsaremos en el botón de "Herramientas" y añadiremos el "Cuadro de texto":

Crear formulario en Access para modificar la vinculación DSN automática de tablas

Estableceremos la propiedad "Nombre" del cuadro de texto a "txtDSN". Para ello pulsaremos con el botón derecho del ratón sobre el Cuadro de texto y seleccionaremos "Propiedades":

Crear formulario en Access para modificar la vinculación DSN automática de tablas

En"Nombre" escribiremos "txtDSN":

Crear formulario en Access para modificar la vinculación DSN automática de tablas

Nota: es muy importante establecer nombres exactos que posteriormente recordemos a los componentes que indicamos que han de añadirse al formulario. Estos nombres serán usados más adelante en el código VBA por lo que deben coincidir.

  • Un Cuadro de lista que usaremos para mostrar el progreso de las tablas que se van vinculando desde el código VBA, en la propiedad "Nombre" introduciremos "lsLista":

Crear formulario en Access para modificar la vinculación DSN automática de tablas

  • Añadiremos otro Cuadro de texto al final en el que mostraremos la tabla a la que se le está actualizando el vínculo DSN, lo llamaremos "txtResultado":

Crear formulario en Access para modificar la vinculación DSN automática de tablas

  • Añadiremos un par de Botones de comando, uno para ejecutar el proceso y otro para cerrar el formulario. Más adelante asignaremos la acción correspondiente al botón "Readjuntar tablas" (será la ejecución de una Macro). Al botón de cerrar el formulario podremos asignarle la acción de forma automática con el asistente, añadiendo un "Botón de comando" desde la barra de herramientas nos mostrará un asistente, en "Categoría" elegiremos "Operaciones con formularios" y en "Acciones" elegiremos "Cerrar formulario". Así el asistente añadirá el código VBA oportuno para cerrar el formulario:

Crear formulario en Access para modificar la vinculación DSN automática de tablas

El código VBA del botón Cerrar formulario:

Private Sub Comando11_Click()
On Error GoTo Err_Comando11_Click

  DoCmd.Close

Exit_Comando11_Click:
    Exit Sub

Err_Comando11_Click:
    MsgBox Err.Description
    Resume Exit_Comando11_Click    
End Sub

Una vez añadidos todos los componentes al formulario lo cerraremos y pulsaremos "Sí" en el cuadro de diálogo de aviso:

Crear formulario en Access para modificar la vinculación DSN automática de tablas

Introduciremos un nombre para el formulario, por ejemplo "formReadjuntarTablas" y pulsaremos "Aceptar":

Crear formulario en Access para modificar la vinculación DSN automática de tablas

Más adelante, como ya hemos dicho, volveremos a la edición del formulario para establecer la acción que realizará el botón "Readjuntar tablas". Ahora mismo no podemos pues aún no hemos creado la macro para asociarla a dicha acción.

Podemos descargar de forma gratuita la base de datos Access de ejemplo de este tutorial:

 

Crear módulo VBA para actualizar el DSN de las tablas vinculadas de una base de datos Access

Tras crear el formulario y sus componentes y asignarles un nombre (necesario para el código VBA que generaremos ahora), crearemos un nuevo Módulo con código VBA, en este módulo crearemos las funciones necesarias para obtener el número de tablas vinculadas (excluyendo otro tipo de tablas) de nuestra base de datos Access, modificar el vínculo DSN ODBC de cada tabla y mostrar el resultado en el formulario.

Para crear un nuevo módulo en Access, pulsaremos en la pestaña "Módulos" y en el botón "Nuevo":

Crear módulo VBA para actualizar el DSN de las tablas vinculadas de una base de datos Access

Pegaremos el siguiente código VBA en el nuevo módulo:

Crear módulo VBA para actualizar el DSN de las tablas vinculadas de una base de datos Access

El código fuente completo del módulo VBA para actualizar el vínculo DSN de todas la tablas vinculadas de una base de datos Access:

Option Compare Database
Option Explicit

'Recorremos todas las tablas de la base de datos
'para modificar el DSN (ODBC)
Public Function cambiarDSNTodasTablas() As String
   Dim baseDatos As Database
   Dim tabla As TableDef
   Dim tablaNombre As String
   Dim tablaAtributos As String
   Dim i As Integer
   Dim resultado As String
   Dim resultadoAcumulado As String
   Dim numeroTablas As Integer
   Dim cadenaConexionDSN As String
   Dim formProgreso As Form
   
   On Error GoTo cError
   
   Set formProgreso = Forms("formActualizarTablasVinculadas")
   
   cadenaConexionDSN = formProgreso.txtDSN
   
   If cadenaConexionDSN = "" Then
     MsgBox "Debe especificar la cadena de conexión DSN, con el formato: " & _
         vbCrLf & vbCrLf & "ODBC;DSN=XXX;UID=XXX;PWD=XXX;DBQ=XXX"
         DoCmd.OpenForm ("formReadjuntarTablas")
   Else
     resultado = ""
     resultadoAcumulado = ""
     
     Set baseDatos = CurrentDb()
     numeroTablas = baseDatos.TableDefs.Count
     
     If MsgBox("Se van a readjuntar [" & CStr(obtenerNumeroTablasVinculadas) & _
         "] tablas ¿desea continuar?", vbYesNo + vbQuestion, "Readjuntar tablas") = vbYes Then
       'Recorremos todas las tablas de la base de datos Access
       For i = 0 To numeroTablas - 1
          Set tabla = baseDatos.TableDefs(i)
          tablaNombre = tabla.Name
          tablaAtributos = (tabla.Attributes And Not dbSystemObject And dbAttachedODBC)
        
          'Si no es de sistema y es vinculada ODBC actualizamos el DSN
          If tablaAtributos = True Then
            'Intentamos cambiar el origen de datos ODBC DSN de la tabla
            resultado = cambiarDSNTabla(tablaNombre, cadenaConexionDSN)
            
            'Mostramos el resultado del cambio de DSN de cada tabla
            'en el ListBox (Cuadro de lista) del formulario
            If resultadoAcumulado = "" Then
              formProgreso.lsLista.RowSource = resultado
              resultadoAcumulado = resultado
            Else
              formProgreso.lsLista.RowSource = _
                  formProgreso.lsLista.RowSource & ";" & resultado
                  resultadoAcumulado = resultadoAcumulado & vbCrLf & resultado
              formProgreso.lsLista.Requery
              formProgreso.Repaint
            End If
            formProgreso.txtResultado = resultado
            'formProgreso.txtResultado.Text = resultado
            'formProgreso.txtResultado.Requery
          End If
       Next i
       formProgreso.txtResultado = "Proceso finalizado"
       MsgBox "Proceso finalizado. Puede consultar el resultado de la vinculación " & _
            "de cada tabla en la lista.", vbOKOnly + vbInformation
       
    End If
    cambiarDSNTodasTablas = resultadoAcumulado
    
    'MsgBox "Proceso finalizado: " & vbCrLf & vbCrLf & resultadoAcumulado
  End If
  
cSalir:
   Exit Function
cError:
   MsgBox "Error al cambiar DSN de tablas vinculadas en Access: " & _
        Err.Description, vbOKOnly + vbExclamation
End Function


'Modifica el DSN (cadena de conexión ODBC) de una
'tabla vinculada de una base de datos Access
Public Function cambiarDSNTabla(nombreTabla As String, _
    cadenaConexionDSN As String) As String
  Dim baseDatos As Database
  Dim tabla As TableDef
  
  On Error GoTo cError
  
  Set baseDatos = Application.CurrentDb
  Set tabla = baseDatos.TableDefs(nombreTabla)
  
  tabla.Connect = cadenaConexionDSN
  tabla.RefreshLink
  
  cambiarDSNTabla = "Actualizado DSN tabla -> [" & nombreTabla + "]"
  
Salir:
 Exit Function
  
cError:
  cambiarDSNTabla = "ERROR actualizar DSN tabla -> [" & _
      nombreTabla & "] Error: " & Err.Description
End Function



'Devuelve el número de tablas ODBC vinculadas
'en una base de datos Access, empleando el atributo dbAttachedODBC
'y excluyendo las de sistema con dbSystemObject
'Los posibles atributos:
  ' dbAttachExclusive Tabla vinculada para uso exclusivo
  ' dbAttachSavePWD   Tabla vinculada, ID y contraseña se guardará en información de conexión
  ' dbSystemObject    Tabla de sistema (protegida)
  ' dbHiddenObject    Tabla oculta
  ' dbAttachedTable   Tabla vinculada no ODBC (Microsoft Access o Paradox)
  ' dbAttachedODBC    Tabla vinculada por ODBC (SQL Server, MySQL, Oracle)
Public Function obtenerNumeroTablasVinculadas() As Integer
   Dim baseDatos As Database
   Dim tabla As TableDef
   Dim tablaNombre As String
   Dim tablaAtributos As String
   Dim i As Integer
   Dim numTablas As Integer
   
   On Error GoTo cError
   
   Set baseDatos = CurrentDb()
   
   For i = 0 To baseDatos.TableDefs.Count - 1
     Set tabla = baseDatos.TableDefs(i)
     tablaAtributos = (tabla.Attributes And _
        Not dbSystemObject And dbAttachedODBC)
     If tablaAtributos = True Then
       numTablas = numTablas + 1
     End If
   Next i
     
   obtenerNumeroTablasVinculadas = numTablas

cSalir:
   Exit Function
cError:
   MsgBox "Error al obtener número de tablas vinculadas: " & _
        Err.Description, vbOKOnly + vbExclamation
End Function

Una vez pegado el código cerraremos el módulo:

Crear módulo VBA para actualizar el DSN de las tablas vinculadas de una base de datos Access

Guardaremos los cambios:

Crear módulo VBA para actualizar el DSN de las tablas vinculadas de una base de datos Access

E introduciremos un nombre para el módulo, por ejemplo "utilidades":

Crear módulo VBA para actualizar el DSN de las tablas vinculadas de una base de datos Access

Podemos descargar de forma gratuita la base de datos Access de ejemplo de este tutorial:

 

Crear macro para ejecutar código VBA para actualizar el DSN de las tablas vinculadas de una base de datos Access

Tras crear el formulario y el módulo VBA añadiremos ahora una macro que nos permitirá ejecutar la función cambiarDSNTodasTablas() del código del módulo VBA anterior. Dicha función será la que realice todo el proceso de actualización del vínculo de todas las tablas de nuestra base de datos Access.

Para crear una nueva macro pulsaremos en la pestaña "Macro" y en el botón "Nuevo":

Crear macro para ejecutar código VBA para actualizar el DSN de las tablas vinculadas de una base de datos Access

En "Acción" elegiremos EjcutarCódigo y en "Nombre de función" introduciremos cambiarDSNTodasTablas()

Crear macro para ejecutar código VBA para actualizar el DSN de las tablas vinculadas de una base de datos Access

Cerraremos la nueva macro y guardaremos los cambios:

Crear macro para ejecutar código VBA para actualizar el DSN de las tablas vinculadas de una base de datos Access

Introduciremos un nombre para la macro, por ejemplo ReadjuntarTablas:

Crear macro para ejecutar código VBA para actualizar el DSN de las tablas vinculadas de una base de datos Access

Podemos descargar de forma gratuita la base de datos Access de ejemplo de este tutorial:

 

 

Aplicar la acción correspondiente al botón de comando Readjuntar Tablas en el formulario

Una vez creado el formulario, añadido el módulo VBA y la macro correspondiente volveremos a la edición de nuestro formulario, desde la pestaña "Formularios", seleccionando el formulario y pulsando en "Diseño". Desde el diseño del formulario pulsaremos con el botón derecho del ratón sobre el botón de comando "Readjuntar tablas" y en el menú emergente seleccionaremos "Propiedades":

Aplicar la acción correspondiente al botón de comando Readjuntar Tablas en el formulario

En la propiedad/evento "Al hacer clic" introduciremos el nombre de la macro creada anteriormente "ReadjuntarTablas":

Aplicar la acción correspondiente al botón de comando Readjuntar Tablas en el formulario

De esta forma el botón ejecutará la macro y la macro, a su vez, ejecutará la función cambiarDSNTodasTablas() del módulo VBA.

Podemos descargar de forma gratuita la base de datos Access de ejemplo de este tutorial:

 

Probar formulario para readjuntar (modificar vínculo DSN ODBC) tablas en Access

Desde la pestaña "Formularios" de nuestra base de datos Access, seleccionaremos el formulario creado y pulsaremos en Abrir:

Probar formulario para readjuntar (modificar vínculo DSN ODBC) tablas en Access

Introduciremos en DSN la cadena de conexión a ODBC con el formato, usuario y contraseña correctos, por ejemplo:

ODBC;DSN=FACTURACION;UID=usufacturas;PWD=contraseña;DBQ=BDFACTURAS

donde:

  • DSN=FACTURACION: será el nombre del origen de datos ODBC.
  • UID=usufacturas: será el usuario de acceso a la base de datos ODBC.
  • PWD=contraseña: será la contraseña del usuario anterior.
  • DBQ=BDFACTURAS: será el nombre de la base de datos ODBC.

Una vez introducido el DSN correcto pulsaremos en "Readjuntar tablas":

Probar formulario para readjuntar (modificar vínculo DSN ODBC) tablas en Access

Desde el código VBA recorre todas la tablas de la base de datos Access y cuenta las que son tablas vinculadas, luego muestra un mensaje al usuario indicando el número de tablas vinculadas y si desea continuar con el proceso de actualización del DSN ODBC. Para continuar pulsamos en "Sí":

Probar formulario para readjuntar (modificar vínculo DSN ODBC) tablas en Access

El código VBA se ejecutará e irá actualizando el DSN ODBC de cada tabla vinculada de nuestra base de datos Access y mostrando en el formulario el resultado de cada vinculación. Una vez finalizado el proceso nos mostrará un mensaje indicándolo:

Probar formulario para readjuntar (modificar vínculo DSN ODBC) tablas en Access

Como vemos el código fuente VBA puede ser muy útil para automatizar tareas que de lo contrario tendríamos que llevar a cabo manualmente.

Podemos descargar de forma gratuita la base de datos Access de ejemplo de este tutorial:

 

Comprobar cadena de conexión DSN ODBC de las tablas vinculadas en Access

Microsoft Access nos permite consultar los objetos del sistema y sus valores. Entre estos objetos se encuentran las tablas vinculadas y el string de conexión DSN correspondiente. Para consultarlo deberemos mostrar las tablas ocultas y de sistema, para ello, en nuestra base de datos Access, accederemos al menú "Herramientas" - "Opciones":

Comprobar cadena de conexión DSN ODBC de las tablas vinculadas en Access

En la pestaña "Ver" marcaremos "Objetos ocultos" y "Objetos de sistema", pulsaremos "Aceptar":

Comprobar cadena de conexión DSN ODBC de las tablas vinculadas en Access

En la pestaña "Tablas" de nuestra base de datos Access nos aparecerán objetos ocultos, entre ellos MSysObjects, lo seleccionaremos y pulsaremos "Abrir":

Comprobar cadena de conexión DSN ODBC de las tablas vinculadas en Access

En esta tabla de Access protegida (no se puede modificar directamente) podremos comprobar y consultar las tablas vinculadas actualizadas anteriormente y sus cadenas de conexión DSN en el campo Connect:

Comprobar cadena de conexión DSN ODBC de las tablas vinculadas en Access

Descarga gratuita de la base de datos Access en formato Access 97 con el formulario, la macro y el módulo VBA

A continuación mostramos enlace a la descarga gratuita de una base de datos Microsoft Access que incluye el formulario, la macro y el módulo VBA anteriores:

 

Artículos relacionados

 

Créditos

Artículo realizado íntegramente por Alonsojpd miembro fundador del Proyecto AjpdSoft.

Artículo en inglés.


Anuncios


Enviado el Sábado, 31 enero a las 12:48:21 por ajpdsoft
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A