Como pasar una importaciones guardada en Access a vba

Estoy trabajando con datos que provienen desde una base de datos de SQL server, hago los pasos de importación y los guardo en importaciones guardadas, funciona de maravilla, pero cuando no hay conectividad con el servidor falla, ya que previa a la importación debe realizar un borrado de tablas, importar los datos y realizar nuevas operaciones con los datos importados.

Existe alguna manera de poder realizar el mismo paso de importaciones guardadas desde VBA con un manejo de errores o alguna manera de poder detectar que no hay conectividad con el servidor antes de realizar cualquier operación.

Los datos de las importaciones guardadas son las siguientes (Cambio datos por seguridad)

Nombre:Seguimiento_Compras

ODBC;Description=prueba;DRIVER=SQL Server;SERVER=10.0.1.30;UID=Admin;PWD=123;APP=Microsoft Office;DATABASE=PRODUCTOS_PLANTA

y ejecuto la importación guardada con el siguiente código

DoCmd.RunSavedImportExport ("Seguimiento_Compras")

2 Respuestas

Respuesta
2

Todo indica que trabaja con tablas vinculadas, personalmente trabajo con PostgreSQL y valido conexión a internet (si la base de datos está en la nube) y conexión con el servidor. La idea de la prueba de conexión con el servidor es la misma solo varía la cadena de conexión.

Prueba conexión internet

#If VBA7 And Win64 Then
    ' 64-bits
     Private Declare PtrSafe Function InternetCheckConnection Lib "wininet.dll" Alias "InternetCheckConnectionA" (ByVal lpszUrl As String, ByVal dwFlags As Long, ByVal dwReserved As Long) As Long
 #Else
    ' 32-bits
     Private Declare Function InternetCheckConnection Lib "wininet.dll" Alias "InternetCheckConnectionA" (ByVal lpszUrl As String, ByVal dwFlags As Long, ByVal dwReserved As Long) As Long
 #End If
Public Function funConexionInternet() As Boolean
    On Error GoTo Err_Local
    Const cUrl = "https://www.google.com/"
    funConexionInternet = InternetCheckConnection(cUrl, &H1, 0&)
    If funConexionInternet = False Then
        'DoEvents
         MsgBox "No está conectado a internet", vbCritical, "Error internet"
         Application.Quit
    Else
        funConexionInternet = True
    End If
Exit_Local:
    On Error GoTo 0
    Exit Function
Err_Local:
    MsgBox Err.Description, vbCritical, Err.Number
    Resume Exit_Local
End Function

Puede adaptar esta función para SQLServer

Public Function ObtenerConexion() As Object
    On Error GoTo ManejoDeErrores
    Dim cnn As Object
    Dim cadena_conexion As String
    Dim servidor As String
    Dim puerto As String
    Dim usuario As String
    Dim contrasena As String
    Dim base_de_datos As String
    ' Configuración de los datos de conexión
    servidor = "localhost"
    puerto = "5434"
    usuario = "postgres"
    contrasena = "sucontraseña"
    base_de_datos = "subasededatos"
    ' Crear cadena de conexión
    cadena_conexion = "Driver={PostgreSQL Unicode};" & _
                      "Server=" & servidor & ";" & _
                      "Port=" & puerto & ";" & _
                      "Database=" & base_de_datos & ";" & _
                      "Uid=" & usuario & ";" & _
                      "Pwd=" & contrasena & ";"
    ' Crear objeto de conexión
    Set cnn = CreateObject("ADODB.Connection")
    ' Abrir la conexión
    cnn.Open cadena_conexion
    ' Devolver el objeto de conexión si la conexión es exitosa
    Set ObtenerConexion = cnn
    Exit Function
ManejoDeErrores:
    ' Mostrar mensaje de error y devolver Nothing si falla la conexión
    MsgBox "Error al conectar con el servidor: " & Err.Description, vbCritical, "Error de Conexión"
    Set ObtenerConexion = Nothing
End Function

Muchas gracias por tu ayuda, ya pude establecer conexión pero las tablas son importadas y no vinculadas, como podría importar la tabla que desee después de haber logrado la conexión.

Le dejo estas opciones:

Opción 1- Creando un DSN

Para importar una tabla de SQL Server a Microsoft Access ya establecida la conexión, puedes seguir estos pasos:

Abrir Microsoft Access: Inicie su base de datos de Access donde desea importar la tabla.

Ir a la pestaña "Datos Externos": En la cinta de opciones, haga clic en la pestaña "Datos Externos".

Seleccionar "Desde ODBC": En el grupo "Importar y vincular", selecciona "Desde ODBC". Esto abrirá el asistente para importar datos.

Elegir la fuente de datos: En la ventana que se abre, selecciona la fuente de datos ODBC correspondiente a su conexión de SQL Server y haga clic en "Aceptar".

Seleccionar la tabla: Aparecerá una lista de las tablas disponibles en la base de datos de SQL Server. Seleccione la tabla que desea importar.

Elegir las opciones de importación: Puede optar por importar los datos a una nueva tabla o vincularlos a la tabla existente. Si elige importar, se copiarán todos los datos a Access.

Finalizar el proceso: Sigue las instrucciones del asistente para completar la importación. Puede tener la opción de especificar si deseas incluir los nombres de campo en la primera fila, entre otras configuraciones.

Verificar la importación: Una vez completada la importación, verifique que los datos se hayan transferido correctamente a Access.

Opción 2 -Sin un DSN y VBA

Sub ImportarTablaDesdeSQLServerSinDSN()
    Dim cn As Object
    Dim rs As Object
    Dim strSQL As String
    Dim strConn As String
    Dim nombreTabla As String
    Dim nombreTablaDestino As String
    Dim db As DAO.Database
    Dim newRecord As DAO.Recordset
    ' Nombre de la tabla en SQL Server
    nombreTabla = "NombreDeTuTabla"
    ' Nombre de la tabla destino en Access
    nombreTablaDestino = "NuevaTabla"
    ' Cadena de conexión OLE DB
    strConn = "Provider=SQLOLEDB;Data Source=suServidor;Initial Catalog=suBaseDeDatos;User ID=suUsuario;Password=suContraseña;"
    ' SQL para seleccionar los datos
    strSQL = "SELECT * FROM " & nombreTabla
    ' Crear el objeto de conexión
    Set cn = CreateObject("ADODB.Connection")
    cn.Open strConn
    ' Crear el objeto Recordset
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open strSQL, cn
    ' Crear la tabla en Access si no existe
    Set db = CurrentDb
    On Error Resume Next
    db.Execute "DROP TABLE " & nombreTablaDestino  ' Eliminar tabla si existe
    On Error GoTo 0
    ' Crear la nueva tabla
    Db. Execute "CREATE TABLE " & nombreTablaDestino & " (ID AUTOINCREMENT PRIMARY KEY, Campo1 TEXT, Campo2 TEXT)" ' Ajusts los campos según tus necesidades
    ' Copiar los datos del Recordset a la tabla
    Set newRecord = db.OpenRecordset(nombreTablaDestino, dbOpenDynaset)
    Do While Not rs.EOF
        newRecord.AddNew
        For i = 0 To rs.Fields.Count - 1
            newRecord.Fields(i).Value = rs.Fields(i).Value
        Next i
        newRecord.Update
        rs.MoveNext
    Loop
    ' Cerrar el Recordset y la conexión
    rs.Close
    cn.Close
    ' Limpiar objetos
    Set rs = Nothing
    Set cn = Nothing
    Set newRecord = Nothing
    Set db = Nothing
    MsgBox "Importación completada con éxito.", vbInformation
End Sub

Opción 3 - Sin DSN- cadena de conexión OLE DB

Sub ImportarTablaDesdeSQLServerSinDSN()
    Dim cn As Object
    Dim rs As Object
    Dim strSQL As String
    Dim strConn As String
    Dim nombreTabla As String
    Dim nombreTablaDestino As String
    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim fld As DAO.Field
    ' Nombre de la tabla en SQL Server
    nombreTabla = "NombreDesuTabla"
    ' Nombre de la tabla destino en Access
    nombreTablaDestino = "NuevaTabla"
    ' Cadena de conexión OLE DB
    strConn = "Provider=SQLOLEDB;Data Source=suServidor;Initial Catalog=suBaseDeDatos;User ID=suUsuario;Password=suContraseña;"
    ' SQL para seleccionar los datos
    strSQL = "SELECT * FROM " & nombreTabla
    ' Crear el objeto de conexión
    Set cn = CreateObject("ADODB.Connection")
    cn.Open strConn
    ' Crear el objeto Recordset
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open strSQL, cn
    ' Crear la tabla en Access
    Set db = CurrentDb
    Set tdf = db.CreateTableDef(nombreTablaDestino)
    ' Agregar campos a la tabla
    For Each fld In rs.Fields
        tdf.Fields.Append tdf.CreateField(fld.Name, IIf(fld.Type = adVarChar, dbText, dbMemo))
    Next fld
    ' Crear la tabla en Access
    db.TableDefs.Append tdf
    ' Copiar los datos del Recordset a la tabla
    Do While Not rs.EOF
        Dim newRecord As DAO.Recordset
        Set newRecord = db.OpenRecordset(nombreTablaDestino, dbOpenDynaset)
        newRecord.AddNew
        For Each fld In rs.Fields
            newRecord.Fields(fld.Name).Value = fld.Value
        Next fld
        newRecord.Update
        NewRecord. Close
        Rs. MoveNext
    Loop
    ' Cerrar el Recordset y la conexión
    Rs. Close
    Cn. Close
    ' Limpiar objetos
    Set rs = Nothing
    Set cn = Nothing
    Set tdf = Nothing
    Set db = Nothing
    MsgBox "Importación completada con éxito.", vbInformation
End Sub

4. Opción - Usar una herramienta de terceros

En este caso puede utilizar

- ESF Database Migration Toolkit - Professional

- Db Convert Studio

Etc

Respuesta
1

Quizás el método más efectivo sea cambiar el método

El primer paso sería obtener los datos externos y si al importarlos se les nombra (o renombra) con la fecha de su importación, se soluciona en gran parte el problema.

Ya importados y como paso previo a los procesos de importación (el borrado/manipulación de los existentes) se compara la fecha de los actuales con la fecha de los importados, de esta comparación se decide el siguiente paso: su actualización.

¿Qué son más frescos?.. Se procesan

¿Qué no son más recientes que los actuales?.. Se aborta y se envía un mensaje.

El resultado final es que actualizados o no (algo que se conoce) siempre habrá datos y no unas tablas vacías.

Hay formas de verificar si hay conexión a elementos externos (incluso un mísero Ping puede ser válido) y si el servidor de datos (no la maquina) esta caído no se generara la importación.

Asumo que tras la importación se hacen controles para validar la importación y este método es válido para cualquier servidor de datos SQL sin importar ‘la marca ni el modelo’ pues todos comparten las mismas características con mínimas diferencias (sean gratuitos o de pago).

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas