Automatizar Datos Adjuntos Access 2007

Tengo una base de datos iniciada hace años en Access, que he ido actualizando siguiendo la evolución de Office. Recientemente he instalado Access 2007 y he descubierto la nueva utilidad de Datos Adjuntos, lo que me permite visualizar diferentes documentos (fundamentalmente imágenes en .jpg y documentos pdf) referidos a cada registro de una tabla, normalmente en la vista formulario.
Tengo almacenados los archivos de datos adjuntos en una carpeta no relacionada con la base de datos y el nombre de cada archivo coincide con el de los registros de la base de datos a los que deseo adjuntarlos, con la particularidad de que existiendo más de un archivo referido al mismo registro, están nombrados con el número seguido de una letra o palabra (ejemplo "7458 a", "7458 b", "7458 c", "7458 plano".
Me gustaría automatizar la unión de cada registro con los archivos existentes en la carpeta externa como datos adjuntos, en base a la común numeración de ambos, de manera que al abrir la base de datos, o el formulario o informe correspondiente, los registros dispongan como datos adjuntos de los que en cada momento existan en la carpeta de almacenamiento de los mismos.
El motivo es que genero un numero elevado de registros, así como de datos adjuntos, pero por métodos diferentes, lo hace dificultosa la tarea de insertar como dato adjunto archivo a archivo.
La investigación sobre la ayuda y la consulta a MSDN (que repito a continuación) no me ha permitido desarrollar lo deseado y estoy un poco perdido, no llegando a comprender la función práctica de los métodos "LoadFromFile" y "SaveToFile".
Agradecería consejos al respecto.
Adjuntar archivos a registros mediante programación
Office Access 2007 expone un modelo de objetos e interfaces de programación para adjuntar archivos a registros mediante programación utilizando código de Visual Basic para Aplicaciones (VBA). Para obtener información sobre cómo adjuntar archivos mediante programación, vea los artículos "LoadFromFile" y "SaveToFile", en Microsoft Developer Network (MSDN) : http://msdn.microsoft.com (sólo disponible en inglés).

2 Respuestas

Respuesta
1
Aquí te paso el link de una pregunta que me hicieron hace poco aquí en todoexpertos, espero que te sirva:
http://www.todoexpertos.com/mitodoexpertos/answer/2505528/datos-adjuntos
Solo creo que deberías cambiar el nombre del archivo para ir generando cada registro adjunto para cada uno de tus registros. Es cuestión de ir jugando con el código nada más.
Gracias Diego por la rapidez de tu respuesta.
Efectivamente, la manera habitual de añadir datos adjuntos a un registro de una tabla de Access 2007 ó 2010 es a través del control creado, bien el la tabla, bien en un formulario, es la de localizar el nombre del fichero que deseamos adjuntar.
En mi caso, utilizo una tabla (llamada "bienes") con más de 10.000 registros, dentro de una base de datos iniciada al menos hace diez años, generando unos 150 nuevos registros ("bienes") cada mes en dicha tabla.
Por otra parte dispongo de archivos '.jpeg' y '.pdf' almacenados en una carpeta del sistema, correspondientes a los "bienes" registrados en la tabla de Access y que precisamente tienen como nombre el número del registro del "bien" al que pertenecen o con el que se corresponden, con la particularidad de que si tenemos varios '.jpeg' o '.pdf' que se corresponden con el mismo bien, se nombran con el número del bien seguido de una letra (Ejemplo: 9548 a, 9548b, 9548c).
La posibilidad de incorporar como "dato adjunto" uno o varios ficheros a un registro supone un valioso complemento para mi base de datos, lo que justifica el esfuerzo metódico de relacionar "manualmente" cada nuevo registro con los correspondientes "datos adjuntos" o mejor, incorporar como "datos adjuntos" los nuevos archivos '.jpeg' o '.pdf' generados.
No obstante la informática tiene entre otros objetivos facilitar la "automatización" de las tareas administrativas y en este caso se trata de unir los registros de la tabla "bienes" con los archivos '.jpeg' o '.pdf' de manera que los coincidentes en el nombre puedan ser mostrados a través de un formulario o de un informe de Access. Puede que exista algún otro método informático de 'seleccionar' o 'filtrar' dichos archivos, pero ha sido al profundizar en la ayuda de Access en relación con su capacidad, iniciada con el 2007, de registrar "datos adjuntos" y su uso a través de formularios e informes, donde he encontrado (como señalo en mi pregunta inicial) el siguiente texto, cuyo alcance no llego a comprender si dichos 'métodos' serían válidos para la 'automatización' que desearía.
Adjuntar archivos a registros mediante programación
Office Access 2007 expone un modelo de objetos e interfaces de programación para adjuntar archivos a registros mediante programación utilizando código de Visual Basic para Aplicaciones (VBA). Para obtener información sobre cómo adjuntar archivos mediante programación, vea los artículos "LoadFromFile" y "SaveToFile", en Microsoft Developer Network (MSDN) : http://msdn.microsoft.com (sólo disponible en inglés).
Siento la extensión de mi pregunta, quizás no he sabido expresarme con más concreción y mi deseo es que Vd. conozca mejor el planteamiento de mi 'problema'.
En cualquier caso, gracias por su ayuda y su tiempo.
Pedro Martín.
Evidentemente la informática está hoy día catalogada como una opción de solución más que de problemas, y es ahí donde los pensadores como los programadores, analistas e ingenieros informáticos estamos inmersos.
La idea de lo que expones se puede hacer (vincular a cada registro un gran numero de datos adjuntos para ir mostrando en la propia ventana del formulario), y creo que de gran ayuda te será el link que te pasé para que puedas llevar a cabo eso. No obstante es importante ver cómo están organizados tus datos (tus archivos para adjuntar) si están en carpetas aparte o si están en un mismo directorio, o en subcarpetas, si están clasificados con algún id que te facilite adjuntar a cada registro, etc.
Si me dices cómo tienes organizado podremos ver el código o preparar el código que puedas utilizar para adjuntar. Lo que veo es que para cada registro tienes n ficheros que adjuntar, en este caso podríamos tomar el id de cada registro para relacionarlo y decirle que recorra todos los archivos 9548 y que los vaya cargando como adjunto, por lo cual es imperioso saber si estos archivos tienen algún tipo de id que los relacione al registro (es decir, ¿el 9548 es un Id de tu registro? ¿Y le correspondería el archivo 9548a, 9548b, etc?). Si eso me puedes facilitar, es pan comido y solo sería armar el bucle que recorra los archivos de ese registro.
Gracias nuevamente por tu respuesta y me alegro de que veas la solución tan cercana.
El primer lugar decirte que el link a que te refieres no me funciona, desconozco el motivo, por tanto no he podido acceder a la respuesta que citas.
Confirmando las puntualizaciones que mencionas en tu respuesta:
Los registros de la tabla principal tienen un Id autonumérico (ej: 9548)
Los archivos a vincular como datos adjuntos de la tabla principal se encuentran todos en una única carpeta del sistema (puede ser C:\Documents and Settings\Pedro\Mis documentos\Adjuntos) y no es que estén clasificados con algún id, es el propio nombre del archivo el que coincide con el Id del registro de la tabla con el que coincide.
En efecto tengo varios ficheros (.mpeg, .pdf, pero también podría tener .doc, etc...) para cada registro de la tabla principal, de manera que nombre se inicia con el mismo número del Id de dicho registro de tabla principal añadiéndole una letra diferenciadora en el caso de tener varios ficheros que se corresponden con el mismo registro principal (es decir, ¿el 9548 es un Id de mi registro y le correspondería el archivo 9548a, 9548b, etc?, aunque en algunos casos solamente existe un archivo 9548, sin letras).
Estoy estudiando poco a poco el desarrollo del Access 2007 y 2010, en relación con los datos adjuntos de que hablamos a fin de poder presentar impresos a través de un informe los datos adjuntos a cada registro, no solamente en un formulario, pero no lo tengo todavía maduro.
Gracias Diego
Usuario:
El link señalado funciona correctamente, seguro que no estas seleccionando bien la dirección en tu navegador. Debes seleccionar, copiar y pegar en una pestaña o ventana nueva de tu navegador.
Sin embargo, te paso un código para que utilices de prueba:
Preparar:
- Un formulario y dentro de él un botón llamado Command0
- Una etiqueta llamada lblbase
- Una etiqueta llamada lblmeter
- Haz una copia de tu tabla y llamalo Tablaprueba, también cambia el nombre de tu campo id (que no se como lo llamas) y ponlo Id.
- Abre tu formulario creado y en el evento al hacer click de tu botón copia y pega el siguiente código:
'---------------INICIO CODIGO------------------------
Private Sub Comando0_Click()
On Error GoTo mensaje
   Dim rs, rsArchivo As Recordset
   Dim i As Long
   Dim contador As Long
   Dim nombre_archivo As String
   Dim estado_archivo As String
   Dim longitud_id As Long
   'DEFINIMOS BD
   Set db = CurrentDb
   'DEFINIMOS TABLA EN LA CUAL VAMOS A ADJUNTAR
   Set rs = db.OpenRecordset("Tablaprueba", dbOpenTable)
   'CONTADOR DE REGISTROS DE TABLA
   contador = rs.RecordCount
   'DEFINIMOS CONTADOR PARA CICLO
   i = 1
   Do Until i = contador
    'DEFINIMOS ID DE REGISTRO Y LONGITUD PARA COMPARAR DESPUES
    id = rs.Fields("Id")
    longitud_id = Len(id)
    'NOMBRE DEL ARCHIVO LEIDO ACTUALMENTE
    nombre_archivo = Dir(CurrentProject.path & "\" & id & "*.*")
    'VERIFICAMOS SI EXISTE EL PATH ENVIADO
    If Verificar_Existe(CurrentProject.path & "\") Then
    Call updatemtr(i, contador)
    'COMIENZA LA COMPARACIÓN
    While nombre_archivo <> ""
        Total = Total + 1 'totaliza en nº de archivo
        estado_archivo = Left(nombre_archivo, longitud_id)
        If estado_archivo <> id Then
           GoTo otro
        Else
            Set rsArchivo = rs.Fields("Archivo").Value             'instanciamos el child
            rs.Edit                                                'ponemos en modo edición
            rsArchivo.AddNew                                       'le decimos que haga nuevo
            rsArchivo.Fields("FileData").LoadFromFile _
            CurrentProject.path & "\" & nombre_archivo             'archivo a adjuntar con el path
            rsArchivo.Update                                       'actualizamos primero el child
            rs.Update                                              'actualizamos el principal
        End If
        nombre_archivo = Dir
    Wend
otro:
    rs.MoveNext     'movemos al siguiente registro para seguir agregando
    i = i + 1       'cuenta incremental de i
    Else
        MsgBox "No existe el path definido por la aplicación!", vbCritical, "Mensaje"
        Exit Sub
    End If
   Loop 'volvemos al while
   Call updatemtr(i, contador)
   MsgBox "Documentos adjuntados exitosamente!!!", vbInformation, "Adjuntar documento"
   'cierra el ciclo y cerramos los recordsets
   db.Close
Exit Sub
mensaje:
    db.Close
    MsgBox Err.Description, vbCritical, "Error"  
End Sub
Private Function Verificar_Existe(path) As Boolean
    If Len(Trim$(Dir$(path))) Then
        Verificar_Existe = True
    Else
        Verificar_Existe = False
    End If
End Function
Sub updatemtr(currentamt, totalamount)
' This function changes the color based on progress.
' You set the back color of lblmeter to be a single color if desired.
Dim MtrPercent As Single
MtrPercent = currentamt / totalamount
Me!lblbase.Caption = Int(MtrPercent * 100) & "%"
Me!lblmeter.Width = CLng(Me!lblbase.Width * MtrPercent)
Select Case MtrPercent
Case Is < 0.33
Me!lblmeter.BackColor = 255 'red
Case Is < 0.66
Me!lblmeter.BackColor = 65535
'yellow
Case Else
Me!lblmeter.BackColor = 65280 'green
End Select
End Sub
'-----------FIN CODIGO--------------
Compilar, guardar, abrir formulario y hacer click en el botón del formulario creado.
Lo concerniente a verificación de datos y a personalización del módulo ya queda a tu criterio y a tu cargo.
Gracias nuevamente por tu respuesta y por la rapidez de la misma.
Necesito disponer de un poco de tiempo para proceder a la prueba sugerida.
Contestaré lo antes posible.
Hola Diego, ya he intentado aplicar el procedimiento que me has remitido, aunque por desgracia no he podido hacerlo funcionar.
Inicialmente el método no encuentra el control lblbase al hacer click sobre el Comando0 por lo que he deducido que no se debe tratar de "etiquetas" como señalabas, sino de controles independientes con ese nombre. Tampoco funciona aunque parece que avanza un poco más al aparecer un nuevo mensaje de error "el objeto no admite esta propiedad o método".
He intentado averiguar el punto de conflicto pero mis conocimientos de Visual no me permiten hacerlo correr si no es desde el botón de comando y no he visto nada.
Por otra parte, dentro de mis limitaciones, tengo la duda de cómo hemos definido el sitio donde debe buscar los archivos adjuntos, que no la veo definida, pero por si acaso, he incorporado algunos a mano a la tabla y he incorporado al formulario creado un control de Id y de datos adjuntos, por si la instrucción era válida al situar el formulario en un registro que ya tuviera incorporado algún archivo adjunto. El resultado de error ha sido el mismo y de ahí no he podido seguir.
Por otra parte, siento decirte que me ha sido imposible acceder a través del link que me enviaste a la consulta que mencionas. He probado desde dos ordenadores diferentes y con navegadores distintos (explorer y chrome) y no he conseguido nada. Por supuesto que copiando y pegando, pero también haciéndolo a mano.
Siento no haber podido aplicar, de momento, tu procedimiento, que hasta tiene contador...
Gracias otra vez por tu tiempo y esfuerzo, pasado y futuro.
Saludos
Pedro Martín
Perdón, mis PC's tienen instalado XP SP3 y Office 2007 SP2.
Saludos,
¿Puedes enviarme tu email? Así te envío lo que yo tengo preparado en una base de datos en formato Access 2007, y así solucionamos y puedes continuar con tu proyecto. ¿Te parece?
Faltaría más.
[email protected]
Gracias.
Disculpa, es [email protected]
Ok. Te estaré enviando entre esta tarde y esta noche.
Gracias, espero tu envío.
Ok
Respuesta
1
El problema es que una vez informado de la dirección de correo electrónico y finalizada la pregunta, el experto no terminó de contestar favorablemente la respuesta, por lo que ha quedado sin resolver mi problema.
De cualquier forma agradezco tu atención.
Hasta que parte vas y así miramos con seguimos
Gracias de nuevo por tu atención.
Como habrás podido comprobar consultando mi pregunta anterior en todoexpertos, el resto de los contactos se realizaron por correo directo, a cuyo efecto facilité al experto mi correo.
Conservo todos los correos y ficheros remitidos, los cuales puedo hacerte llegar de la forma que me indiques.
Mi correo electrónico es [email protected]
En espera de tu respuesta recibe un saludo.
Mi correo es [email protected]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas