Nombrar archivo de imagen usando valores de 2 campos
Tengo una BD ubicada en la misma carpeta que las imágenes que inserto en un form, todas ellas en .jpg y tienen como nombre los valores del campo"ID" (autonumérico) del formulario.
Lo que necesitaba es que estos archivos tuvieran como nombre no solo el "ID" sino también el valor del campo "TITULO" asociado al "ID" de cada registro.
Es decir que si estoy en un registro con ID= "1" y TITULO="El retrato de Dorian Gray" la imagen de nombre "1" pase a llamarse:
"1 - El retrato de Dorian Gray"
Un saludo y agradecido de antemano por la ayuda
1 respuesta
¿Cómo haces para poner el nombre a las imágenes, manualmente o por código?
¿O lo que pretendes es únicamente renombrar todas las imágenes de la carpeta?
Me dices y seguimos...
Lo que quería en un principio era poner con código nombre a las 100 imágenes pero luego pensé que no habría forma de dar automáticamente el nombre que quiero a una imagen determinada hasta que no la visualizo y la distingo como la correcta para ese registro, puesto que solo puedo darle nombre si la veo y la reconozco, por tanto me obliga a hacerlo manual. Es un poco difícil de explicar... perdóname.
Por ejemplo:
Cómo podría indicar por código que de una carpeta de 100 imágenes una en concreto se va a llamar "1 - El retrato de Dorian Gray" y que esto es el resultado de la concatenación de los valores de 2 campos y un guión en medio. La única manera de reconocer cuál es la imagen adecuada para el registro con el libro "El retrato de Dorian Gray" es viéndola y por tanto eso me obliga a nombrarla manualmente o eso creo.
Si tu ves alguna opción por código a nombrarlas y que su nombre sea el resultado de los valores de 2 campos ID y TITULO separados con guión, pues sería genial y si no pues la idea sería nombrarlas manualmente con el ID y luego renombrarlas con el ID - TITULO eso ya de manera automática, con código.
Un saludo y te agradezco tu paciencia Sveinbjorn.
Ok. Te estoy preparando un ejemplo, con un código que te renombre las existentes y otro para cargar las nuevas y renombrarlas.
Aquí te dejo el ejemplo.
Verás que una vez descomprimido, junto a la BD hay una carpeta (Caratulas) que contiene 5 archivos jpg (del 1 al 5) y otro archivo jpg suelto (6).
La BD tiene una tabla (TLibros) y los archivos de la carpeta se corresponden con los 5 primeros registros.
Los formularios te diría que los abras y analices en este orden que comento.
El primer formulario que debes abrir es FLibros-previo, donde puedes comprobar que las imágenes se cargan tal como están (con los nombres 1.jpg, 2.jpg...)
En el formulario FLibros, verás que hay un campo "Portada" (que también está en la tabla) y que en tu formulario estaría oculto (propiedad visible:No), que recomiendo que agregues a tu tabla, pues facilita el código y evita algún error con los tipos de formato (jpg vs jpeg, por ejemplo)
En este formulario las imágenes se cargan en función de los valores de ese campo.
Además verás que hay un botón que nos permite cargar una nueva imagen, la guarda en la carpeta y la muestra en el control imagen.
Si prefieres mover el archivo, usa "arch.Move" en vez de "arch.Copy" en el código del botón.
Para que veas cómo funciona, carga el archivo suelto en el registro 6.
Por último, el formulario FRenombra, hace lo que pides en un principio, al pulsar el botón te renombra todos los archivos de la carpeta según los dos campos (ID y Titulo), y además actualiza el campo portada de la tabla. En el código te dejo indicado lo que debes cambiar si optas por no usar ese campo.
Ten en cuenta que para que los códigos funcionen has de registrar las dos librerías que te indico en el código( Microsoft Scripting Runtime y Microsoft Office x.xx Object Library).
Además el código del botón está pensado para usar una única vez, existiendo en la carpeta archivos con los nombres como dices (1.jpg, 24.jpg...). Si no fuera así, es probable que te salte algún error, o no te renombre todos.
Ante todo gracias por la ayuda y tu tiempo
Cuando presiono sobre el ejemplo me lleva a bigfile pero me indica que el archivo ha sido eliminado (file has been deleted)
Podrías mandarlo otra vez.
Un saludo y gracias por todo
Ahí te va de nuevo.
Vaya, se me olvidó decirte que estoy en Access 2003 y no puedo abrir archivos accdb del 2007. Pero el 2007 tiene la opción de guardar en versiones anteriores.
Podrías al guardar el archivo seleccionar la opción de guardado de 97-2003 para que así pueda abrirlo.
Mil perdones por darte la lata... Gracias
No sé por qué pensé que tenías access 2007... Versión 2003 marchando..
Lo primero decirte que te lo has currado y que no sé cómo agradecértelo porque la verdad es que has trabajado el código y repito mil gracias, sin palabras...
Comentarte algunas cosillas a retocar si es posible ...
Me gustaría insertar el botón de "Renombrar" en el formulario FLibros pero cuando lo hago no me funciona el código.
Si pudiera ser... necesitaría que para ejecutar el código del botón "Renombrar" siempre hubiera un valor en ID y Titulo y si estuviera vacío el campo Titulo saltara un mensaje tipo "falta el titulo" o algo así y no se ejecutara como ocurre con el botón "Cargar"
Me vendría bien que cuando creo un nuevo registro si por ejemplo es el registro 7 con ID="7" y solo tengo 6 imagenes con nombres del 1 al 6 en la carpeta, al no haber imagen con nombre "7" al renombrar me apareciera de portada una imagen en blanco con el texto "Sin Foto" cuyo nombre podría ser "0" por ejemplo porque nunca tendré ese valor en el "ID" autonumerico. (No hace falta que me mandes esa imagen, me refiero al código a implementar en el botón "Renombrar")
Si puede ser aunque sé que es un textbox no visible podría no aparecer ".jpg" en el valor del cuadro de texto.
Un saludo y de nuevo gracias por tu ayuda.
1º/ Si pones el botón renombrar en tu formulario, y copias el código, te tendría que funcionar igual. Personalmente no lo haría, pues como te comentaba, está pensado para usar una única vez y renombrar los archivos que tienes con los números de ID. Si lo usas una segunda vez, te dará errores, pues la variable "miNombre" no va poder almacenar el nombre (ya no es un número, sino un texto), por poner un ejemplo.
2º/ Para eso, copia del código del botón cmdPortada las lineas hasta el "on error goto sol-err" (esta no la copies) y la peguas despues de las declaraciones de variables (las lineas que empiezan con Dim...)
3º/ Para poner la imagen "Sin Foto", la pones en tu carpeta de imágenes, y suponiendo que se llame "0.jpg", has de cambiaren el procedimiento Form_Current, dentro del bloque if la linea
Me.imgPortada.Picture = ""
por esta otra:
Me.imgPortada.Picture = "0.jpg"
La misma linea que está en el control de errores no la modifiques, pues si por cualquier motivo no encuentra ese archivo 0.jpg, te deja el marco en blanco y no salta error.
4º/ Lo del textbox que no muestre la extensión, sí se puede hacer, pero si lo vas a hacer así, no tienes sentido añadir el campo a la tabla, pues el nombre lo puedes construir con la combinación de los dos campos. Además no te soluciona el problema de que una imagen tenga una extensión distinta (jpg vs jpeg), con lo que el código para cargar la imagen en el formulario se te va al traste.
De todas formas, para guardar sólo el nombre, si la extensión, has de modificar esta parte, en el botón que carga las fotos:
'Guardamos el nombre en el campo
Me.Portada = miNombre & "." & miExtension
Por esta otra:
'Guardamos el nombre en el campo
Me.Portada = miNombre
Hola Sveinbjorn
La ventaja que le veo al botón Renombrar es que al presionarlo no solo me renombra las imágenes perfectamente sino que me las carga de portada en cada registro de forma automática y eso para mí es GENIAL.
Realmente sería el botón con el código adaptado que me gustaría usar. Con el botón Cargar sin embargo tengo que ir una a una buscando cada imagen y cargándola.
1º/Por eso quería ver si se puede meter en "Renombrar" el código para que si hay un registro nuevo, por ejemplo registro 7 y tengo 6 imágenes (nombradas del 1 al 6) al no encontrar la imagen con nombre "7" me cargue la foto con nombre "0" (la que te dije que aparece un texto que pone Sin Foto). Pero en vez de en el "Form current" en el propio botón Renombrar.
2º/Sobre lo que te comenté de que el botón Renombrar no funcionaba si lo pongo en el formulario FLibros... me he dado cuenta de que como bien dices sí funciona, pero solo al cambiar de registro o cerrar el form y volverlo a abrir. Si presiono el botón en el registro 1 aparentemente no hace nada, no aparece nada en control "Portada" pero si cambio de registro y vuelvo sí. A ver si se pudiera solucionar...
3º/Me comentabas que puede dar errores "Renombrar" si se usa una segunda vez porque ya no es numérico y contiene texto. Había pensado para salvar ese problema si se pudiera indicar en el botón que si al presionarlo contuviera texto vuelva a numérico (vamos que quite el texto del nombre de las imágenes y deje de nuevo el número... y una vez hecho esto prosiga con el código para númérico.
La idea sería tener todas las imágenes con el ID como nombre en una carpeta y luego presionar Renombrar y renombrarlas y cargarlas en cada registro y cuando creo un nuevo registro que no tiene foto cargar la foto con nombre "0". Todo eso hacerlo con el botón Renombrar al presionarlo.
Si no te viene bien ahora cuando puedas. Soy consciente que puede ser tedioso lo que te detallo. Gracias por todo.
A ver, que no nos entendemos...
La cuestión original es que tienes en una carpeta todas las imágenes con los nombres que coinciden con los IDs de los registros, y las quieres renombrar a este formato:
ID - Titulo
Pues eso precisamente es lo que hace el botón Renombrar, recorre todos las imagenes de la carpeta, busca el titulo correspondiente a ese ID y renombra el archivo. Además, almacena el nombre y extensión en el campo Portada.
La carga de imágenes en el formulario la hace el procedimiento "Form_Current" de FLibros, que lo que hace es que si el campo Portada no está vacío, carga la imagen de la carpeta que corresponde a ese nombre y extensión (el dato que tiene ese campo). Si está vacío, no carga nada (Me.imgPortada.Picture = "") o la imagen por defecto (Me.imgPortada.Picture = "0.jpg"). En caso de encontrar algún error (imagen no existe, normalemente) deja el control imagen en blanco (vacío)
El botón "Cargar portada" está pensado para cargar las nuevas carátulas (pues se supone que ya tienes las viejas renombradas) en los nuevos registros, o modificar una caratula ya existente. Este botón lo que hace es cargar la imagen en el cuadro, copiarla a la carpeta con el nombre correspondiente (ID - Titulo) y almacenar nombre y extensión en el campo Portada.
Comprueba que lo que te digo funciona perfectamente con el ejemplo que te mandé:
1º Renombra -> 2º Abre FLibros para ver que se cargan las imagenes -> 3º Carga la imagen 6 desde FLibros en el registro 6 -> Añade un nuevo registro y carga imagen.
Tu punto primero queda ya contestado (has de hacerlo vía form current), El punto tercero, no te va a funcionar por lo que te explicaba arriba (si ya has renombrado un archivo, te va a dar error de código). El punto segundo imagino que es porque no sigues el orden lógico (primero pulsas el botón renombrar para renombrar todos los archivos, que debería estar en un formulario independiente para ejecutarlo una vez, y luego ya abres el formulario FLibros, que ya tendrá el campo Portada con los nuevos nombres, y ya entra en funcionamiento el evento Form current para cargar las imágenes)
De todas formas, con añadir en el código del botón Renombrar de FLibros antes del exit sub esta linea, ya se te debería cargar la imagen:
Call Form_Current
Todo está solucionado gracias a tus consejos. Lo único que no se carga es la foto de nombre "0" . Le he puesto ese nombre en vez de "0.jpg" pero no se carga. He probado también con fotos de tu ejemplo y tampoco se cargan, da error.
Te pongo el código y cómo cambié la línea por la que me dijiste:
Private Sub Form_Current()
On Error GoTo sol_err
If Nz(Me.Portada, "") <> "" Then
Me.imgPortada.Picture = Application.CurrentProject.Path & "\Caratulas\" & Me.Portada
'Mi consejo es que guardes el nombre y extensión en un campo, por si te encuentras con archivos .jpg y .jpeg
'Pero si prefieres no hacerlo, usa esta linea en vez de la anterior:
'Me.imgPortada.Picture = Application.CurrentProject.Path & "\Caratulas\" & Me.ID & " - " & me.Titulo & ".jpg"
Else
Me.imgPortada.Picture = "0"
End If
Salida:
Exit Sub
sol_err:
'Si hay algún error, dejamos la imagen en blanco
Me.imgPortada.Picture = ""
End Sub
Podrías comprobar con tu ejemplo insertándote una foto de nombre "0" si a ti te carga.
Un saludo
- Compartir respuesta