|
Responder
|
| Autor | |
MUTENROY
Nuevo
Unido: 22/Enero/2024 Localización: Granada Estado: Sin conexión Puntos: 15 |
Tema: Cerrar una base de datos desde otraEnviado: 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!!!!
|
|
![]() |
|
Mihura
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador
Unido: 06/Mayo/2005 Localización: En la dehesa Estado: Sin conexión Puntos: 14428 |
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.
|
|
![]() |
|
MUTENROY
Nuevo
Unido: 22/Enero/2024 Localización: Granada Estado: Sin conexión Puntos: 15 |
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
|
|
![]() |
|
Mihura
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador
Unido: 06/Mayo/2005 Localización: En la dehesa Estado: Sin conexión Puntos: 14428 |
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?
|
|
![]() |
|
javier.mil
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Colaborador
Unido: 10/Agosto/2005 Localización: España Estado: Sin conexión Puntos: 4856 |
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 |
|
![]() |
|
Mihura
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador
Unido: 06/Mayo/2005 Localización: En la dehesa Estado: Sin conexión Puntos: 14428 |
Enviado: 14/Abril/2024 a las 21:18 |
|
Si está bloqueada (que es el problema que él tiene) dudo que puedas cerrarla así.
|
|
![]() |
|
javier.mil
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Colaborador
Unido: 10/Agosto/2005 Localización: España Estado: Sin conexión Puntos: 4856 |
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 |
|
![]() |
|
MUTENROY
Nuevo
Unido: 22/Enero/2024 Localización: Granada Estado: Sin conexión Puntos: 15 |
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.
|
|
![]() |
|
Responder
|
|
|
Tweet
|
| Ir al foro | Permisos de foro ![]() Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |