Access - SuperFiltro Access

 
Vista:

SuperFiltro Access

Publicado por BMOTheGolem (8 intervenciones) el 13/03/2024 14:18:45
Buenas, tengo este modulo que saqué de un video de youtube, lo que hace es hacer un filtro de una lista, dejo el video donde lo cojí:
https://www.youtube.com/watch?v=vnmVcfBwtIw
pues he intentado modificar el codigo para a parte de hacer ese filtro, tenga un desplegable donde seleccionar por ejemplo el año de un campo, posteriormente dejo el codigo modificado por mi. Pero el problema es que cuando filtro primero desde el superfiltro y luego hago uso del desplegable, no funciona y solo filtra lo del desplegable ignorando lo que haya seleccionado en el cuadro de lista y ignorando tambien lo que he escrito en el cuadro de texto, ya que la variable sFiltro se vacia. pero si filtro primero el desplegable y luego el superfiltro si que filtra de forma simultanea. Mi intencion es que lo que ponga en el desplegable sea el primer filtro que aplique la consulta. Es decir, quiero que sea el mas restrictivo.

Dejo el codigo aqui:
Public Function BuscarEPF(ByVal ObjetoTipo As Byte, ByVal TextCambia As TextBox, ByVal TablaQuery As String, _
listBoxCampos As ListBox, Optional AListBox As Control, Optional mform As Form, Optional RepresentadaFiltro As String)


On Error GoTo hay_error

Dim frmcontrol As Form
Dim lscontrol As Control
Dim lscontrol_2 As Control
Dim varCampo As Variant
Dim sFiltro As String
Dim rFiltro As String


Set frmcontrol = mform
Set lscontrol = AListBox
Set lscontrol_2 = listBoxCampos




For Each varCampo In lscontrol_2.ItemsSelected()
sFiltro = sFiltro & "StrConv(" & lscontrol_2.ItemData(varCampo) & ", 2, 1042)" & _
" Like '*" & StrConv(Replace(TextCambia.Text, "'", "''"), 2, 1042) & "*'" & " OR "
Next varCampo

If RepresentadaFiltro <> "" Then
If sFiltro <> "" Then
rFiltro = "Representada = '" & RepresentadaFiltro & "' AND "
Else
rFiltro = "Representada = '" & RepresentadaFiltro & "' "
End If
Else
rFiltro = ""
End If

sFiltro = Mid(sFiltro, 1, Len(sFiltro) - 3)
strFiltroFinal = sFiltro
If ObjetoTipo = 1 Then
' Origen de datos para un cuadro de lista
lscontrol.RowSource = "SELECT * FROM [" & TablaQuery & "] WHERE " & rFiltro & sFiltro
Else
' Origen de datos para un formulario o subformulario
frmcontrol.RecordSource = "SELECT * FROM [" & TablaQuery & "] WHERE " & _
IIf(Len(sFiltro) > 0, sFiltro, 0)
End If
Debug.Print "Filtro: " & rFiltro & " " & sFiltro
Exit Function

hay_error_exit:
Exit Function


hay_error:
If Err.Number = 91 Then
MsgBox "Revise los parámetros..." & vbCrLf & vbCrLf & _
"Se require al menos un cuadro de texto o un formulario", vbCritical, "Error...."
ElseIf Err.Number = 5 Or Err.Number = 2185 Then
Resume Next
Else
MsgBox Err.Number & " " & Err.Description, vbCritical, "Cuidado..."
End If
Resume hay_error_exit
End Function
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

SuperFiltro Access

Publicado por Anonimo (3369 intervenciones) el 14/03/2024 19:50:57
Ojeando el solo el código publicado me llaman la atención un par de líneas.:

1
lscontrol.RowSource = "SELECT * FROM [" & TablaQuery & "] WHERE " & rFiltro & sFiltro

Que creo que esta escrito de forma mas correcta aqui:
1
Debug.Print "Filtro: " & rFiltro & " " & sFiltro

Para
1
rFiltro = "Representada = 'Juan Perez'"
1
sFiltro = "Comercial = 'Luis Gonzalez"

La primera expresión queda así:
1
"Representada = 'Juan Perez'Comercial = 'Luis Gonzalez"

La segunda asi:
1
"Representada = 'Juan Perez' Comercial = 'Luis Gonzalez"

En la primera dos errores:
.- falta un espacio entre las expresiones (puede haber mas de uno, pero nunca ninguno)
.- falta un operador (AND u OR)
1
2
"Representada = 'Juan Perez' AND Comercial = 'Luis Gonzalez"
"Representada = 'Juan Perez' OR Comercial = 'Luis Gonzalez"

En la segunda solo el operador (pero no es un error solo presenta los dos filtros)

Hay otro punto en el que tampoco estoy de acuerdo:

1
frmcontrol.RecordSource = "SELECT * FROM [" & TablaQuery & "] WHERE " & IIf(Len(sFiltro) > 0, sFiltro, 0)

Solo la condición:
1
WHERE " & IIf(Len(sFiltro) > 0, sFiltro, 0)

Si hay un filtro (bien construido) no hay problema, pero si no lo hay, habrá un:
1
 WHERE 0

Lo adecuado es que se añada el Where donde debe de estar (con el filtro) y de no haber filtro sobrara el Where (y el cero no tiene sentido), debería ser una cadena de texto vacía (o hay filtro o no hay filtro):

1
frmcontrol.RecordSource = "SELECT * FROM [" & TablaQuery & "] " & IIf(Len(sFiltro) > 0, " WHERE  " & sFiltro, "")
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 Eduardo Pérez Fernández

SuperFiltro Access

Publicado por Eduardo Pérez Fernández (336 intervenciones) el 15/03/2024 01:06:59
Yo soy el autor de la función Superfiltro() hoy he publicado la versión supefiltro Plus pero es de pago, no obstante, escríbame a [email protected] y si es posible adjunte su base de datos en formato RAR y trato de colaborarle.

Un saludo desde Colombia
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

SuperFiltro Access

Publicado por BMOTheGolem (8 intervenciones) el 15/03/2024 09:28:38
Gracias por las respuestas, todo solucionado. Gran trabajo de eduardo por compartir sus conocimientos, le estoy muy agradecido, saludos desde España.
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

SuperFiltro Access

Publicado por Victor (2 intervenciones) el 15/03/2024 19:36:57
Vi tu video de tu super filtro para ver si podía aprovechar algo del código para mi buscador reutilizables, pero muchas cosas no las entendí! Soy autodidacta todo lo que se de VBA Access lo he aprendido según lo he ido necesitando!

Me gustaría tener una opinión sobre mi buscador.

Gracias un saludo
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

SuperFiltro Access

Publicado por Anonimo (3369 intervenciones) el 15/03/2024 20:56:17
Hay una maxima en la programación que aconseja no trastear con lo que cumple con su función perfectamente.

Con el tiempo y la experiencia que se adquiere se puede avanzar a la version 2.0 (y posiblemente no se parezca mucho a la version 1.0)

Para poder dar una opinion realista hay que ver no solo el código de la función, hay que ver el entorno en que se aplica.
De ello se pueden extraer conclusiones, puede que (en función del entorno) existan otros métodos o que sobre/falte algo.

Normalmente es el usuario final (tenga o no conocimientos de programación) el que aprueba o rechaza algo (que al creador le parece fantástico ... solo "porque es su criatura").
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 Eduardo Pérez Fernández

SuperFiltro Access

Publicado por Eduardo Pérez Fernández (336 intervenciones) el 15/03/2024 21:28:49
Hay que saber es VBA avanzado hasta llegar a elaborar módulos de clase, si es programador basta con comprender el código y no necesariamente dónde se aplica, por ejemplo, la función Superfiltro Plus sirve para todo tipo de consultas, es estándar entonces no necesariamente se debe conocer el entorno donde se utiliza.
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