Access - Almacenar errores en una tabla

 
Vista:
sin imagen de perfil

Almacenar errores en una tabla

Publicado por J T (12 intervenciones) el 05/10/2022 15:37:01
Hola.

Os cuento el problema que tengo a ver si me podeis ayudar.

Tengo una serie de fotos en mi pc distribuidas en varias carpetas y una tabla en access con 4 campos referidos cada uno a las carpetas y subcarpetas donde se encuentran. Asi la foto guardada en Z:\españa\toledo\talavera de la reina\foto1.jpg estaria guardada en esa tabla (llamada FOTOS) en CAMPO1=españa, CAMPO2=toledo, CAMPO3=talavera de la reina, CAMPO4=foto1.jpg

Debido a varias modificaciones realizadas he visto que varias fotos no están donde aparecen en la tabla y estoy intentando hacer un formulario que las vaya pasando una a una de tal forma que las que no pueda localizar queden registradas en otra tabla de nombre TABLAERRORES con un unico campo que es la dirección errónea.

Basándome en un código que he encontrato en este foro he escrito este código:

On Error GoTo sol_err
DoCmd.SetWarnings False
DoCmd.RunSQL ("DELETE FROM tablaerrores")
DoCmd.SetWarnings True

Dim rstAux As DAO.Recordset
Set rstAux = CurrentDb.OpenRecordset("tablaerrores", dbOpenTable)

Dim rst1 As DAO.Recordset
Dim carpeta1 As String, carpeta2 As String, carpeta3 As String, carpeta4 As String, cuantas As Long

Set rst1 = CurrentDb.OpenRecordset("SELECT * FROM FOTOS", , dbReadOnly)
cuantas = 0
Do Until rst1.EOF
carpeta1 = rst1!CAMPO1
carpeta2 = rst1!CAMPO2
carpeta3 = rst1!CAMPO3
carpeta4 = rst1!CAMPO4
Me!Imagen0.Picture = "Z:\" & carpeta1 & "\" & carpeta2 & "\" & carpeta3 & "\" & carpeta4
Me.Texto3 = carpeta1 & " \ " & carpeta2 & " \ " & carpeta3 & " \ " & carpeta4
cuantas = cuantas + 1
Me.Texto5 = cuantas

Siguiente:
rst1.MoveNext
DoEvents
Loop
rst1.Close
Set rst1 = Nothing
MsgBox " Proceso completado "

Exit Sub

sol_err:
With rstAux
.AddNew
.Fields(0).Value = "Z:\" & carpeta1 & "\" & carpeta2 & "\" & carpeta3 & "\" & carpeta4
.Update
End With
GoTo Siguiente:
End Sub




El problema que tengo es que el primer error que encuentra, lo incluye en la tabla de errores pero no así los sucesivos que generan que salga un mensaje de error deteniendo el proceso.

Agradezco de antemano la ayuda.

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Almacenar errores en una tabla

Publicado por Anonimo (3316 intervenciones) el 06/10/2022 03:52:58
Creo que el metodo tiene alternativas mas eficientes.

Se puede verificar con la funcion DIR si existe la foto en la ubicacion que le corresponde y si no existe dejar constancia de ello en una tabla, pero para ello no se necesita abrir la tabla, se puede utilizar una SQL.

Tambien se puede crear una lista de las fotos en cada directorio (con la funcion DIR nuevamente, esta vez utilizada de forma recursiva).

Lo que me parece mas complicado (sin visualizarla) es saber la ubicacion real de las fotos que puedan estar mezcladas a causa de los errores detectados.

Errores:
El primero esta en esta linea:
1
DoCmd.RunSQL ("DELETE FROM tablaerrores")

Deberia ser asi:
1
DoCmd.RunSQL ("DELETE * FROM tablaerrores")

El resto del código no lo he analizado, pero propongo este (no veras las fotos, pero es tiempo que ahorras):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim rst1 As DAO.Recordset, carpeta1 As String
CurrentDb.Execute "DELETE * FROM tablaerrores"
Set rst1 = CurrentDb.OpenRecordset("SELECT * FROM FOTOS", , dbReadOnly)
With rst1
If .RecordCount = 0 Then Exit Function '   <<== ( Function o Sub)
.MoveLast: .MoveFirst
Do Until .EOF
    carpeta1 =  "Z:\" & !Campo1 & "\" & !Campo2 & "\" & !Campo3  & "\" & !Campo4
    If Dir(carpeta1) = "" Then CurrentDb.Execute "Insert into tablaerrores ([el nombre del campo]) values ('" & carpeta1 & "')"
    .MoveNext
    Loop
.Close
End With
Set rst1 = Nothing
MsgBox " Proceso completado "
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Almacenar errores en una tabla

Publicado por J T (12 intervenciones) el 06/10/2022 11:24:57
Muchísimas gracias por tu respuesta. He probado el código y efectivamente es bastante más rápido que el que yo proponía. La única desventaja es que este código únicamente valida que exista el fichero en la ubicación donde debería estar pero hay otro problema (que no comenté en mi primer post) que es que hay veces que al intentar abrir la foto en un control imagen de access, da error aunque la ubicación sea correcta. Realmente desconozco el motivo por el que da ese error, no se si es debido al tamaño del archivo o a alguna otra causa. De ahí que en mi código hiciera que apareciera la foto en el formulario, para de esa manera tambien incluir entre los registros erróneos los que lo fueran por esa causa.
De ahí que seguiría necesitando ayuda para saber por qué en el código que indicaba unicamente se incluye en la table de errores el primer registro erróneo. O si se os ocurre cualquier otro código para solventar el problema, tambien sería bien recibido.
Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Eduardo

Almacenar errores en una tabla

Publicado por Eduardo (317 intervenciones) el 06/10/2022 15:20:27
Si dice que la ruta es correcta, pruebe adicionando está línea al comienzo

ON ERROR RESUME NEXT

No obstante, haga un seguimiento del código algo anda mal
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Almacenar errores en una tabla

Publicado por J T (12 intervenciones) el 06/10/2022 18:42:24
Me temo que añadiendo la linea de código que comentas no solucionamos el problema ya que (y me refiero al código original que indiqué en mi primer post) al producirse el primer error si que añade la linea en la tabla de errores pero no así al producirse los sucesivos, ya que en estos casos se detiene la ejecución y sale el típico mensaje de error en tiempo de ejecución de Access.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Almacenar errores en una tabla

Publicado por Anonimo (3316 intervenciones) el 06/10/2022 20:59:30
Un poco de luz despejaria la oscuridad ...

.- Que error o errores añadió en la tabla
.- Que error sale en el 'típico mensaje'
.- En que línea se para el código.

Hay errores que exigen solución concreta (por ejemplo, que no exista el archivo) y que impiden el resto de las acciones.

Personalmente evito el control de errores, los dejo que se delaten y aplico la solución para que no se repitan.

Si el actual error es que no encuentra el archivo, difícil será que se lo pueda asignar a un objeto imagen, por lo que lo correcto sería verificar de forma previa la existencia del archivo y considerar que 'el error' es que no exista (y guardar en la tabla errores la ruta del que se fugó).

Verificar la calidad de las fotos o el caso de que existan como archivo, pero este dañado y no se pueda utilizar, son errores para los que Access tiene pocas soluciones y (personalmente) lo verificaría 'de un vistazo' con el explorador de archivos
(Visualizando las miniaturas en las carpetas y 'apartando las frutas dañadas' a otra carpeta para después reciclarlas).

Como supongo que habrá una gran cantidad de imágenes para procesar ... habrá que tomárselo con calma para hacer limpieza (y copia de seguridad).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Almacenar errores en una tabla

Publicado por J T (12 intervenciones) el 07/10/2022 14:19:59
Hola nuevamente.

Intento contestar a lo que planteas:

- En la tabla de errres (basándome en el código original que puse en mi primer post) únicamente incluye un registro, independientemente del número de errores que haya. Me explico: he realizado pruebas modificando a propósito algún registro correcto de la tabla FOTOS a fin de que haya varios registros erróneos y como digo, a pesar de haber varios registros erróneos, unicamente incluye el primero de ellos en la tabla. Cuando encuentra el segundo, el programa se detiene y sale la típica ventana de error a la que hacía referencia en mi último post.

- En esa "típica ventana de error" lo que dice es: "Se ha producido el error 2220 en tiempo de ejecucion. Microsoft Office Access no puede abrir el archivo Z:\...... .jpg"

- El código se detiene en la línea Me!Imagen0.Picture = "Z:\" & carpeta1 & "\" & carpeta2 & "\" & carpeta3 & "\" & carpeta4

En cuanto a los errores que intento localizar, son de 2 tipos: por una parte la existencia o no de cada una de las fotos basándonos en los datos de la tabla FOTOS y por otra, como comentaba, la presencia de fotos que Access mediante el control Imagen no puede abrir. La causa de este segundo error la desconozco y mirando en la web no creo que nadie la tiene del todo clara. Lo que si he comprobado es que son imágenes que en el explorador de Windows se ven perfectamente y que al abrirlas con un programa, por ejemplo el Paint, guardarlas como bmp, abrir ese bmp y volverlas a guardar como jpg, queda solulcionado.

Me parece correcto el comentario que realizas de que primero se podría realizar un control de los errores producidos por nombre incorrecto, cosa que puedo hacer perfectamente mediante el código que me indicaste en tu primer mail, y una vez solucionados, pasar otro tipo de comprobación que me detectara el segundo tipo de error. Pero para saber qué fotos dan ese segundo tipo, la única forma que hay es hacer que aparezcan en un control imagen (porque ya digo que en el Explorador se ven perfectamente) y de ahí que haya escrito el código que puse en mi primer post, y en el que insisto que el problema es que únicamente incluye en la tabla de errores el primero que encuentra.

Espero haber aclarado las dudas y perdón por la amplitud del mensaje.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar