Access, reportes. Base de datos de logos y que cambien en reportes en función del seleccionado

Estoy implementando una tabla de logos, en la que incluyo 3 columnas;

  1. Logo_ID; el identificativo
  2. Logo_Path; la ruta en la red
  3. Logo_File; el nombre del archivo con la extensión.

En un formulario me gustaría poder seleccionar el que me gustaría cargar en los reportes a través de un combobox "combo_SelectLogo", y al darle al botón para visualizar el informe me gustaría que apareciera el seleccionado.

También me gustaría purgar de la memoria del frontend los anteriores logos seleccionados para optimizar los tamaños de la base de datos. Hasta donde sé las imágenes se van quedando almacenadas en la base de datos para su uso.

El espacio que ocupa el logo (dimensiones ancho x alto) varía en cada reporte, así que el nuevo logo tendría que adaptarse a esa posición y dimensiones.

Cualquier ayuda sería de mucho agradecer.

2 Respuestas

Respuesta
1

Es mucho más sencillo hacerlo que explicarlo. Vamos a suponer que tengo una tabla Logos con los campos IdLogo, Ruta, Archivo(aunque éste último no sería necesario). Con ella construyo un formulario, da igual único o continuo( aprovecho para poner también el combinado ElegirLogo)

Cuando pongo el cursor en el control Ruta se abre un "explorador" para que localice el logo que sea

Elijo Adrián y automáticamente

En archivo me pone lo que creo que querías.

Me voy a otro registro

Ahora elijo, por ejemplo, a adrián en el combinado y 

Importante, si vas a adaptar el código a tu base, en el editor de Vb pulsa Herramientas - Referencias y activa la casilla Microsoft Office XX.X Object Library. Lo de XX. X es por la versión del Office que tengas instalado.

En el editor de Vb tengo puesta esta función

Public Function buscaArchivo() As String
Dim fDialog As Office.FileDialog
Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
With fDialog
.AllowMultiSelect = False
.ButtonName = "Seleccionar"
.Title = "Seleccionar el archivo"
.InitialFileName = Application.CurrentProject.Path
.InitialView = msoFileDialogViewDetails
.Filters.Clear
.Filters.Add "All files", "*.*"
If .Show = True Then
buscaArchivo = .SelectedItems(1)
Else
MsgBox "Ha pulsado el botón <Cancelar>."
End If
End With
End Function

En el evento Al recibir el enfoque del control Ruta le tengo puesto

Private Sub Ruta_GotFocus()
If IsNull([Ruta]) Then
Ruta = buscaArchivo
Imagen3.Picture = Ruta
Archivo = Mid([Ruta], InStrRev([Ruta], "\") + 1)
Else
Exit Sub
End If
Archivo.SetFocus
End Sub

En el control Al recibir el enfoque del combinado Elegirlogo

Private Sub ElegirLogo_GotFocus()
ElegirLogo.RowSource = " select archivo from logos group by archivo"
End Sub

Y en el evento Después de actualizar del combinado

Private Sub ElegirLogo_AfterUpdate()
DoCmd.OpenReport "clientes", acPreview
End Sub

Y por último, en el informe Clientes, le tengo puesto un control imagen Imagen13, y en el evento Al dar formato de la sección donde esté ese control( yo lo he puesto en el encabezado de página, pero la puedes poner donde quieras) le tengo puesto

Private Sub SecciónEncabezadoDePágina_Format(Cancel As Integer, FormatCount As Integer)
If CurrentProject.AllForms("logos").IsLoaded Then
Imagen13.Picture = DLookup("ruta", "logos", "archivo=forms!logos!elegirlogo")
End If
End Sub

es decir, que si el formulario Logos( que podría ser en otro formulario cualquiera, pero como te dije aprovecho el mismo) está cargado, que sí lo está ya que "vienes" de él, entonces la imagen 13 "coja" la ruta que figura en la tabla Logos correspondientes al archivo que has elegido en el combinado.

De todas formas, si ves que parece liado, y quieres, repito, si quieres, mándame un mensaje, sólo el mensaje a [email protected] y te mando el ejemplo.

Si lo haces, en el asunto del mensaje pon tu alias Vagojr, ya que si no sé quien me escribe ni los abro.

Muchísimas gracias Julián,

No he podido meterme con ello antes, ahora que tengo algo más de tiempo lo voy a mirar con cariño; una excelente explicación. En cuanto lo tenga implementado os facilito mis impresiones para quien le pudiera servir de ayuda.

Saludos

Respuesta
1

Dice "También me gustaría purgar de la memoria del frontend los anteriores logos seleccionados para optimizar los tamaños de la base de datos. Hasta donde sé las imágenes se van quedando almacenadas en la base de datos para su uso."

¿Es qué las imágenes se guardan en campos Objeto OLE? O en archivos jpg, png, ¿etc en alguna carpeta? Si es el último caso la respuesta que le dan es la mejor solución.

Eduardo Pérez Fernández , 

Cuando en un formulario o informe incluyes o ya tiene una imagen definida como "Compartida" esta imagen se almacena en la tabla de sistema MSysResources. Si no la encuentra, la almacena nuevamente.
Si no tienes cuidado se te incrementa la base datos por esta información.

Las imágenes compartidas son muy útiles si usas esa imagen repetidas veces; de manera que si la quieres cambiar, simplemente con actualizarla se te cambia en todas partes en donde se haga referencia.

Para poder vaciar el "repositorio" de todas las imágenes (ojo que es una carpeta de sistema), simplemente valdría;

Docmd.RunSQL "DELETE * FROM MSysResources WHERE Type = 'img'"

Espero haber resuelto tu duda,
saludos

una cosa más... para aplicar la reducción de tamaño de manera efectiva, una vez hecho el DELETE tendrías que Compactar y Reparar la base de datos,

saludos

Estoy de acuerdo pero veo que usted mismo se está respondiendo, pero no estamos hablando de almacenar en la base de datos el archivo físico de la imagen sino la ruta en un campo texto.

Efectivamente, esa era mi intención.

Finalmente pude avanzar con este tema gracias a la respuesta de compañero Julián ya que desconocía el uso del "caption" referido a la imagen.

Gracias Eduardo por las molestias,

un saludo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas