¿Cómo poner un botón con formato condicional?

Tengo un informe con una relación de facturas, en el cual he añadido en cada registro un botón, que al pulsarlo me abre la factura correspondiente (previamente escaneada en una carpeta).

El código utilizado es:

Dim RutaArchivo As String
RutaArchivo = "L:\Facturas\" & "" & Me.id_facturas & "" & ".pdf"
Application. FollowHyperlink RutaArchivo

Ahora necesitaría que cuando abra el informe, dichos botones tengan colores diferentes según la factura esté escaneada o no. ¿Se puede hacer? ¿Qué código necesitaría poner y donde?

1 respuesta

Respuesta
2

Hacer se puede hacer, pero me extrañan algunas cosas

1º ¿Botones en un informe? Sólo los podrías ver si lo abres en vista informe, en vista previa de impresión no te aparecerán. En todo caso, poner cuadros de texto o etiquetas y ponerle el fondo en función de que esté escaneada

2º Vamos a suponer que lo abres en esa vista informe. ¿Cómo se sabe si está escaneada? Tendrías que usar algo como

If not isnull(dlookup("escaneada","nombredelatablaquesea","nombrecliente='" & me.nombrecliente & "'") then

comandoX.backcolor=vbred

else

comandoX.backcolor=vbehite

end if

3º Pregunto ¿no parece más lógico desde un formulario decirle lo de la ruta, y que abra esa factura en formato pdf?

Gracias Icue,

Era un informe de una serie de varios informes ubicados en un formulario con varios botones. Posteriormente se solicito ñadir la vista de la factura y del pago en ese informe. Por eso lo hago aquí, siempre con vista predeterminada en informe.

El código

Dim RutaArchivo As String
RutaArchivo = "L:\Facturas\" & "" & Me.id_facturas & "" & ".pdf"
Application. FollowHyperlink RutaArchivo

Lo tengo en hacer click en el botón de la factura. ¿Pero para que se vea en vista informe los botones que tienen las facturas escaneadas y los que no supongo que tendría que hacerlo en el evento "Al abrir" del informe?

¿Tendría qué juntar el código anterior con el que me mandas?

Gracias de nuevo

También he estado mirando que el campo [factura] de la tabla Facturas y siempre tiene puesto en cada registro la dirección del pdf que esté o no.

Yeyo, tienes que perdonar pero me pasa lo que a Federico García Lorca cuando oyó el poema de Rubén Darío "Púberes canéforas que ofrendan el acanto" que sólo había entendido el "que"

¿Un informe de una serie de informes ubicados en un formulario? Me pierdo.

La he vuelto a leer dos veces más. Creo que es lo siguiente. Si tengo una carpeta Informes, con pedidos(para ti facturas)

En la tabla Clientes(ya que no sé donde marcas una factura como escaneada)

Hago un informe en vista diseño, donde oculto la casilla Escaneada y le pongo un cuadro de texto, que tiene el mismo evento Al hacer clic que un botón. A este cuadro de texto, en formato condicional le digo que si el valor de Escaneada=true entonces su color de fondo cambie a naranja y

La ventaja de esto es que así sabes que sólo están escaneadas las naranjas(se podrían ocultar las blancas), y en el evento Al hacer clic de ese cuadro de texto es donde puedes poner la instrucción de Dim...

Gracias Icue,

Tienes razón, volví a leer mi respuesta y no quedaba muy clara. Intentare ser más concreto esta vez.

El problema que tengo es que en la tabla facturas no tengo un campo donde voy marcando las facturas que están escaneadas.
En el formulario de facturas tengo un campo "Empresa" con un evento "despues de actualizar" con el siguiente código: Factura = "L:\Facturas\" & "" & Me.id_facturas & "" & ".pdf". Por lo que en la tabla de facturas, el campo correspondiente a Factura siempre queda relleno que este la factura escaneada o no.

Por eso estoy intentando que en el informe que relaciona las facturas haya un botón en cada línea con colores que me ayude a diferenciar las facturas que están escaneadas de las que no lo están.

¿Qué debería de cambiar para poder hacer este informe?

Grascia y un saludo

Pues es lo que te he puesto, en el informe el botón naranja indica que esa factura está escaneada.

Hola Icue,

He tenido que dejar aparcado esto un tiempo. Disculpa.

Como te comenté no tengo un campo en el cual marco lo que esta escaneado y lo que no para poder usar el "dlookup".

No hay manera de dar una orden al botón que contiene la instrucción

Dim RutaArchivo As String
RutaArchivo = "L:\Facturas\" & "" & Me.id_facturas & "" & ".pdf"
Application. FollowHyperlink RutaArchivo

¿Para que cuando no encuentre el fichero .pdf en cuestión se ponga el botón de un color? Actualmente si no encuentra el fichero sale el mensage "Se ha producido el error '490' en tiempo de ejecución: No se puede abrir el archivo especifico".

Gracias

No tienes campo, pero en la tabla le puedes añadir uno. Por ejemplo, en la tabla Clientes le añado un campo texto llamado Existe

Te anticipo que sólo existen los archivos correspondientes a los dos primeros registros(que sería lo mismo que si estuvieran escaneadas). Si tengo un formulario basado en esa tabla y le añado un botón

Cuando pulso el botón

El código del formulario es

Public Function existearchivo(ruta As String) As Boolean
If Len(Dir(ruta)) > 0 Then
existearchivo = True
Else
existearchivo = False
End If
End Function
Private Sub Comando9_Click()
Dim i As Byte
DoCmd.GoToRecord , , acFirst
For i = 1 To Me.Recordset.RecordCount
If IsNull([RutaArchivo]) Then
Existe = "No"
ElseIf existearchivo([RutaArchivo]) = True Then
Existe = "Si"
Else
Existe = "No"
End If
DoCmd.GoToRecord , , acNext
Next
End Sub

Es decir, defino una función que compruebe si existe ese archivo que figura en la ruta y para curarme en salud, por si en RutaArchivo no hubiera nada escrito, es por lo que le digo lo de si es nulo.

Y como ya tienes un campo con un valor Si o No, en el informe ya puedes aplicar lo del formato condicional.

Gracias Icue,

Al final he cambiado el informe por un formulario, he añadido el campo texto "existe" en la tabla y el campo "Factura" donde figuran las rutas en el informe. También he añadido un botón en el informe comando 37. Este es el código resultante:

Option Compare Database
Public Function existearchivo(ruta As String) As Boolean
If Len(Dir(ruta)) > 0 Then
existearchivo = True
Else
existearchivo = False
End If
End Function

________________________________________________________________

Private Sub Comando37_Click()
Dim i As Byte
DoCmd.GoToRecord , , acFirst
For i = 1 To Me.Recordset.RecordCount
If IsNull([Factura]) Then
existe = "No"
ElseIf existearchivo([Factura]) = True Then
existe = "Si"
Else
existe = "No"
End If
DoCmd.GoToRecord , , acNext
Next
End Sub

Sin embargo cuando abro el formulario y pulso el comando37 me sale el siguiente mensaje de error: Se ha producido el error '6' en tiempo de ejecución: Desbordamiento.

¿Qué faltaría? Gracias

Normalmente es porque la variable no "llega" a representar los valores que se le piden. Cambia I as byte por i as integer

El tamaño Byte llega hasta el valor 255, el integer hasta 32767

Genial Icue, ahora funciona perfectamente. Estoy intentando meter el tema de los colores en el mismo botón. Esto es lo que he puesto:

Private Sub Comando37_Click()
Dim i As Integer
DoCmd.GoToRecord , , acFirst
For i = 1 To Me.Recordset.RecordCount
If IsNull([Factura]) Then
existe="No" and existe.BackColor = vbRed
ElseIf existearchivo([Factura]) = True Then
existe="Si"
Else
existe="No" and existe.BackColor = vbRed
End If
DoCmd.GoToRecord , , acNext
Next
End Sub

Pero me sale un mensaje de error 13 "No coinciden los tipos. Tiene solución o es necesario añadir otra casilla en el formulario con un dlookup...?

Gracias

Eso pasa cuando defines una variable con un valor pero lo quieres asignar otro formato. Por ejemplo, si tengo el formulario

En el código del botón le digo

Private Sub Comando4_Click()
Dim i As Integer
i = DLookup("nombrecliente", "clientes", "pais=""Alemania""")
Texto1 = i
End Sub

Como ves, he definido i como número, pero en la instrucción le estoy diciendo que su valor sea texto(nombrecliente), por tanto cuando pulso el botón

Revisa la declaración de variables

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas