Visualizar fotos en un formulario Access 2003

Me gustaría saber cómo puedo visualizar fotografías en un formulario Access 2003, para que no me ocupen demasiada memoria de la base de datos, mi pregunta es, ¿Cómo puedo "enrrutar" una imagen para que se muestre en un formulario de forma "automática", teniendo las imágenes guardadas en una carpeta aparte?.
Gracias de antemano.
{"lat":39.3682791491601,"lng":-3.515625}

2 respuestas

Respuesta
2
Dame un ratito y te lo comento detenidamente. (Acabo de llegar de trabajar mucho, mucho...)
Perdona por la espera.
Vamos a ir por lo básico y posteriormente lo podremos complicar (mejorar para el usuario).
Crea una tabla, en la cual introduces la ruta de las imágenes. Lógicamente, crea una relación con la tabla principal (id por ejemplo).
En el formulario principal creas un control (cuadro de texto por ejemplo) que visualice esa ruta diferente para cada registro. Cuando compruebes que es así, lo puedes poner en visible=no.
Crea un control imagen, con el tamaño que te parezca oportuno y con la forma de mostrar la imagen que te apetezca (generalmente "extender").
Luego sólo tienes que poner en el evento del formulario "al activar registro" lo siguiente:
me.mi_imagen.picture = Me.rutaimagen
Lógicamente cambia "mi_imagen" por el nombre del control imagen que hayas insertado y "rutaimagen" por el control que contenga el texto de la ruta.
Prueba esto, si te funciona, dale vueltas. Y luego si quieres puedes plantear como escoger la ruta de la foto, con un cuadro de dialogo de Windows, sin tener que escribirla a mano.
E incluso posteriormente, como relacionar las fotos con su registro correspondiente, simplemente poniendo el nombre del archivo de la foto igual que un campo de tu formulario.(Esto lo tengo hecho por ahí pero tendría que buscarlo entre mi "marabunta" de BD).
Hola, veras.. tengo algunas dudas
Cuando dices "Crea una tabla, en la cual introduces la ruta de las imágenes", en la tabla que ya tengo diseñada hay un campo donde incrustaba las fotos con formato de Objeto Ole, ¿se pueden introducir en ese campo las rutas de las imágenes?, ¿La ruta es el lugar donde esta ubicada la fotografía? , por ejemplo Mis documentos/mis imagenes/1.jpg
El campo al que nos referimos, ¿tiene qué ser Objeto Ole, o un campo de "texto" normal?
Cuando tenga esto claro seguiré con las dudas. Pensaba que esto de las fotos iba a ser más fácil.
Muchas gracias
Un saludo.
Antes de nada decirte que es fácil.
El campo que contenga la ruta tiene que ser un campo de texto normal, no OLE. La ruta es como tu dices, pero ponla completa "c:\mis documentos/mis imagenes/ 1.jpg"
Y decirte que cuando vayas probando y veas los resultados, veras que funciona perfectamente. Luego como te dije en mi anterior mensaje se puede "mecanizar" para que sea menos costoso, pero eso es otro tema. Primero hay que entender como funciona.
Hola nuevamente, de momento creo que lo voy entendiendo... pero no me sale, todavía soy algo ignorante es esto.
Aver.. modifiqué el campo Ole por un campo de texto, al escribir la ruta c:\documents and settings\jose antonio\mis documentos\mis imagenes\1.jpg, no me dejaba escribir todo completo ya que un campo de texto solo puedes "creo" escribir hasta 52 caracteres.
¿Se puede poner en vez de un campo de texto, un campo "memo"?, ya que "creo" admite más caracteres.
¿Se puede, escribir la ruta poniendo solamente c:\mis documentos\mis imagenes\1.jpg? o por el contrario hay que escribirla entera.
Y por ultimo, de momento, ya que tengo más dudas...¿hay qué escribir la ruta con la barra inclinada a la izquierda o a la derecha, es decir "\" o "/"?
Todo esto te lo pregunto porque en el control del formulario principal, donde me dices que se debe visualizar la ruta diferente para cada registro, no la puedo visualizar.
Gracias, nuevamente por tu ayuda.
Un cordial saludo.
- Un campo de texto admite hasta 255 caracteres, que para nuestro caso suele ser suficiente. (Sólo tienes que cambiar el tamaño en vista diseño de la tabla en cuestión). Nunca he hecho la prueba pero supongo que también se puede hacer con un campo memo (que admiten hasta 65.536 caracteres).
- Para el tema de la ruta vamos a ir un paso más allá. Pon la carpeta donde tengas las fotos en el mismo directorio donde tengas la BD.
En el evento current del formulario pones:
dim Ruta as string,RutaError as string
ruta=currentproject.path & "\NombreCarpeta\" & me.nombre_campo_ & ".jpg"
rutaError=currentproject.path & "\NombreCarpeta\ErrorFoto.jpg"
If len(dir(Ruta))>0 then
   Nombre control imagen.Picture=ruta
