Error al generar Informe con filtro desde un Form en Access

Aquí nuevamente... Gracias a la ayuda de los expertos en la comunidad eh podido avanzar mucho en mi DATA. Ahora se me ocurrió generar informes desde un formulario donde realizo múltiples filtros, pues bien genere un informe y necesito que esos registros una vez filtrados en el formulario puedan ser mostrados en el informe y se realizo otro filtro de igual manera me lo muestre en el formulario. Revisando en la WEB por Youtube, vi un video donde realizan lo que necesito, según los criterios de filtrado en los combobox debería hacer lo mismo en el informe, pero al tratar de replicarlo me genera un error "No coinciden los tipos", en la línea de AÑO. No se si sucederá lo mismo en el MES Este es el código:

Private Sub Comando101_Click()
Dim StrFiltro As String
StrFiltro = ""
    If Nz(Me.TipoDocumento, "") <> "" Then StrFiltro = StrFiltro & "(tipodocumento)='" & Me.CC_Tipo & "'"
    If Nz(Me.FechaCompra, "") <> "" Then StrFiltro = StrFiltro & " And (FechaCompra)=" And Year([FechaCompra]) = " & Me.CC_Año" 'El combo muestra solo el año a filtrar
    If Nz(Me.FechaCompra, "") <> "" Then StrFiltro = StrFiltro & " And (FechaCompra)=" And Format([FechaCompra], "mmmm") = " & me.cc_mes" 'El combo muestra el nombre del mes a filtrar
If StrFiltro <> "" Then
If left(StrFiltro, 4) = "And" Then StrFiltro = Mid(StrFiltro, 6)
DoCmd.OpenReport "Tabla_Librocompras", acViewPreview, , StrFiltro
End If
End Sub

Si me pudieran ayudar se los agradeceria

2 Respuestas

Respuesta
1

Su código tiene errores en la forma en que concatena las condiciones para el filtro. Aquí están los problemas y cómo solucionarlos:

Errores detectados:
Uso incorrecto del operador And

Debe asegurarte de concatenar correctamente la cadena con " & Me.CC_Año & " y " & Me.CC_Mes & ", sin And fuera de la cadena.

Error en el filtrado por año (Year([FechaCompra]) = ...)

Year([FechaCompra]) debe ir dentro de la cadena del filtro, no fuera.

Error en el filtrado por mes (Format([FechaCompra], "mmmm") = ...)

Format([FechaCompra], "mmmm") devuelve una cadena, por lo que debes rodear el valor con comillas simples (') en la consulta.

Código editado, pruébelo

Private Sub Comando101_Click()
    Dim StrFiltro As String
    StrFiltro = ""
    ' Filtro por Tipo de Documento
    If Nz(Me.TipoDocumento, "") <> "" Then
        StrFiltro = StrFiltro & "(TipoDocumento)='" & Me.CC_Tipo & "'"
    End If
    ' Filtro por Año de Compra
    If Nz(Me.FechaCompra, "") <> "" Then
        If StrFiltro <> "" Then StrFiltro = StrFiltro & " And "
        StrFiltro = StrFiltro & "Year(FechaCompra) = " & Me.CC_Año
    End If
    ' Filtro por Mes de Compra
    If Nz(Me.FechaCompra, "") <> "" Then
        If StrFiltro <> "" Then StrFiltro = StrFiltro & " And "
        StrFiltro = StrFiltro & "Format(FechaCompra, 'mmmm') = '" & Me.CC_Mes & "'"
    End If
    ' Verificar si hay filtros antes de abrir el informe
    If StrFiltro <> "" Then
        DoCmd.OpenReport "Tabla_Librocompras", acViewPreview, , StrFiltro
    Else
        MsgBox "Debe seleccionar al menos un criterio de filtro.", vbExclamation, "Aviso"
    End If
End Sub

y me cuenta.

¡Gracias! Don Eduardo, siempre es un placer recibir ayuda suya y con información adicional a la respuesta. Mi única pregunta adicional seria... ¿se puede optar a que no me obligue tener los cuadros llenos?. Me explico... si solo necesito el año y el tipo de documento a filtrar o vice versa

Le dejo el código optimizado.

Private Sub Comando101_Click()
    Dim StrFiltro As String
    StrFiltro = ""
    ' Filtro por Tipo de Documento
    If Nz(Me.TipoDocumento, "") <> "" Then
        StrFiltro = StrFiltro & "(TipoDocumento)='" & Me.CC_Tipo & "'"
    End If
    ' Filtro por Año de Compra
    If Not IsNull(Me.CC_Año) And Me.CC_Año <> "" Then
        If StrFiltro <> "" Then StrFiltro = StrFiltro & " And "
        StrFiltro = StrFiltro & "Year(FechaCompra) = " & Me.CC_Año
    End If
    ' Filtro por Mes de Compra
    If Not IsNull(Me.CC_Mes) And Me.CC_Mes <> "" Then
        If StrFiltro <> "" Then StrFiltro = StrFiltro & " And "
        StrFiltro = StrFiltro & "Format(FechaCompra, 'mmmm') = '" & Me.CC_Mes & "'"
    End If
    ' Verificar si hay filtros antes de abrir el informe
    If StrFiltro <> "" Then
        DoCmd.OpenReport "Tabla_Librocompras", acViewPreview, , StrFiltro
    Else
        MsgBox "Debe seleccionar al menos un criterio de filtro.", vbExclamation, "Aviso"
    End If
End Sub

Cambios y mejoras:

Corrección de la doble validación de FechaCompra
Se eliminó una verificación redundante.

Uso de IsNull() en lugar de Nz() en los filtros de Año y Mes
Nz() funciona bien, pero IsNull() es más claro en este caso.

Filtros independientes

Ahora puede ejecutar el informe con solo uno, dos o los tres filtros sin errores.

Con este ajuste, puede aplicar el filtro con la combinación de criterios que necesite sin que sea obligatorio llenar todos los cuadros.

Le recomiendo mirar mi video sobre la función superfiltro. Aunque lo explico para Access con PostgreSQL la idea es la misma.

https://www.youtube.com/watch?v=NETktDgbvDI&ab_channel=AccessyPostgreSQL

Respuesta
1

No lo veo claro:
¿Qué relación hay entre 'Me. Tipodocumento' y 'Me.CC_Tipo'?
(Se evalúa uno y se toma otro)
Una forma de evaluar si un dato de fecha es válido en con una función creada para ello, devuelve un True/False lo que la hace muy útil

If IsDate(Me.Fechacompra) Then ......

Y si hay una fecha valida de ella se extrae el año, el mes el da, la semana la hora ... y se le puede aplicar formato para (por ejemplo) ignorar el día:

Format(Me. Fechacompra, "mmmmyyyy")

Para 4/5/2025 devuelve mayo2025 por lo que:

Format(Me.Fechacompra, "mmmmyyyy") = '" & Me.CC_Mes & Me.CC_Año & "'"

Hay muchas mas formas de hacerlo, todas las que funcionen son buenas (eficiencia aparte)

¡Gracias! Don Enrique, tomare sus ejemplos para aplicarlo, me dio un ejemplo nuevo de como utilizar el formato de fecha que no conocía como el mes y año juntos.

Una de las muchas formas que hay para crear filtros dinámicos se basa en una doble validación.

.- En la primera se evalúa si el dato es valido (existe la fecha, existe el cliente, existe….)

.- La segunda solo se aplica si la primera es aceptada

La secuencia recorre todas las posibles condiciones y genera el filtro concatenado todas las que son válidas (la fecha si hay una fecha valida, el cliente si hay un cliente… etc.)

El primer dato a evaluar puede ignorar su segunda condición (se parte de una cadena vacía)

El esquema:

Se crea la variable para la suma de condiciones (MiFiltro)

Se Evalúa si el referente valido (fecha, texto, numero)

Si pasa la evaluación se verifica el contenido de la variable (MiFiltro)

Si su longitud es diferente de cero se añade la concatenación (AND)
Tras ello la condición a cumplir

Se pasa al siguiente elemento a evaluar y se repite hasta finalizar con todas las posibles restricciones.

En la primera evaluación se puede ignorar evaluar el contenido de MiFiltro (recién dimensionado es una cadena de longitud cero)

Dim MiFiltro As String
If IsDate([Fecha_a_evaluar]) Then Mifiltro = “Fecha_compra = ” & [Fecha_a_evaluar]
If Nz(Me.NombreCliente,””)<> “” Then
   If Len(MiFiltro) <>0 Then MiFiltro = MiFiltro & “ And “
   MiFiltro = MiFiltro & “El_Cliente = ‘” & Me.NombreCliente & “’”
   End If
If Nz (Me.OtroDato,0)<>0 Then
   If Len(MiFiltro) <>0 Then MiFiltro = MiFiltro & “ And “
   MiFiltro = MiFiltro & “Valor_Producto = ” & Me.OtroDato
   End If

Finalmente se evalúa si MiFiltro tiene contenido, de tenerlo se aplica (por ejemplo al filtro del formulario)

If Len(MiFiltro) <> 0 Then
   Me.Filter = MiFiltro
   Me.FIlterOn = True
   End If

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas