** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Cerrar una base de datos desde otra
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoCerrar una base de datos desde otra

 Responder Responder
Autor
Mensaje
MUTENROY Ver desplegable
Nuevo
Nuevo


Unido: 22/Enero/2024
Localización: Granada
Estado: Sin conexión
Puntos: 15
Enlace directo a este mensaje Tema: Cerrar una base de datos desde otra
    Enviado: 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!!!!
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Enlace directo a este mensaje Enviado: 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.

Access Aplicaciones
Tecsys.es
Arriba
MUTENROY Ver desplegable
Nuevo
Nuevo


Unido: 22/Enero/2024
Localización: Granada
Estado: Sin conexión
Puntos: 15
Enlace directo a este mensaje Enviado: 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
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Enlace directo a este mensaje Enviado: 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.

Access Aplicaciones
Tecsys.es
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4856
Enlace directo a este mensaje Enviado: 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






Editado por javier.mil - 14/Abril/2024 a las 19:27
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Enlace directo a este mensaje Enviado: 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.

Access Aplicaciones
Tecsys.es
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4856
Enlace directo a este mensaje Enviado: 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


 
Arriba
MUTENROY Ver desplegable
Nuevo
Nuevo


Unido: 22/Enero/2024
Localización: Granada
Estado: Sin conexión
Puntos: 15
Enlace directo a este mensaje Enviado: 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.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable