Discussion:
como manejar el error "no se pudo bloquear el registro"?
(demasiado antiguo para responder)
Juan Gustavo Fogelman
2007-07-04 01:41:26 UTC
Permalink
Hola gente
tengo unos 30 mdb con cientos de tablas y decenas de miles de registros en
cada uno...
a esos acceden varios mdb o mde con "aplicaciones", formularios, codigo y
esas cosas...
es muy raro que pase, pero de vez en cuando cuando procesan los registros
desde codigo me aparece ese mensaje de error...
se soluciona con "depurar" continuar...
aparentemente pasa porque otro mdb lo tiene bloqueado.
como hago para que eso lo maneje por codigo?

si hace falta mas informacion, puedo ponerla, no se si es necesaria
Gracias desde ya
José Mª Fueyo
2007-07-04 07:16:37 UTC
Permalink
Hola Juan Gustavo
¿Has capturado que número de error es? sí es así, puedes poner un control de
errores en tu aplicación. La primera linea de tu procedimiento debería ser
la instrucción "On Error goto [Etiqueta]", donde "Etiqueta es una etiqueta
cualquiera, que situarás al final de tu procedimiento, y seguido de ":"

on error goto MiError
....
...
Mierror:
If error.Number=[NumeroError] then
rexume next
else
msgbox "Se ha producido un error:" & vbcrlf & "Nº error: " &
err.number & vbcrlf & "Descripción: " & err.description
endif

Salu2
--
José Mª Fueyo
[MS MVP Access]
Juan Fogelman
2007-07-04 13:51:06 UTC
Permalink
Post by José Mª Fueyo
on error goto MiError
....
...
If error.Number=[NumeroError] then
rexume next
else
msgbox "Se ha producido un error:" & vbcrlf & "Nº error: " &
err.number & vbcrlf & "Descripción: " & err.description
endif
gracias
"rexume" = resume ¿?
jeje

resume next lo que hace es volver a intentar ejecutar la misma linea de
codigo?

gracias de nuevo y no te tomes a mal la correccion
Juan Fogelman
2007-07-04 14:25:15 UTC
Permalink
aqui me aparecio el error y lo pude ver

3050, no se puede bloquear el archivo
la linea en que lo tira es:
Set basedatos = DBEngine(0).OpenDatabase(numero.mdb")


esta bien que lo deje asi?


****
public function mifunction()
variables

on error goto MiError
Set basedatos = DBEngine(0).OpenDatabase(numero.mdb")
mi codigo
....
Mierror:
If error.number=3050 then
resume next
endif
end function
***

gracias
Patxi Sanz
2007-07-04 15:29:28 UTC
Permalink
Hola Juan:

Resume Next hace que la ejecución del código continúe en la siguiente línea
de la que tiró el error. Como en tu caso el error se produce al intentar
abrir una base de datos, podrías crear un contador, para realizar el intento
x veces. Por ejemplo:

Dim intContError As Integer

On Error Goto MiError

Set basedatos = DBEngine(0).OpenDatabase(numero.mdb")

Mierror:
If error.Number = 3050 then
intContError = intContError + 1

If intContError > 5 Then
MsgBox "Se han producido demasiados errores"
'Salir, cerrar, etc.
Else
'Volvemos a intentar abrir la base de datos
Resume
End If
Else
MsgBox "Se ha producido un error:" & vbcrlf & "Nº error: " &
err.number & vbcrlf & "Descripción: " & err.description
End If
--
Un saludo,


Patxi Sanz
patxisanz[ARROBA]yahoo[PUNTO]es
Tudela (NA)
Juan Gustavo Fogelman
2007-07-04 17:47:52 UTC
Permalink
se agradece la idea
en mi caso el error se produce (creo) porque otra mdb esta tratando de abrir
esta al mismo tiempo...
una vez que la otra mdb logro abrirla, en el segundo intento ya lo logra...
bueno, en cuanto termine de abrirla el primero

en mi caso quiero que siga intentando hasta que lo logre, tarde o temprano,
pero que de ninguna manera pare el proceso
el proceso dura horas... y a falta de multihilo en access, lanzo varios mdb
con procesos distintos que acceden en lectura a varias mdb con datos
comunes, y guardan sus datos en mdb "privadas"
de esa manera aprovecho mis 4 nucleos
y este error 3050 me impedia ausentarme de enfrente de la pc, porque cuando
ocurre, tengo que darle depurar, continuar.

de nuevo gracias


ahora, otra cosa:
esto se puede hacer de manera global, para no tener que poner el codigo en
cada una de mis funciones afectadas?

gracias
Patxi Sanz
2007-07-04 18:02:29 UTC
Permalink
Hola Juan:

Para tener un código "global", podrías crear una función pública en un
módulo, que fuera la encargada de abrir las bases de datos, y tratar ahí el
error, en vez de abrir las base de datos en cada una de las funciones.

Además, yo te aconsejaría poner un límite (me da igual 5 que 500), pero que
cuando llegue a ese límite te avise, para no acabar en un bucle sin fin, y
que no haya forma de saber por qué el ordenador se nos ha quedado "colgado".
--
Un saludo,


Patxi Sanz
patxisanz[ARROBA]yahoo[PUNTO]es
Tudela (NA)
Juan Gustavo Fogelman
2007-07-04 18:06:36 UTC
Permalink
Post by Patxi Sanz
Además, yo te aconsejaría poner un límite (me da igual 5 que 500), pero
que cuando llegue a ese límite te avise, para no acabar en un bucle sin
fin, y que no haya forma de saber por qué el ordenador se nos ha quedado
"colgado".
muy sabio lo tuyo

con el tema de abrir las bases globalmente, no me sirve por el tipo de uso
que le doy...
las abro y cierro a necesidad... es que son muchas muchas... y si no las
abro y cierro a necesidad, se ahora el sistema

te agradesco enormemente.
Patxi Sanz
2007-07-05 16:11:11 UTC
Permalink
Hola Juan:

Con lo de abrir las bases de datos, no me refería a abrir todas las bases de
datos a la vez, sino indicar qué base de datos quieres abrir, y que sea la
función la que lo intente, devolviendo un objeto Database si lo consiguió.
Por ejemplo:

Function AbrirBaseDatos(NombreBD As String) As DAO.Database
Dim intContError As Integer

On Error Goto MiError

Set AbrirBaseDatos = DBEngine(0).OpenDatabase(NombreBD)
Exit Function

Mierror:
If error.Number = 3050 then
intContError = intContError + 1

If intContError > 5 Then
MsgBox "Se han producido demasiados errores"
'Ir a la siguiente línea a la que ha producido el error
Resume Next
Else
'Volvemos a intentar abrir la base de datos
Resume
End If
Else
MsgBox "Se ha producido un error:" & vbcrlf & "Nº error: " &
err.number & vbcrlf & "Descripción: " & err.description
Resume Next
End If
End Function

Después de llamar a la función, deberás comprobar si el objeto que devuelve
está abierto o no.
--
Un saludo,


Patxi Sanz
patxisanz[ARROBA]yahoo[PUNTO]es
Tudela (NA)
Juan Gustavo Fogelman
2007-07-05 20:50:15 UTC
Permalink
muy interesante tu punto.
voy a tenerlo en cuenta en el diseño de esta aplicacion que aun sigue
eternamente en desarrollo.
no lo habia visto de esa manera

te agradesco
Patxi Sanz
2007-07-06 15:49:06 UTC
Permalink
De nada :)
--
Un saludo,


Patxi Sanz
patxisanz[ARROBA]yahoo[PUNTO]es
Tudela (NA)
José Mª Fueyo
2007-07-04 22:54:59 UTC
Permalink
Hola Juan
¡Nadie es perfecto! ;-)

Salu2
--
José Mª Fueyo
[MS MVP Access]
Juan Gustavo Fogelman
2007-07-04 19:19:03 UTC
Permalink
seguro que es error.number
no sera err.number
José Mª Fueyo
2007-07-05 10:31:22 UTC
Permalink
Cierto, es err.Number
Lo puse de memoria, Juan, sín tener delante un IDE de VBA. Perdona

Salu2
--
José Mª Fueyo
[MS MVP Access]
Juan Gustavo Fogelman
2007-07-05 10:50:14 UTC
Permalink
Post by José Mª Fueyo
Cierto, es err.Number
Lo puse de memoria, Juan, sín tener delante un IDE de VBA. Perdona
de perdona nada, que con tu ayuda encontre lo que buscaba...
de ultima lo que pretendo es que me digan donde buscar

de nuevo gracias
Loading...