else
    Nombre control imagen.Picture=rutaEror
end if
Con eso en el campo "nombre_campo" sólo tienes que poner el nombre de la foto.
Ahora no tengo tiempo, luego te explico el porque
Hola, ... estoy muy perdido y no se por donde empezar.
En la explicación anterior, para poder visualizar la foto, tengo que crear un control de imagen... ¿nos referimos a un marco de objeto independiente o un marco de objeto dependiente o un campo de objeto ole?.
Creo que es más "practica" la segunda opción que me das. Pero no encuentro el evento "curren" del formulario.
Ya estoy aquí. Perdona por mi último mensaje pero me tenía que ir.
Me refiero a un objeto "imagen" (en la barra de herramientas, el icono que representa una montaña y un sol, o algo parecido). Cuando lo insertes, te pedirá que escojas una imagen, escoge una cualquiera, ya que luego las cambiaras por código.
Yo te comente el primer método para que irías viendo el procedimiento (es la mejor manera de aprender y que no se olvide).
El segundo ejemplo es porque evitas meter toda la ruta (aunque también se puede hacer escogiendo el archivo normalmente), pero además cubres un problema: cuando un registro no tiene foto relacionada. Cuando esto es así el control imagen sigue mostrando la última foto válida.
Por eso tienes que "construir" una foto para el caso en que el registro no tenga la foto. (La que quieras o hacer una con cualquier editor de fotografía y solo pones como texto "NO HAY FOTO", por ejemplo, ese depende de ti (en el código que te pase se llama "errorfoto".
Perdón, el evento "current", es el que en propiedades del formulario se llama "al cargar registro"
Hola. Ya estamos por aquí. Veras... he creado el control de foto como me has dicho, he escogido una foto y efectivamente se ve en el "marco del control", hasta aquí estupendo. Ahora bien, en los "Eventos del formulario" aparece un evento que dice ( Al cargar...) y otro (Al activar registro...). He escrito en el que dice Al cargar... el código:
dim Ruta as string,RutaError as string
ruta=currentproject.path & "\articulos\" & me.articulo a & ".jpg"
rutaError=currentproject.path & "\NombreCarpeta\ErrorFoto.jpg"
If len(dir(Ruta))>0 then
   Nombre control imagen.Picture=ruta
else
    Nombre control imagen.Picture=rutaEror
end if
Lo he escrito tal cual está aquí escrito, no se si debo quitar las comillas o no, sustituyendo NombreCarpeta, por artículos y nombre_campo_ por articulo.
Me da un mensaje de error que dice textualmete:
Microssoft Office Access no puede encontrar la macro ´dim Ruta as string,RutaError as string ruta=currentproject´.  La macro (o su grupo de macros) no existe o la macro es nueva pero no se ha guardado. Observe que cuando introduce la sintaxis nombre_grupo_macro.nombre_macro en un argumento, debe especificar el nombre con el que se guardó por última vez el grupo de macros de la macro.
Por último comentarte que en el campo de texto de la tabla, introduje el nombre de la foto en este caso 05, sin la extensión .jpg, no se si es necesario poner jpg, probé de las dos maneras y seguía saliendo el mensaje de error.
Perdona mi torpeza. Seguro que es fácil pero no termino de aclararme.
Un Saludo.
El código debes "escribirlo" en el evento "al activar registro". Cuando digo escribirlo no quiero decir directamente, hay sólo se hace si previamente has creado una macro e introduces su nombre.
En ese evento (al activar registro) haz click como si fueses a escribir algo y veras a la derecha "...", pincha sobre ellos y de las opciones que te da seleccionas: Generador de código y le das a aceptar.
Verás que te abre el editor de código con las siguientes líneas ya puestas:
Private Sub Form_Current ()
End Sub
Es entre estas dos lineas dónde debes escribir el código que te dí.
El nombre del archivo en el campo lo debes escribir sin la extensión ".jpg" ya que si te fijas está va en el código y el porque pongo la extensión en el código te lo explico más adelante, si quieres, cuando te salga el presente código
De nuevo perdona, en el anterior mensaje se me ha olvidado comentarte una de tus preguntas y un error que he visto en el código que has puesto.
Por tu código supongo que la carpeta que contiene las fotos (y que esta en el mismo directorio que la Bd, se llama ARTÍCULOS . Es en esta carpeta dónde debes tener un archivo con formato .jpg que se mostrara cuando no haya foto definida para el registro.
Entiendo que el campo que contiene el nombre del archivo de la foto es ARTICULO. Siendo así el código quedaría EXACTAMENTE de la siguiente manera:
dim Ruta as string,RutaError as string 
ruta=currentproject.path & "\articulos\" & me.articulo & ".jpg" 
rutaError=currentproject.path & "\articulos\ErrorFoto.jpg" 
If len(dir(Ruta))>0 then 
   Nombre control imagen.Picture=ruta 
else 
    Nombre control imagen.Picture=rutaError 
end if

En código VBA (cómo en todos los códigos) el cambio de una letra o signo, alteran totalmente el resultado.
Hola, nuevamente. OK. he conseguido dar un paso más, he introducido el código correctamente, para no equivocarme he copiado el texto desde aquí y lo he pegado entre las dos lineas Private sub from _curren() y end sub.
Me da un mensaje de error que dice: Error de compilación: Error de sintaxis.
En el código, me marca en "azul remarcado", el segundo párrafo, es decir.
ruta=currentproject.path & "\articulos\" & me.articulo & ".jpg" 
Cuando el hago clic en aceptar del mensaje de error, se remarca en amarillo con una flecha amarilla a la izquierda, la linea, Private sub from _curren().
Lo conseguiremos...
Un saludo y muchas gracias
Perdón, olvidé comentarte que las lineas
Nombre control imagen.Picture=ruta 
Nombre control imagen.Picture=rutaError
Están en color rojo, no sé si significará algo.
Gracias
Un saludo.
Hola, ok, creo que ya he solucionado la parte de la última consulta, la referente a Nombre control imagen.Picture=ruta
Nombre control imagen.Picture=rutaError
He sustituido "nombre control imagen" por el nombre del control de imagen donde se visualiza la foto seleccionada anteriormente. Llamándose este control COLOR.
Lo demás sigue dando error.
Gracias.
Prueba con:
ruta=currentproject.path & "\articulos\" & me.[articulo] & ".jpg"
Hola, buenos días. He probado con [ ], y el párrafo ha cambiado de color, ahora es negro... parece que la cosa va bien. Pero no termina de funcionar.
Ahora me da un mensaje de error en COLOR.Picture=ruta, en el parrafo se ve remarcado en azul ".Picture=", y el mensaje de error dice así: Error de compilación. No se encontró el método o el dato miembro.
Muchas Gracias por tu rapidez y paciencia.
Un saludo.
Creo que eso quiere decir que COLOR no es un control de imagen, por eso Access te dice que no se encontró el método (Ya que "picture" es una "cualidad" de un objeto imagen.
Pero para saberlo: cuando pones COLOR y posteriormente el . (punto), ¿No te sale una lista tipo cuadro combinado para que elijas una acción? ¿Esta en esa "lista" la cualidad "picture". Si no es así no estas hablando de un cuadro de imagen.
Hola, veras... esto va mejor.
Con el formulario en vista normal, el control me sale con el nombre COLOR, si pongo el formulario en vista de diseño me sale el nombre como imagen48, lo he cambiado y ahora si me sale en la lista desplegable Picture, con COLOR no salia.
Ahora si se ve la foto, pero hace algo raro (al menos eso creo). Veras, si en el campo, borro el nombre de la foto, ésta se sigue viendo y tengo que cerrar la base de datos y abrirla de nuevo, entonces ya no se ve la foto.
Otra cosa es que si paso de un registro a otro que no tenga foto, en vez de salir la foto seleccionada en un pirncipio la que dice "NO HAY FOTO", no se ve, se sigue viendo la foto del registro anterior.
Además sale una ventana que dice: Se ha producido un error en ´2220´en tiempo de ejecución. Microsoft Office Access no puede abrir el archivo ´c:/ "ruta" y termina diciendo en la ruta /articulos/articulo/Errorfoto.jpg, debajo salen las opciones de Finalizar, Depurar, Ayuda.
Si hago clic en depurar, me devuelve a la fórmula, y sale resaltado en amarillo, imagen48.picture=rutaError
Gracias, espero haberlo explicado bien.
Un saludo.
1º - No "salia" porque el control se llama "imagen48" no "COLOR".
2º - Cuando cambias datos en un formulario estos no se hacen "efectivos" hasta que no cambias de registro, cierras el formulario o haces un "refresh".
3º - Ese es precisamente el error que se intenta solucionar con el código. Si te da el error de salir la del registro anterior algo tienes mal, y creo que es lo que pongo en el punto 4.
4º - Access no te esta dando ningún error de código. Te esta diciendo que no puede encontrar la ruta que tu le has puesto. Mira bien que todo coincida (un acento, una separación...) hace que no funcione (no sólo en este apartado, sino con cualquier código que escribas)
Y por último y si te puede servir para encontrar el error: si has puesto el codigo tal cual te he dicho, no te puede dar ese error: Access no puede abrir el archivo c:/"ruta"<span style="font-weight: normal;">, ya que ruta en el código que te he pasado es una "variable" que guarda la "ruta".</span>
<span style="font-weight: normal;">En resumen, mira que el código este bien introducido y comprueba las rutas escritas en el código y las reales. Por ahí tiene que estar el fallo.</span>
<span style="font-weight: normal;">Un saludo.</span>
Hola, buenos días. Haré un resumen de la ubicación de los archivos.
En el escritorio, una carpeta con el nombre "Prueba BD fotos", dentro de ella, el archivo de la base de datos y una carpeta, con las fotos de los artículos con nombre "articulos". Dentro de la carpeta con las fotos de los artículos, he introducido la foto que saldrá cuando al registro no se le ha incluido foto, "es la foto con un texto que dice NO HAY FOTO", esta foto tiene como nombre "00.jpg". He repasado las rutas y creo que está todo correcto.
La fórmula te la copio tal cual ésta:
Private Sub Form_Current()
Dim Ruta As String, RutaError As String
Ruta = CurrentProject.Path & "\articulos\" & Me.[articulo] & ".jpg"
RutaError = CurrentProject.Path & "\articulos\ErrorFoto.jpg"          
If Len(Dir(Ruta)) > 0 Then
   Imagen48.Picture = Ruta
Else
   Imagen48.Picture = RutaError
End If
End Sub
Estoy preparando las maletas, voy un par de días a Valencia. El miércoles por la noche, muy tarde o el jueves, estaré por aquí nuevamente.
Un Saludo y muchas gracias.
Pues para cuando vuelvas.
Te sigo diciendo lo mismo, si access dice que no encuentra la ruta, pues eso, que no la encuentra.
Comprueba lo de los acentos etc...
Y, donde puede estar el fallo, comprueba la extensión de los archivos. Un archivo determinado es "foto1.jpg" o es "foto1.jpeg" o es "foto1.bmp"
Para probar en el código que has escrito cambia la línea:
Ruta = CurrentProject.Path & "\articulos\" & Me.[articulo] & ".jpg"
por esta otra
Ruta =CurrentProject.Path &"\articulos\"me.[articulo]
Y en el campo me. Articulo, pon el nombre completo del archivo:" fotomia_jpg"
Hola, buenas... acabo de llegar de Valencia, estaba deseando llegar para comentarte que me llevé el pc, y estuve anoche hasta las 3:30 horas dándole vueltas a la BD. Y ya he encontrado el error. Cuando el sueño empezaba a dominarme, se me encendió una bombilla, y esto ya funciona correctamente.
Veras, el error me lo daba al "cargar" la foto NO HAY FOTO (que fue la foto que seleccioné al crear el control de imagen), por que las demás fotos que ponía el nombre si salían correctamente. Entonces dandole vueltas al último párrafo del código..... Eureka, donde dice RutaError, lo borré y escribí la ruta de la foto del error (NO HAY FOTO), quedándo entonces así "imagen48.Picture= c\ documents and setting\jose antonio\mis documentos\articulos\articulo\00.jpg
Cuando cambio a un registro sin foto, ya no da el error, saliendo entonces la famosa foto con un texto que dice NO HAY FOTO. El caso es que perdí el sueño y no pude casi dormir de lo contento que me puse. Por lo tanto "prueba conseguida".
Pero me gustaría por último dar un paso más, y es que hay artículos (no todos) que tienen dos perspectivas, dos imágenes para poder diferneciarlas mejor. ¿Hay qué modificar la fórmula?... supongo que al igual que antes, hay que crear un campo de texto, ¿un control imagen y después ...?
¿Si grabo la base de datos(la carpeta completa) en otro pc, me funcionará igual, o hay que cambiar las rutas otra vez?.
Gracias, por todo.
Un Saludo
Es normal que no te funcionase. Para que puedas aplicarlo como y donde quieras paso a explicarte el código muy ligeramente: (En negrita el código, en cursiva los comentarios)
dim Ruta as string,RutaError as string  
<span style="font-weight: normal;">Declaramos 2 variables, "Ruta" y "RutaError"</span>
ruta=currentproject.path & "\articulos\" & me.articulo & ".jpg"  

<span style="font-weight: normal;">Le damos valor a la primera variable.  "Currentproject.path" es el directorio donde se encuentra la BD. "articulos" es la carpeta que contiene las fotos. "me.articulo" es el nombre del campo donde introduces el nombre de la foto. ".jpg" le asignamos la extensión. (Como te comente tiene una lógica que si quieres te la explico posteriormente"</span>
rutaError=currentproject.path & "\articulos\ErrorFoto.jpg"  

Exactamente lo mismo que lo anterior.

If len(dir(Ruta))>0 then  

<span style="font-weight: normal;">Comprobamos si existe una foto. Si existe hacemos lo siguiente:</span>
   Nombre control imagen.Picture=ruta  

<span style="font-weight: normal;">Le damos al control imagen el valor picture de la variable ruta.</span>
else  
    Nombre control imagen.Picture=rutaError  

<span style="font-weight: normal;">Si no hay foto le damos al control imagen el valor picture de la variable RutaError.</span>
end if

Por ello, es lógico lo que hacia access. Buscaba en el directorio de la BD la foto "00.jpg" y no la encontraba, ya que esta se encuentra, según tu, en c:/documents and setting/...
Ahora a lo que preguntas:
Si quieres tener dos imágenes, sólo tienes que repetir el proceso: crear otro control de imagen, donde te venga bien, otro cuadro de texto que guarde la ruta, y crear el mismo código pero con diferentes nombres ( en vez de darle a la variable el nombre "ruta" dale "ruta2" etc...
<span style="white-space: pre;"> </span>Si copias la BD en otro PC te funcionara exactamente igual siempre que:
-Copies todo el directorio, es decir, el directorio que contiene la BD y en tu caso la carpeta "articulos"
- Dejes el código tal cual te lo pase, metiendo la foto "00.jpg" en la carpeta "articulos"y en tu caso cambiando la siguiente linea
rutaError=currentproject. path & "\articulos\00.jpg"
Con eso debería funcionarte en cualquier ordenador.

Hola, buenas tardes, ya he creado la otra imagen, con la fórmula copiada, poniendo "2" en las variables, funciona correctamente, sin problemas.
Ahora bien, he cambiado la linea
RutaError = CurrentProject.Path & "\articulos\00.jpg"
Como veras he puesto "00.jpg", he instalado la BD en el pc del trabajo y no funciona, da error al "cargar" la imagen NO HAY FOTO, porque no encuentra la ruta. He cambiado la ruta en las lineas
Imagen48.Picture = c:\ etc.., escribiendo la nueva ruta. Una vez realizado esto, funciona correctamente.
La foto 00.jpg, está dentro de la carpeta "artículos".
Todavía me queda una pregunta y cerramos este post, si podemos conseguir que al grabar el archivo en otro pc, no haya que cambiar la ruta.
Gracias, un saludo.
Bueno, creo que es suficiente, he solucionado el tema de las fotografías y me doy por satisfecho.
Te agradezco de corazón la paciencia que has tenido conmigo, me ha sido de mucha utilidad tu ayuda.
GRACIAS por todo. Un abrazo, amigo experto.
PD. Me quedo con ganas de invitarte a una cerveza.
Respuesta

Yo tengo una situación similar, es para una base de datos de empleados, sin embargo, estoy siguiendo sus indicaciones, pero me genera el erro "52" y dice "Nombre o número de archivo incorrecto" sin embargo, le doy en la opción "Depurar" y me marca en amarillo la siguiente linea:

If Len(Dir(Ruta)) > 0 Then

Mi código completo es el siguiente:

Dim Ruta As String, RutaError As String
Ruta = CurrentProject.Path & "W:\RRHH\Fotografías" & Me.Id_Empleado & ".bmp"
RutaError = CurrentProject.Path & "W:\RRHH\Fotografías\ErrorFoto.bmp"
If Len(Dir(Ruta)) > 0 Then
OLEIndependiente1947_.Picture = Ruta
Else
OLEIndependiente1947_.Picture = RutaError
End If

Ojalá me puedan apoyar para saber como puedo avanzar !

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas