Imprimir página | Cerrar ventana

Depuración control de errores a dos niveles

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=86846
Fecha de impresión: 26/Marzo/2026 a las 20:58


Tema: Depuración control de errores a dos niveles
Publicado por: MUTENROY
Asunto: Depuración control de errores a dos niveles
Fecha de publicación: 22/Enero/2024 a las 17:35
Hola a tod@s, últimamente estoy teniendo errores con el fichero lccdb que un usuario y desde un pc lo ha puesto en estado que no puede ser modificado, error 3075. Tengo mi BBDD compartida en la red y varios usuarios la usan, lo he probado casi todo y no consigo saber por lo que es. Al menos cuando ocurra y les aparezca este error los expulse y vuelvan a conectarse. El tema está, que cuando hago esto dentro de mi código de tratamiento de errores, me aparece otro que no sé como gestionarlo. Mi pregunta es, como sería un ejemplo o sobre mi código para que si ocurre un error dentro del tratamiento de errores continue la ejecución del programa. Os expongo mi ejemplo:
Al cargar el usuario su BBDD si encuentra un error, registro en la tabla ErroresLog cuando accedió el usuario, la fecha, hora , etc.. pues justo al insertar los datos en dicha tabla me aparece un error (el usuario de Admin de la máquina X ha situado la base datos...etc) Quisiera que si aparece no muestre el mensaje o que  cierre la BBDD automáticamente. A ver si podeis echarme una mano , este es mi código: (mil gracias)

TratamientoErrores:

    If Err.Number <> 0 Then
        
        numerror = Err.Number
        descriperror = Err.Description
        vl = DLookup("ver", "Version local")
        
        Forms![Menu BTNprincipal].txtnum = numerror
        Forms![Menu BTNprincipal].txtdes = descriperror
        
        If DLookup("activalogpartidas", "Activacionlog") = True Then
            CurrentDb.Execute "Insert into ErroresLog(num,descri,Pc,versionlocal) values ('" & numerror & "','" & descriperror & "','" & DameNombrePc() & "',  '" & vl & "' )"
        End If
        'MsgBox " Se ha producido un error: Tipo de error =" & numerror & ". Descripcion:" & descriperror, vbCritical, "Error"
        EscribeDatosTxt ("Error cargando programa:  " & Day(Date) & "/" & Month(Date) & "/" & Year(Date) & " , Hora " & Time)
        EscribeDatosTxt ("Error: " & numerror & ". Descripcion:" & descriperror)
        DoCmd.OpenForm "MensajeErrorCargar", windowMode:=acDialog
        
    End If




Respuestas:
Publicado por: xavi
Fecha de publicación: 23/Enero/2024 a las 15:57
Hola. Bienvenido al foro.

Se supone que el error se obtiene en la línea del CurrentDb.Executo por lo que yo, en este escenario concreto, simplemente optaria por tener el Log de errores en otra base de datos o en un fichero de texto puro.

Lo que no me queda claro es si tienes compartido el BackEnd (que sería lo que yo haría) o el FrontEnd (que nunca lo haría). Porque entiendo que hablamos de una base de datos dividida, ¿no?

Un saludo


-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: MUTENROY
Fecha de publicación: 23/Enero/2024 a las 16:58
Hola Xavi, efectivamente el log de errores lo tengo en otra tabla, es una base de datos dividida. Lo que pretendo ya que no soy capaz de determinar porque llevo 2 meses con el dichoso error 3734, es que si al cargar el usuario su bbdd le aparezca el error u otro lo expulso para vuelva a conectarse. Pues bien, cuando ejecuto la sentencia "CurrentDb.Execute "Insert into ErroresLog(num,descri,Pc,versionlocal) values ('" & numerror & "','" & descriperror & "','" & DameNombrePc() & "',  '" & vl & "' )" , puede que de error porque el campo vl de la tabla "partidas" está bloqueada por otro usuario y entonces me da error que no quiero que el usuario lo vea en pantalla, no quiero que salte el depurador. Por eso, se me ocurre que si en esta parte de mi código me da error se vaya a otra parte de mi código donde lo expulso, pero no se como hacerlo...


Publicado por: xavi
Fecha de publicación: 23/Enero/2024 a las 18:23
Aunque los cánones marquen que lo mejor es atacar (y solucionar) el problema en lugar de rodearlo, yo optaría por cambiar la tabla de errores por un fichero txt externo. De esa forma tu aplicación no se encuentra con el error del bloqueo y puedes lanzar el siguiente código.

Una vez funcione eso ya le dedicas el tiempo necesario a intentar controlar un doble error (si es que es necesario)


-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: MUTENROY
Fecha de publicación: 06/Febrero/2024 a las 13:05
Buenas de nuevo, creo que el problema me viene porque hago demasiado uso en el formulario de inicio varias comprobaciones de permisos según el usuario. Es decir, tengo otra base de datos con varias tablas con los nombre de los pc,s, de tal modo que voy comprobando al cargar el formulario de inicio si el pc tiene acceso a otros formularios. Estoy usando la función Dcount, no se como puedo hacer estas comprobaciones de otra forma, por los que os pediría vuestra ayuda y experiencia.Os paso lo que tengo al cargar en el formulario de inicio, que creo que de tanto abrir y cerrar las tablas se queda bloqueada.

'accesos a control calidad
    
  If (DLookup("[acceso calidad]", "Version local") = True) Then
    '
  '          'Me.btnordencarga.Visible = True
             Me.b8.Enabled = True  'boton orden carga
     '       Me.btnmercancia.Visible = True
             Me.b6.Enabled = True  'boton muestreo
        '    Me.btnaverias.Visible = False
        '    Me.btnprecios.Visible = True
        Else
          '  Me.btnordencarga.Visible = False
             Me.b8.Enabled = False  'boton orden carga
         '   Me.btnmercancia.Visible = False
             Me.b6.Enabled = False  'boton muestreo
        '    Me.btnaverias.Visible = True
        '    Me.btnprecios.Visible = False
    End If
   
'fin accesos control calidad

If DCount("*", "Comprueba si es equipo accesos") = 0 Then
 Me.b11.Enabled = False  'boton control accesos
End If

If DCount("*", "Comprueba si es equipo envases") = 0 Then
 Me.b12.Enabled = False  'boton retira envases
End If

If DCount("*", "Comprueba si es equipo peritos") = 0 Then
 Me.b13.Enabled = False  'boton control peritos
End If

If DCount("*", "Comprueba si es equipo socios") = 0 Then
 Me.b14.Enabled = False  'boton socios
End If

If DCount("*", "Comprueba si equipo envia muestreos") > 0 Then ' compruebo si equipo envia muestreos al Erp
    DoCmd.OpenQuery "Actualiza equipo local envia muestreos", acViewNormal
End If

If verlocal <> verserver Then '* no dejo entrar a la gente hasta que no actualice
        MsgBox "Existe una nueva versión del programa. A continuación se descargarán los paquetes y se actualizará, despues vuelva a abrir el programa.", vbInformation, "Aviso"
        CurrentDb.Execute "Insert into [Update] (fecha,pc,version,programa) values ('" & Date & "','" & pcmaquina & "','" & verserver & "','Partidas')"
        Shell "C:\Control partidas\Actualiza mdb.cmd", vbNormalFocus
        Application.SetOption "Auto Compact", True
        DoCmd.Quit
End If
  

If DLookup("erp", "accesoerp") = False Then
    Me.b7.Enabled = False 'boton pedidos
    Me.b8.Enabled = False  'boton orden carga
    Me.b3.Enabled = False 'boton previsiones
    Me.b4.Enabled = False  'boton sin confeccionar
    Me.b6.Enabled = False  'boton muestreo
    Me.b10.Enabled = False 'calibradora
    Me.b11.Enabled = False 'control accesos
    Me.b12.Enabled = False 'envases
    Me.b13.Enabled = False 'tecnicos
    
End If

If DCount("*", "Comprueba si es equipo salidas") > 0 Then 'compruebo si es equipo de salidas
 Me.b8.Enabled = True  'boton orden carga
 Me.b10.Enabled = False 'boton calibradora
End If


If DCount("*", "Comprueba existe usuariolocal") = 0 Then
    If DCount("*", "Comprueba si antes estaba registrado") > 0 Then
        DoCmd.OpenQuery "Recupero usuario local", acViewNormal
        DoCmd.OpenQuery "Descargar mensajes para mi", acViewNormal
        Me.btnsms.Visible = True
        'MsgBox "La máquina ya estaba registrada anteriormente, se ha recuperado la información del registro local. NombrePC: " & atCNames(2), vbInformation, "Información"
    Else
      Me.btnsms.Visible = False
      Exit Sub
   End If
End If

DoCmd.OpenQuery "Descargar mensajes para mi", acViewNormal

If DCount("*", "Compruebo si tengo nuevos mensajes urgentes") > 0 And DCount("*", "compruebo si tengo nuevos mensajes") > 0 Then
    Me.btnsmsurgente.Visible = True
    Me.btnsms.Visible = False
    Me.btnsmsnuevo.Visible = False
End If
                
If DCount("*", "Compruebo si tengo nuevos mensajes urgentes") = 0 And DCount("*", "compruebo si tengo nuevos mensajes") > 0 Then
    Me.btnsmsurgente.Visible = False
    Me.btnsms.Visible = False
    Me.btnsmsnuevo.Visible = True
End If
                
If DCount("*", "Compruebo si tengo nuevos mensajes urgentes") = 0 And DCount("*", "compruebo si tengo nuevos mensajes") = 0 And DCount("*", "Comprueba existe usuariolocal") > 0 Then
    Me.btnsmsurgente.Visible = False
    Me.btnsmsnuevo.Visible = False
    Me.btnsms.Visible = True
End If

If DCount("*", "Compruebo si tengo nuevos mensajes urgentes") = 0 And DCount("*", "compruebo si tengo nuevos mensajes") > 0 And DCount("*", "Comprueba existe usuariolocal") > 0 Then
    Me.btnsmsurgente.Visible = False
    Me.btnsmsnuevo.Visible = True
    Me.btnsms.Visible = False
End If


Publicado por: Sheerkhan
Fecha de publicación: 06/Febrero/2024 a las 18:34
Hola.
En mi humilde opinión, si crees que el problema te viene por acceder demasiadas veces a las tablas... ¿no te serviría cargar un recordset?
De ese modo solo accederías una vez, no cada vez que quieres consultar algo.

Otra sugerencia, si es posible, cambiar todos esos "If DCount("*"" por algun tipo de "Select case", de ser necesario con un "for each", creo que con eso podrías evitar algunas llamadas If.

¡Ojalá te sirva alguna de mis sugerencias!

Saludos 
Sheerkan




Imprimir página | Cerrar ventana