Como hacer consultas con criterios condicionales?

Estoy haciendo un informe en el cual al introducir unos parámetros me ejecute una consulta. Ejemplo: tengo un informe llamado "consultas sobre facturas" con un botón "Facturas registradas". Este informe tiene también 4 campos para filtrar las respuestas: Fecha factura desde, fecha factura hasta, empresa emisora de la factura y proveedor. Una vez que relleno esos 4 campos le doy a "Facturas registradas" y me sale la consulta filtrada con los parámetros que he introducido. Hasta aquí todo ok. El problema es que no se como hacer para no estar obligado a utilizar los 4 filtros. Por ejemplo que solo tenga uno de ellos cuando dejo los demás en blanco. ¿Qué expresión o códigos, tendría, por ejemplo, que poner en el campo criterio "empresa" de la consulta para que si está en blanco salgan todas las empresas y si no que solo salga la que he solicitado? No se si me he explicado bien.

1 Respuesta

Respuesta

Me parece "extraño" que lo hagas todo sobre un informe y no sobre un formulario, pero para el caso, viene siendo lo mismo: has de construir el filtro en función de si tus campos tienen o no valor tal como explica Neckkito en este ejemplo (tienes el código explicado paso a paso y una BD de ejemplo):

http://neckkito.xyz/nck/index.php/ejemplos/13-formularios/77-crear-un-filtro-multiple 

Un saludo.


     bit.ly/ForoNkSv 

Hola de nuevo, estaba arreglando varios problemas que tengo en access y había dejado esto de lado. No consigo bajarme la BD. 

De la tabla "Facturas" he realizado varias consulta y de cada consulta tengo su informe correspondiente.

Por otro lado tengo un formulario con 4 filtros:

1 cuadro de texto "consultadesde" (para limitar la fecha de factura),

2 cuadro de texto "consultahasta" (para limitar la fecha de factura),

3 cuadro combinado "consultasproveedor" sin origen del control, origen de la fila SELECT [Proveedores].[Id_proveedor], [Proveedores].[Nombre] FROM Proveedores ORDER BY [Nombre]; y tipo de origen tabla/consulta, columna dependiente 2

4 cuadro combinado "filtroempresa" sin origen del control, origen de la fila SELECT [Empresas].[Id_empresas], [Empresas].[Empresa] FROM Empresas ORDER BY [Empresa];  y tipo de origen de la fila Tabla/Consulta , columna dependiente 2 

El formulario tiene también varios botones para ejecutar los informes 1 de ellos "fac_recibidas" que actualmente funciona con una macro que me abre el informe de las facturas recibidas sin tener en cuenta los filtros.

¿Este es el código que debería de poner en el botón para ejecutar el informe  "Facturas pdtes aprobacion" de la consulta relacionada con el mismo nombre, cuyo único filtro sea el de Empresa?

Private Sub fac_recibidas_Click()
Dim vEmpresa As String                                               
vEmpresa = Nz(Me.filtroempresa.Value, "")
If vEmpresa <> "" Then
filtroempresa = "AND [Empresa]='" & vEmpresa & "'"
End If
vLargo = Len(filtroempresa)
If vLargo > 0 Then
filtroempresa = Right(filtroempresa, vLargo - 4)
End If
Me.Filter = filtroempresa

Algo falla. Además como hago para añadir también el que se ejecute el informe "Facturas pdtes aprobacion" que lleva este filtro?

Gracias

A ver, ele ejemplo es para filtrar el propio formulario, por eso usa Me.Filter = filtroempresa.

Para abrir un informe filtrado has de usar DoCmd. OpenReport y en esa instrucción le pasas el filtro:

DoCmd. OpenReport "Facturas pdtes aprobacion", acViewPreview,, filtroempresa

Por otro lado, si solo vas a tener un criterio, puedes simplificar enormemente el código:

Private Sub fac_recibidas_Click()
Dim vEmpresa As String                                               
vEmpresa = Nz(Me.filtroempresa.Value, "")
If vEmpresa <> "" Then
   filtroempresa = "[Empresa]='" & vEmpresa & "'"
End If
DoCmd.OpenReport "Facturas pdtes aprobacion", acViewPreview,,filtroempresa
End Sub

Hola de nuevo,

Ya estoy con este tema de nuevo. He aplicado el código. Funciona únicamente cuando hay un filtro puesto. Si dejo el filtro en blanco me sale un mensaje de error "Ha especificado una expresión con un tipo de datos incorrecto para uno de los argumentos" 

Por otro lado, menos importante, después de "ejecutar" el botón con un filtro empresa "Sambe", cuando cierro el informe, veo que el filtro que había puesto aparece como " [Empresa]='Sambe' " en vez Sambe. ¿Como puedo hacer para que no se produzca este cambio? Gracias

Pues es raro que te de error al no hacer filtro, pero por si metí la pata por querer simplificar el código, prueba así:

Private Sub fac_recibidas_Click()
Dim vEmpresa As String   
Dim filtroempresa As String                                            
vEmpresa = Nz(Me.filtroempresa.Value, "")
If vEmpresa <> "" Then
   filtroempresa = "[Empresa]='" & vEmpresa & "'"
End If
DoCmd.OpenReport "Facturas pdtes aprobacion", acViewPreview,,filtroempresa
End Sub

Y si así no te va, así tendría que funcionarte seguro:

Private Sub fac_recibidas_Click()
Dim vEmpresa As String       
Dim filtroempresa As String                                        
vEmpresa = Nz(Me.filtroempresa.Value, "")
If vEmpresa <> "" Then
   filtroempresa = "[Empresa]='" & vEmpresa & "'"
End If
If Len(filtroempresa)>0 Then
DoCmd.OpenReport "Facturas pdtes aprobacion", acViewPreview,,filtroempresa
Else
DoCmd.OpenReport "Facturas pdtes aprobacion", acViewPreview
End If
End Sub

En cuanto a tu segunda duda: deberías saber que los datos de tipo texto se manejan entre comillas simples, por lo que es totalmente correcto que el filtro te aparezca así (además de que en el código se construye así)

Con este último código funciona el filtro. He querido añadir un 2do filtro "proveedor". He añadido el siguiente código combinando lo que me acabas de enviar con lo del archivo pdf que me mandaste anteriormente pero algo falla. Gracias por echarme una mano otra vez

Private Sub fac_recibidas_Click()
Dim vEmpresa As String
Dim vProveedor As String
Dim vLargo As Integer
Dim miFiltro As String
vEmpresa = Nz(Me.filtroempresa.Value, "")
vProveedor = Nz(Me.consultasproveedor.Value, "")
miFiltro = ""
If vEmpresa <> "" Then
filtroempresa = "[Empresa]='" & vEmpresa & "'"
End If
If vProveedor <> "" Then
consultasproveedor = "[Proveedor]='" & vProveedor & "'"
End If
vLargo = Len(miFiltro)
If vLargo > 0 Then
miFiltro = Right(miFiltro, vLargo - 4)
End If
If Len(miFiltro) > 0 Then
DoCmd.OpenReport "a_facturas_pdtes_aprobacion", acViewReport, , filtroempresa
Else
DoCmd.OpenReport "a_facturas_pdtes_aprobacion", acViewReport
End If
End Sub

Ahora no tengo tiempo para explicarte paso a paso cómo hacer un filtro múltiple, y como además, es algo que ya está explicado hasta la saciedad por internet, te remito a un ejemplo de Neckkito que lo explica paso a paso: http://neckkito.xyz/nck/index.php/ejemplos/13-formularios/77-crear-un-filtro-multiple

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas