Cómo utilizar correctamente el código application.currentproject. Path en access

En el FORMULARIO tengo "al activar registro" y "al cargar"

Option Compare Database
Option Explicit
Private Sub Form_Current()
CargaImagen Me. Name, Nz(Me.txtImagen1, ""), Me.imgImagen1.Name
CargaImagen Me. Name, Nz(Me.txtImagen2, ""), Me.imgImagen2.Name
CargaImagen Me. Name, Nz(Me.txtImagen3, ""), Me.imgImagen3.Name
CargaImagen Me. Name, Nz(Me.txtImagen4, ""), Me.imgImagen4.Name
CargaImagen Me. Name, Nz(Me.txtImagen5, ""), Me.imgImagen5.Name
CargaImagen Me. Name, Nz(Me.txtImagen6, ""), Me.imgImagen6.Name
End Sub ' Form_Current
Private Sub Form_Load()
AjustarTamaño Me
End Sub ' Form_Load

Tengo el siguiente MODULO

Option Compare Database

Public Function Dir(strArchivo) As Boolean
Dim fso As Object, _
f As Object
On Error GoTo Dir_TratamientoErrores
On Error GoTo Dir_TratamientoErrores
Set fso = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
Set f = fso.GetFile(strArchivo)
If Len(f.Path) = "" Then
Dir = False
Else
Dir = True
End If
Set fso = Nothing
Set f = Nothing
Dir_Salir:
On Error GoTo 0
Exit Function
Dir_TratamientoErrores:
MsgBox "Error " & Err.Number & " (" & Err.Description & ") en proc. Dir de Documento VBA Form_ENTRADA DATOS"
GoTo Dir_Salir
End Function ' Dir

Public Sub CargaImagen(strDonde As String, strRuta As String, strImagen As String, Optional strTipo As String = "form")
Dim Donde As Object
On Error GoTo CargaImagen_TratamientoErrores
Select Case UCase(strTipo)
Case "form", "formulario", "frm"
Set Donde = Forms(strDonde)
Case "rpt", "report", "informe"
Set Donde = Reports(strDonde)
End Select
' me aseguro de que la imagen existe y si es así la muestro,
' en caso contrario elimino la que pudiera existir anteriormente
If Dir(strRuta) Then
Donde(strImagen).Picture = strRuta
Else
Donde(strImagen).Picture = ""
End If
CargaImagen_Salir:
Set Donde = Nothing
On Error GoTo 0
Exit Sub
CargaImagen_TratamientoErrores:
MsgBox "Error " & Err.Number & " en proc.: CargaImagen de Documento VBA: mdlUtilidades (" & Err.Description & ")"
Resume CargaImagen_Salir
End Sub ' CargaImagen

Public Sub AjustarTamaño(frmFormulario As Form)
Dim I As Long
On Error GoTo AjustarTamaño_TratamientoErrores
' ajusto el ancho del formulario teniendo en cuenta si tiene o no selector de registros
If Not frmFormulario.RecordSelectors Then
frmFormulario.InsideWidth = frmFormulario.Width
Else
frmFormulario.InsideWidth = frmFormulario.Width + 250
End If
' ajusto el alto incluyendo las distintas secciones, encabezado, pie, grupos...
' como no sé el número de secciones del formulario, me salgo al producirse un error
frmFormulario.InsideHeight = 0
For I = 0 To 100
frmFormulario.InsideHeight = frmFormulario.InsideHeight + frmFormulario.Section(I).Height
Next
DoCmd.Restore
AjustarTamaño_Salir:
On Error GoTo 0
Exit Sub
AjustarTamaño_TratamientoErrores:
If Not Err = 2462 Then ' "El número de sección que introdujo no es válido."
MsgBox "Error " & Err.Number & " en proc.: AjustarTamaño de Módulo: Módulo1 (" & Err.Description & ")"
End If
Resume AjustarTamaño_Salir
End Sub ' AjustarTamaño

Me funciona correctamente hasta que me di cuenta que el cambio de unidad externa me impide ver las fotos. He leído que la solución está en introducir aplicación. Currentproject. Path pero no se como. Las imágenes las tengo en la carpeta Fotografías.

1 respuesta

Respuesta
1

Application. CurrentProject. Path te devuelve el directorio (carpeta) en el que tienes la base de datos. Se usa, entre otras cosas, para poner rutas relativas a archivos o carpetas que estén en la misma carpeta que la BD, de tal forma que si mueves la carpeta, te seguirá funcionando el código.

Por el código que pones, imagino que en txtImagen1... tienes la ruta completa de la imagen (por ejemplo C:\Proyectos\Access\Fotografias\Imagen01.jpg)

Si es así, el primer paso será borrar en tus registros todo menos el nombre y extensión de la imagen.

Luego, cuando llamas al procedimiento CargaImagenes, lo haces así:

CargaImagen Me. Name, Nz(Application.CurrentProject.Path & "\Fotografías\" & Me.txtImagen1, ""), Me.imgImagen1.Name

Así encadenas la ruta de la carpeta que contine la BD (y la carpeta fotografías, que obligatoriamente debe estar con la BD), el nombre de la carpeta y el nombre del archivo.

En la carpeta FOTOGRAFIAS tengo numeradas las imágenes de forma correlativa 1.jpg, 2.jpg ... y como me indicaste en la ruta solo dejo los nombres y extensiones.

En el formulario introduzco el código indicado y no veo las imagenes pero tampoco me da ningún tipo de error

Option Explicit

Private Sub Form_Current()
CargaImagen Me.Name, Nz(Application.CurrentProject.Path & "\FOTOGRAFIAS\" & Me.txtImagen1, ""), Me.imgImagen1.Name
CargaImagen Me.Name, Nz(Application.CurrentProject.Path & "\FOTOGRAFIAS\" & Me.txtImagen2, ""), Me.imgImagen2.Name
CargaImagen Me.Name, Nz(Application.CurrentProject.Path & "\FOTOGRAFIAS\" & Me.txtImagen3, ""), Me.imgImagen3.Name
CargaImagen Me.Name, Nz(Application.CurrentProject.Path & "\FOTOGRAFIAS\" & Me.txtImagen4, ""), Me.imgImagen4.Name
CargaImagen Me.Name, Nz(Application.CurrentProject.Path & "\FOTOGRAFIAS\" & Me.txtImagen5, ""), Me.imgImagen5.Name
CargaImagen Me.Name, Nz(Application.CurrentProject.Path & "\FOTOGRAFIAS\" & Me.txtImagen6, ""), Me.imgImagen6.Name
End Sub ' Form_Current

Private Sub Form_Load()
AjustarTamaño Me
End Sub ' Form_Load

¿Qué valor tenías antes en txtImagen1?

¿Y ahora?

Comprueba, poniendo en un botón nuevo en tu formulario que la ruta completa que te devuelve es correcta:

MsgBox Application.CurrentProject.Path & "\FOTOGRAFIAS\" & Me.txtImagen1

En relación al valor txtImagen1, el origen del control era RUTA1 (campo de la tabla donde consta la ruta.

En relación a la ruta completa me devuelve F:\BASES\FOTOGRAFIAS\. La base y la carpeta fotografías están en un pincho en carpetas independientes. He probado a meter la carpeta fotografías dentro de la carpeta bases y tampoco funciona

La carpeta FOTOGRAFÍAS tiene que estar en la misma carpeta en que tengas la BD, para que te funcione el Application. CurrentProject. Path

El código que me pasaste era correcto, simplemente tuve que sacar la bd y la carpeta FOTOGRAFÍAS de la carpeta BASES y ya me funciono. Muchísimas gracias, te lo agradezco

como indique anteriormente, ahora puedo acceder al formulario desde cualquier unidad externa y ver las imágenes sin problema, pero ahora no puedo ver las imágenes en los informes.

En los informes que tengo, el nombre de la imagen es imgImagen1 y el origen del control es RUTA 1 (imagino que no muestra la imagen pq. la ruta ahora no esta completa ya que solo me figura nombre y extensión)

Tendrás que adaptar el código de la misma forma que para los formularios, usando el objeto application para crear la ruta completa.

Ten en cuenta que en los informes has de poner el código en el evento Al dar formato de la sección detalle, y no en el evento Al activar registro (Report_Current) del informe

He introducido el código

Private Sub Detalle_Format (Cancel As Integer, FormatCount As Integer)

CargaImagen Me.Name, Nz (Application.CurrentProject.Path & "\FOTOGRAFIAS\" & Me.txtImagen1, ""), Me.imgImagen1.Name

End Sub

Me sale un mensaje Error de compilación, no se encontró el método o el dato miembro y me subraya "txtImagen1"

En donde pones txtImagen1 tienes que poner el nombre del control de tu informe que tiene el nombre de la imagen. Me imagino que no se llama así y por eso el error de que no se encontró el miembro.

txtImagen1 es el campo de la ruta

imgImagen1 es el campo de la imagen

en el formulario utilizaba las dos con el código que me facilitaste y funcionaba

en el informe solo tengo el campo imagen con nombre imgImagen1 por eso entiendo que me de error al introducir txtImagen1.

Si sustituyo txtImagen1 por imgImagen1 y lo dejo así me indica que se produjo error 438 en tiempo de ejecución y que el objeto no admite esta propiedad y metido

CargaImagen Me.Name, Nz (Application.CurrentProject.Path & "\FOTOGRAFIAS\" & Me.imgImagen1, ""), Me.imgImagen1.Name

Si en el informe no tienes un campo con el nombre de la imagen... ¿cómo le indicas qué imagen te tiene que cargar?

estoy completamente bloqueado

no se si sirve de algo, el informe (consulta palabra vehículo) lo realizo sobre una consulta (búsqueda vehículo) que me devolvía filiación, vehículos y foto del conductor.

ahora he probado introduciendo el campo RUTA1 con nombre txtImagen1 en el informe para que el informe se asemeje al formulario y me pueda valer el código pero    

me dice error 2450 en proc.: CargaImagen de Documento VGA: mdbUtilidades (Microsoft Access no encuentra el formulario "consulta palabra vehículo" al que se hace referencia en una expresión de macro o en el código de Visual Basic

Cuando haces la llamada al procedimiento de carga de las imágenes en un informe, tienes que pasarle el parámetro opcional para indicarle que es un informe y no te de ese error:

Public Sub CargaImagen(strDonde As String, strRuta As String, strImagen As String, Optional strTipo As String = "form")

es decir, tu código tendría que ser algo así:

CargaImagen Me.Name, Nz (Application.CurrentProject.Path & "\FOTOGRAFIAS\" & Me.imgImagen1, "report"), Me.imgImagen1.Name

(En vez de report también te valdría "informe" o "rpt")

he aplicado los cambios y me sigue dando el mismo error. He estado revisando y he comprobado que en el modulo que pegue en la pregunta inicial figura este parámetro opcional que pueda estar afectando.

Public Sub CargaImagen(strDonde As String, strRuta As String, strImagen As String, Optional strTipo As String = "form")
Dim Donde As Object
On Error GoTo CargaImagen_TratamientoErrores
Select Case UCase(strTipo)
Case "form", "formulario", "frm"
Set Donde = Forms(strDonde)
Case "rpt", "report", "informe"
Set Donde = Reports(strDonde)
End Select
' me aseguro de que la imagen existe y si es así la muestro,
' en caso contrario elimino la que pudiera existir anteriormente
If Dir(strRuta) Then
Donde(strImagen).Picture = strRuta
Else
Donde(strImagen).Picture = ""
End If
CargaImagen_Salir:
Set Donde = Nothing
On Error GoTo 0
Exit Sub
CargaImagen_TratamientoErrores:
MsgBox "Error " & Err.Number & " en proc.: CargaImagen de Documento VBA: mdlUtilidades (" & Err.Description & ")"
Resume CargaImagen_Salir
End Sub ' CargaImagen

Por fin, he probado con este código y ya puedo ver las fotos en el informe. Muchas gracias por la ayuda y la paciencia

Private Sub Detalle_Format (Cancel As Integer, FormatCount As Integer)

CargaImagen Me.Name, Nz (Application.CurrentProject.Path & "\FOTOGRAFIAS\" & Me.txtImagen1, ""), Me.imgImagen1.Name, "rpt"

A eso me refería con mi último comentario, pero te puse mal el "rpt" en el código (lo metí en la función Nz, en vez de al final). Me alegro que lo hayas podido solucionar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas