Access - Filtro de formulario con 6 criterios

 
Vista:
sin imagen de perfil
Val: 29
Ha disminuido su posición en 3 puestos en Access (en relación al último mes)
Gráfica de Access

Filtro de formulario con 6 criterios

Publicado por Zirado (12 intervenciones) el 20/03/2018 14:44:20
He hecho una base de datos en Access para la empresa y ya la tengo terminada a falta de una última cosa que no logro hacer funcionar al 100%. Una vez solucione esto puedo dar la base de datos por terminada.

Se trata de un formulario con un buscador con 6 criterios distintos para filtrar los registros de un subformulario. Actualmente funcionan perfectamente 4 de ellos.

Adunto una imagen y paso a aclarar los campos que utilizo:

Unbenannt

En el formulario principal llamado "FSuchen" tenemos los siguientes campos que utilizaremos para filtar:
xKategorie -> es un combobox . NO FUNCIONA
xAnlage -> otro combobox vinculado al anterior. NO FUNCIONA
xFamiliename -> cuadro de texto
xOrt -> cuadro de texto
xJahr -> cuadro de texto
chkVerkauft -> casilla

Estos 6 campos deben filtrar 6 campos en el subfomulario "FPSuchen", estos son:
Kategorie
Anlage
Familiename
Ort
xJahr
Verkauft

El caso es que los que dan problema son Kategiorie y Anlage, los demás funcionan correctamente. Estoy intentando solventarlo poco a poco incluyendo únicamente el campo Kategorie y cuando lo consiga pasar al campo Anlage.

Si el campo en blanco y filtro con los otros 4 funciona correctamente pero si elijo en el combobox alguna opción ya no funciona bien.

Unbenannt1

Éste es mi código

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Private Sub xSuchen_Click()
    Dim vKategorie As Variant
    Dim vFamiliename As String
    Dim vOrt As String
    Dim vJahr As Variant
    Dim vVerkauft As Variant
    Dim vLargo As Integer
    Dim miFiltro As String
    Dim Rst As DAO.Recordset
    vKategorie = Nz(Me.xKategorie.Value, "")
    vFamiliename = Nz(Me.xFamiliename.Value, "")
    vOrt = Nz(Me.xOrt.Value, "")
    vJahr = Nz(Me.xJahr.Value, "")
    vVerkauft = Nz(Me.chkVerkauft.Value, "")
    miFiltro = ""
    If vKategorie <> "" Then
    miFiltro = "AND [Kategorie]=" & vKategorie
    End If
    If vFamiliename <> "" Then
    miFiltro = miFiltro & " AND [Familiename] LIKE '*" & vFamiliename & "*'"
    End If
    If vOrt <> "" Then
    miFiltro = miFiltro & " AND [Ort] LIKE '*" & vOrt & "*'"
    End If
    If vJahr <> "" Then
    miFiltro = miFiltro & " AND [Jahr]=" & vJahr
    End If
    If vVerkauft <> "" Then
    miFiltro = miFiltro & " AND [Verkauft]=" & vVerkauft
    End If
    vLargo = Len(miFiltro)
    If vLargo > 0 Then
    miFiltro = Right(miFiltro, vLargo - 4)
    End If
    Me.FPSuchen.Form.Filter = miFiltro
    Me.FPSuchen.Form.FilterOn = True
    Set Rst = Me.FPSuchen.Form.Recordset.Clone
    If Rst.RecordCount = 0 Then
        MsgBox "Es würde keine Suchtergebnisse gefunden", vbInformation, ""
        Form.RecordSource = "Select * from Aux_Projekte"
        Me.xKategorie = ""
        Me.xanlage = ""
        Me.xFamiliename = ""
        Me.xOrt = ""
        Me.xJahr = ""
    End If
End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Filtro de formulario con 6 criterios

Publicado por Anonimo (3316 intervenciones) el 21/03/2018 01:45:51
Para que reconozca como dato correcto el que 'aporta' el combo, se debe asignar la propiedad 'columna predeterminda' a la columna que se corresponda con el tipo de dato (y valor) adecuado.

Esto anterior se cumplira en cualquier combo que tenga mas de una columna (si solo tiene una: esa sera la columna predeterminada)

Un MsgBox con el contenido del filtro (forzando el problema) posiblemete permititia ver el problema real (o la alternativa de un seguimiento paso a paso del codigo para observar los valores de cada objeto en tiempo de ejecucion).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 29
Ha disminuido su posición en 3 puestos en Access (en relación al último mes)
Gráfica de Access

Filtro de formulario con 6 criterios

Publicado por Zirado (12 intervenciones) el 22/03/2018 11:31:03
Muchas gracias por la respuesta.

Tiene toda la lógica lo que comentas pero en este caso se trata de un combobox de una sola columna..

No he entendido bien lo del MsgBox. Creo te refieres a la parte del código donde se produce el error al aplicar el filtro. Al filtrar me sale el mensaje que ves en el primer post que me dice que introduzca el valor del parámetro. Si le deoz a cancelar obtengo el error 2001 z al depurar me marca que el error está en

1
Me.FPSuchen.Form.FilterOn = True
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Norberto
Val: 1.094
Oro
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Filtro de formulario con 6 criterios

Publicado por Norberto (753 intervenciones) el 21/03/2018 14:32:33
Hola.

Prueba a cambiar las comparaciones expr <> "" por Not IsNull(expr) a ver.

Un saludo,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 29
Ha disminuido su posición en 3 puestos en Access (en relación al último mes)
Gráfica de Access

Filtro de formulario con 6 criterios

Publicado por Zirado (12 intervenciones) el 22/03/2018 11:32:21
He hecho la prueba y no funciona, me salta un error.

Gracias por la respuesta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jose
Val: 71
Ha disminuido su posición en 2 puestos en Access (en relación al último mes)
Gráfica de Access

Filtro de formulario con 6 criterios

Publicado por Jose (131 intervenciones) el 21/03/2018 19:53:14
Hola, buen dia

Yo tenia algo similar, pero lo elimine por una buqueda general en un solo campo (texto) al cual llame "Buscar"

lo que hice fue, en la consulta (query) agregue un campo mas al cual llame "BuscarGeneral" y concatene mucha informacion

BuscarGeneral: [Nombre]& " " & [direccion] & " " & [telefono] etc... etc...

todo lo que yo necesitaba lo anexe como info en este campo

y condicione a la consulta con este campo "BuscarGeneral" para que el criterio fuera igual a del unico campo para buscar en mi formulario "Buscar"

el criterio que use fue con la function LIKE

Like Forms!FormularioDeBusqueda!Buscar
de esta forma todo lo que yo escriba en el formulario para buscar, lo tomara como criterio para filtrar la informacion
claro, usando el "*" en las consultas

ejemplo:
*luis*mexico*29*

con esto me busca todos los nombres luis que sean de mexico y que tengan 29 años

y sin tanto codigo

bueno es una sugerencia que a mi en lo personal me funciono perfectamente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 29
Ha disminuido su posición en 3 puestos en Access (en relación al último mes)
Gráfica de Access

Filtro de formulario con 6 criterios

Publicado por Zirado (12 intervenciones) el 22/03/2018 11:34:28
En principio me gustaría intentar solucionarlo en el formulario que uso.

Si no consigo solucionarlo, tendré en cuenta tu método para usalo como solución alternativa. Así que gracias por la aportación.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 29
Ha disminuido su posición en 3 puestos en Access (en relación al último mes)
Gráfica de Access

Filtro de formulario con 6 criterios

Publicado por Zirado (12 intervenciones) el 22/03/2018 11:42:15
Como veo que los combos son el problema paso a explicar como están montados. En principio estoy intentado resolverlo solo con el combo Kategorie para simplificar e intentar localizar el problema.

Son 2 combos en cascada donde el principal es Kategorie y Anlage sería el secundario. Cogen de la información de una tabla auxiliar llamada Aux_Anlage.

Unbenannt2

Y luego los combos en el formulario son de la siguiente forma:

xKategorie
Origen de la fila: SELECT DISTINCT Aux_Anlage.aux_Kategorie FROM Aux_Anlage ORDER BY Aux_Anlage.[aux_Kategorie];

xAnlage
Origen de la fila: SELECT Aux_Anlage.aux_Anlage FROM Aux_Anlage GROUP BY Aux_Anlage.aux_Anlage, Aux_Anlage.aux_Anlage, Aux_Anlage.aux_Kategorie HAVING (((Aux_Anlage.aux_Kategorie)=[Forms]![FSuchen].[xKategorie].[Value])) ORDER BY Aux_Anlage.aux_Anlage;

Los combos funcionan correctamente, pero fallan a la hora de integrarlos en el filtro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Norberto
Val: 1.094
Oro
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Filtro de formulario con 6 criterios

Publicado por Norberto (753 intervenciones) el 22/03/2018 12:49:54
Hola de nuevo.

Por lo que veo el origen de la fila de cada combo tiene un único campo por lo que se ve es lo que realmene se elige y lo que se elige es un texto.

Si estoy en lo cierto, deberás encerrarlos entre comillas tal que así:

1
miFiltro = "[Kategorie]='" & vKategorie & "'"

Esto no solo para los combos sino, también, para aquellos cuadros de texto cuyo contenido no sea numérico.

Espero que esta sea la definitiva.

Un saludo,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 29
Ha disminuido su posición en 3 puestos en Access (en relación al último mes)
Gráfica de Access

Filtro de formulario con 6 criterios

Publicado por Zirado (12 intervenciones) el 22/03/2018 13:21:40
Sí, los combos son campos de tipo texto corto.

Estoy probando lo de las comillas pero no consigo escribir bien el código porque tengo que añadirle AND al principio. Sé que es algo muy básico pero no doy con ello.

Así obtengo error de sintaxis
1
miFiltro = "AND "[Kategorie]='" & vKategorie
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 29
Ha disminuido su posición en 3 puestos en Access (en relación al último mes)
Gráfica de Access

Filtro de formulario con 6 criterios

Publicado por Zirado (12 intervenciones) el 22/03/2018 14:53:32
Ok, gracias a vosotros he conseguido resolverlo. El problema era efectivamente las comillas por ser un campo de texto como decía el compañero.

Adjunto el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Private Sub xTest_Click()
    Dim vKategorie As Variant
    Dim vAnlage As Variant
    Dim vFamiliename As String
    Dim vOrt As String
    Dim vJahr As Variant
    Dim vVerkauft As Variant
    Dim vLargo As Integer
    Dim miFiltro As String
    Dim Rst As DAO.Recordset
    vKategorie = Nz(Me.xKategorie.Value, "")
    vAnlage = Nz(Me.xanlage.Value, "")
    vFamiliename = Nz(Me.xFamiliename.Value, "")
    vOrt = Nz(Me.xOrt.Value, "")
    vJahr = Nz(Me.xJahr.Value, "")
    vVerkauft = Nz(Me.chkVerkauft.Value, "")
    miFiltro = ""
    If vKategorie <> "" Then
    miFiltro = " AND [Kategorie]='" & vKategorie & "'"
    End If
    If vAnlage <> "" Then
    miFiltro = miFiltro & " AND [Projekte.Anlage.Value]='" & vAnlage & "'"
    End If
    If vFamiliename <> "" Then
    miFiltro = miFiltro & " AND [Familiename] LIKE '*" & vFamiliename & "*'"
    End If
    If vOrt <> "" Then
    miFiltro = miFiltro & " AND [Ort] LIKE '*" & vOrt & "*'"
    End If
    If vJahr <> "" Then
    miFiltro = miFiltro & " AND [Jahr]=" & vJahr
    End If
    If vVerkauft <> "" Then
    miFiltro = miFiltro & " AND [Verkauft]=" & vVerkauft
    End If
    vLargo = Len(miFiltro)
    If vLargo > 0 Then
    miFiltro = Right(miFiltro, vLargo - 4)
    End If
    Me.FPSuchen.Form.Filter = miFiltro
    Me.FPSuchen.Form.FilterOn = True
    Set Rst = Me.FPSuchen.Form.Recordset.Clone
    If Rst.RecordCount = 0 Then
        MsgBox "Es würde keine Suchtergebnisse gefunden", vbInformation, ""
        Form.RecordSource = "Select * from Aux_Projekte"
        Me.xKategorie = ""
        Me.xanlage = ""
        Me.xFamiliename = ""
        Me.xOrt = ""
        Me.xJahr = ""
    End If
End Sub

Mil gracias a todo. Problema resuelto y he aprendido mucho por el camino.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Norberto
Val: 1.094
Oro
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Filtro de formulario con 6 criterios

Publicado por Norberto (753 intervenciones) el 22/03/2018 15:30:06
Hola.

Me alegro que se haya resuelto y ya que estamos y de propina, si alguna vez tienes que usar un criterio con fechas, la forma sería la siguiente:

1
miFiltro = "Datum = #" & Format(Me.txtDatum, "mm/dd/yyyy") & "#"

Y, en el caso de un valor booleno:

1
miFiltro = "Aktiv = " & IIf(Me.chkAktiv, "True", "False")

En este caso se puede simplificar usando sólo el nombre del campo tal que así:

1
miFiltro = "Aktiv"

Un saludo,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 29
Ha disminuido su posición en 3 puestos en Access (en relación al último mes)
Gráfica de Access

Filtro de formulario con 6 criterios

Publicado por Zirado (12 intervenciones) el 22/03/2018 15:52:10
Gracias por la propina! quien sabe cuando puede hacer falta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar