¿Cómo hacer una búsqueda alternativa si uno de mis valores es NULL (VBA ACCESS)?

A veces uno de los campos de búsqueda se pueden omitir como sucede a continuación, pero el código me sigue dando error como si omitiera el if ISNULL then:

Por ejemplo, deseo contar los microorganismos entre una fecha dada, pasando por NO escoger ningún servicio hospitalario si su combo box está vació.

Pd: Todo está en el mismo evento al terminar de poner la fecha final.
Este es el código que he venido usando:

Private Sub postFecha_AfterUpdate()
Me.cuentaPorFecha = DCount("*", "[regEnterobacterales]", "[microorganismos]=" & Me.enteroOption & " and [servicio] = " & Me.serviOption & " and [fecha] Between " & CDbl(CDate(Me.preFecha)) & " and " & CDbl(CDate(Me.postFecha)))
If IsNull(Me.serviOption) Then
    Me.cuentaPorFecha = DCount("*", "[regEnterobacterales]", "[microorganismos]=" & Me.enteroOption & " and [fecha] Between " & CDbl(CDate(Me.preFecha)) & " and " & CDbl(CDate(Me.postFecha)))
End If
End Sub

3 respuestas

Respuesta
2

Le dejo este código

Private Sub postFecha_AfterUpdate()
    Dim criterio As String
    If IsNull(Me.serviOption) Then
        criterio = "[microorganismos] = " & Me.enteroOption & " AND [fecha] Between #" & Format(Me.preFecha, "yyyy-mm-dd") & "# AND #" & Format(Me.postFecha, "yyyy-mm-dd") & "#"
    Else
        criterio = "[microorganismos] = " & Me.enteroOption & " AND [servicio] = " & Me.serviOption & " AND [fecha] Between #" & Format(Me.preFecha, "yyyy-mm-dd") & "# AND #" & Format(Me.postFecha, "yyyy-mm-dd") & "#"
    End If
    Me.cuentaPorFecha = DCount("*", "[regEnterobacterales]", criteria)
End Sub

Tenga presente que el uso de CDbl(CDate()) NO sirve en otros gestores de bases de datos.

Si quiere fieltros avanzados lo invito a ver mi video

No se complique si utiliza mi función superfiltro en una SOLA línea construye el script de la consulta

La ignorancia y falta de conocimuentos nos lleva a opinar equivocadamente sobre algo que no conocemos. La función superfiltro de mi video esta enfocada totalmente para Access y no para otro entorno.

Respuesta
1

Crea una variable de texto (por ejemplo: Condición) y evalúa los datos, si se cumple se añade a la variable y si no se cumple se la ignora.

Una vez finalizada la evaluación, en 'Condicion' habrá un conjunto de condiciones que se pueden utilizar libremente

Algo como:
Me.cuentaporfecha = DCount("*",  "regenterobacterales", Condicion)

Un ejemplo de como crear la condición:

IF Not IsNull(Me.Enterooption) Then
     If Len(Condicion) <> 0 Then Condicion = Condicion & " AND " 
     Condicion = Condicion & "microorganismos = " & Me.Enteropcion
     End If

If Not IsNull (Me.Servopcion ) Then .....

(Se repite para cada elemento a evaluar)

Unas notas

No existe ningún 'super filtro' todos aquellos que den un resultado correcto son SUPER FILTROS

1.- Lo que funciona en Access no tiene porque funcionar en otros entornos
2.- Al igual que lo que funcione en otros entornos no tiene porque funcionar en Access
3.- CONSEJO: Utilizar siempre lo adecuado al entorno de programación en uso

Si algún día se cambia de entorno de programación, se ha de actualizar la metodología y aplicar la adecuada al nuevo entorno (no el concepto, solo la 'caja de herramientas') pero eso .. si se cambia de entorno y para esos entornos hay sitios mas indicados que este (al Cesar lo que es del Cesar y a ...)

Respuesta
1

Deberías usar filtros múltiples. Te pongo un ejemplo. Supongamos que tengo un formulario con un subformulario Clientes y tengo varios filtros, de forma que puedo usar todos o simplemente uno o dos o tres...

Puedo filtrar por nombre y por contacto y por ciudad, etc.

Escribo una fecha inicial y una final y además elijo el país. Se ve que el subformulario tiene 91 registros. Si pulso el botón Filtrar me queda como

Me lo ha dejado reducido a 11 clientes entre esas fecha y que son de Alemania. Vamos na suponer que hubiera elegido la ciudad de Buenos Aires

Al pulsar Filtrar

En este caso particular el código del evento Al hacer clic del botón es

Private Sub Comando27_Click()
Dim vLargo As Integer, mifiltro As String
mifiltro = ""
If FCliente <> "" Then
        mifiltro = "AND [NombreCliente]='" & Me.FCliente & "'"
End If
If FContacto <> "" Then
        mifiltro = mifiltro & " AND [NombreContacto]='" & Me.FContacto & "'"
End If
If FCiudad <> "" Then
        mifiltro = mifiltro & " AND [Ciudad]='" & Me.FCiudad & "'"
End If
If FPais <> "" Then
        mifiltro = mifiltro & " AND [Pais]='" & Me.FPais & "'"
End If
If FFinal <> "" Then
        mifiltro = mifiltro & " AND [fecha] >= forms!formulario1!finicial and [fecha]<=forms!formulario1!ffinal"
End If
        vLargo = Len(mifiltro)
If vLargo > 0 Then
        mifiltro = Right(mifiltro, vLargo - 4)
End If
Me.TDatos.Form.Filter = mifiltro
Me.TDatos.Form.FilterOn = True
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas