Imprimir página | Cerrar ventana

Cerrar una base de datos desde otra

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=86906
Fecha de impresión: 26/Marzo/2026 a las 19:25


Tema: Cerrar una base de datos desde otra
Publicado por: MUTENROY
Asunto: Cerrar una base de datos desde otra
Fecha de publicación: 12/Abril/2024 a las 17:12
Hola, no consigo resolver este tema. A ver si alguno puede ilustrarme. Tengo una base de datos(b1.accdb) en constante ejecución y en algunas ocasiones se queda bloqueada por diferentes motivos. Para solucionar este tema, he creado otra base de datos (b2.accdb) tambien en constante ejecución que cuando encuentra que la primera no ha hecho su trabajo la cierre y la vuelva abrir. Se me ocurrió crear un archivo cmd donde reinicia access y vuelva a abrir las 2 base de datos, pero no funciona porque en el momento que cierro la base de datos cierra tambien el fichero cmd y se termina de ejecutar todas las instrucciones. Tambien he probado con el siguiente código desde la b2.accdb pero en la instrucción : objAccess.CurrentDb.Name = dbName nunca entra o se cumple.

Dim objAccess As Object
    Dim dbPath As String
    Dim dbName, x As String
    
    ' Ruta completa de la base de datos que deseas cerrar
    dbPath = "C:\b1.accdb"
    
    ' Obtener solo el nombre de la base de datos
    dbName = Dir(dbPath)
    
    On Error Resume Next
    ' Intentar obtener una referencia a la instancia de Access de la base de datos que deseas cerrar
    'Set objAccess = GetObject(dbPath)
    Set objAccess = GetObject(, "Access.Application")
    On Error GoTo 0
    
    If Not objAccess Is Nothing Then
        ' Verificar si la base de datos abierta coincide con la que queremos cerrar
            If objAccess.CurrentDb.Name = dbName Then
                    objAccess.DoCmd.Quit
            MsgBox "La base de datos ha sido cerrada exitosamente.", vbInformation
        Else
            MsgBox "La base de datos que intenta cerrar no está abierta.", vbExclamation
        End If
    Else
        MsgBox "No se pudo encontrar una instancia de Access abierta para la base de datos especificada.", vbExclamation
    End If

Agradecería si alguien tiene algún ejemplo o puede guiarme para resolverlo. Muchas Gracias!!!!



Respuestas:
Publicado por: Mihura
Fecha de publicación: 12/Abril/2024 a las 18:31
Si la BD se bloquea difícilmente vas a poder cerrarla con un Quit, tendrás que hacerlo con el administrador de tareas o mediante API's, localizando el hwnd de la aplicación y cerrándola a capón.



-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: MUTENROY
Fecha de publicación: 13/Abril/2024 a las 09:45
HOla Mihura, la idea es que las dos bases de datos funcionen de manera desatendida, el pc no lo apago y lo que pretendo es que si hay algún bloqueo se reinicie y todo vuelva a funcionar. He probado cuando ocurre algun error la b2 llame a un cmd para reinicia a las dos base de datos  pero el cmd se cierra logicamente cuando se cierra la b2. Este es el cmd:
@echo off

taskkill /F /IM OUTLOOK.EXE /T
TASKKILL /F /IM MSACCESS.EXE /T

ECHO LAS APLICACIONES SE HAN CERRADO, ESPERANDO 10 SEG PARA SU REAPERTURA

rem reinicio el sistema

ping -n 10 MENSAJERIA > null

REM START /b /min "OUTLOOK" "C:\Program Files (x86)\Microsoft Office\root\Office16\outlook.exe"

START /b /min "MSACCESS"   "C:\Program Files (x86)\Microsoft Office\root\Office16\MSACCESS.EXE" /NOSTARTUP "C:\ENVIA PDF\B1.accdb"

START /b /min "MSACCESS"   "C:\Program Files (x86)\Microsoft Office\root\Office16\MSACCESS.EXE" /NOSTARTUP "C:\ENVIA PDF\B2.accdb" 

si consiguiera que no se cerrara el cmd me funcionaría pero no se como hacerlo


Publicado por: Mihura
Fecha de publicación: 13/Abril/2024 a las 11:14
¿Cómo sabes que la bd1 está bloqueada?
¿Cómo lanzas el cmd? ¿se llega a abrir?


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: javier.mil
Fecha de publicación: 14/Abril/2024 a las 19:27
Aunque No termino de comprender que la solucion al problema sea necesariamente tener que abrir una segunda Base es raro ...


Para cerrar una base externa se puede de varias maneras una de ellas seria asi

Sub CerrarBaseDeDatosExterna()
    Dim dbs As DAO.Database
    Dim strPath As String
    

    strPath = "C:\Ruta\Tu\BaseDeDatosExterna.accdb" ' << Cambia la ruta por la de tu base de datos externa
    Set dbs = DBEngine.Workspaces(0).OpenDatabase(strPath)
   

    If Not dbs Is Nothing Then
        dbs.Close
        Set dbs = Nothing
        MsgBox "La base de datos externa ha sido cerrada correctamente.", vbInformation
    Else
        MsgBox "La base de datos externa no está abierta.", vbExclamation
    End If
    
End Sub






-------------
https://www.accessdemo.info" rel="nofollow - https://www.accessdemo.info





Publicado por: Mihura
Fecha de publicación: 14/Abril/2024 a las 21:18
Si está bloqueada (que es el problema que él tiene) dudo que puedas cerrarla así.

-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: javier.mil
Fecha de publicación: 14/Abril/2024 a las 22:34
En ese caso quizas habria que matar el proceso de Windows  ...

Public Sub KillProcess(ByVal PonProceso As String)
      On Error GoTo Err_Local
      
      Dim oWMI
      Dim ret
      Dim oServices
      Dim oService
      Dim servicename


      Set oWMI = GetObject("winmgmts:")


            '   Set oServices = oWMI.InstancesOf("win32_process") ' << Lento
            Set oServices = oWMI.ExecQuery("SELECT * FROM win32_process WHERE name='" & processName & "'")  ' << Rapido
      

      For Each oService In oServices
            servicename = LCase(Trim(CStr(oService.Name) & ""))
            If InStr(1, servicename, LCase(processName), vbTextCompare) > 0 Then
                  ret = oService.Terminate
            End If
      Next
      
      Set oServices = Nothing
      Set oWMI = Nothing


      Err.Clear
      
      

Exit_Local:
    On Error GoTo 0
    Exit Sub

Err_Local:
    MsgBox Err.Description, vbCritical, "Error N°:  " & Err.Number
                  Resume Exit_Local
End Sub


 


-------------
https://www.accessdemo.info" rel="nofollow - https://www.accessdemo.info





Publicado por: MUTENROY
Fecha de publicación: 15/Abril/2024 a las 12:04
Hola Javi, ya probé lo que me comentas y no me funciona cuando hay dos instancias corriendo al mismo tiempo. Porqué quiero cerrarla? la base de datos que se queda bloqueada la uso entre otras cosas para enviar correos masivamente con adjunto, además subo ficheros a google drive tambien de forma automática, pues en ocasiones me encuentro que se para el proceso por algún error que no logro a descubrir, por esto he pensado en crear una segunda base de datos que controle cuando la primera se quede bloqueada la reinicie. Después de probar varias cosas creo que lo he resuelto en el CMD que tenía creado modificando la linea "TASKKILL /F /IM MSACCESS.EXE" quitándole el parámetro /T para dejar que termine y no se cierre junto a la bd1. Asi que muchas gracias por vuestra ayuda y espero que mi ejemplo sirva para otros. Saludos.



Imprimir página | Cerrar ventana