Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Filtrar un listbox por varios criterios

Estas en el tema de Filtrar un listbox por varios criterios en el foro de Visual Basic clásico en Foros del Web. Tengo un recordset que me busca los registros que se escriben en una caja de texto en una tabla de access y me los muestra ...
  #1 (permalink)  
Antiguo 14/04/2010, 13:23
 
Fecha de Ingreso: febrero-2010
Mensajes: 28
Antigüedad: 14 años, 2 meses
Puntos: 0
Filtrar un listview por varios criterios

Tengo un recordset que me busca los registros que se escriben en una caja de texto en una tabla de access y me los muestra en un listwiev en modo reporte. Al haber solo un criterio de busqueda lo hace perfectamente. El problema que tengo es que me es imprescindible poder filtrar por todos los campos de la tabla.

Es una tabla en la que tengo veinticuatro campos con mas de 50000 registros, osea es bastante grande y no hay dos registros exactamente igual, basicamente por que hay dos campos de fecha, uno para el inicio de la operacion y otro para el final de la operacion.

Lo que quiero hacer es un filtrado al estilo del autofiltro de excell y no se como hacerlo y si es posible.

Es una tabla en la que tengo veinticuatro campos con mas de 50000 registros, osea es bastante grande y no hay dos registros exactamente igual, basicamente por que hay dos campos de fecha, uno para el inicio de la operacion y otro para el final de la operacion.

Lo que quiero hacer es un filtrado al estilo del autofiltro de excell y no se como hacerlo y si es posible.

He probado con esta sentencia:

rs.Open "select * from Tabla_de_fabricacion where REFERENCIA = '" & Referencia & "' and '" & Operario & "'", cn

pero no funciona. Se queda colgado. SI uso solo solo un criterio, busca perfectamente pero al meter dos ya no y necesitaria meter por lo menos diez criterios de busqueda. Como puedo hacerlo?. A ver si por favor alguien me puede ayudar.

Última edición por 41b3r70; 19/04/2010 a las 15:37 Razón: Tengo ya la cabeza loca y habia confundido el listview con el listbox
  #2 (permalink)  
Antiguo 15/04/2010, 03:36
 
Fecha de Ingreso: noviembre-2005
Mensajes: 751
Antigüedad: 18 años, 5 meses
Puntos: 13
Respuesta: Filtrar un listbox por varios criterios

En la segunda condición te falta el campo con el que comparar el valor de Operario, es decir algo como:

where REFERENCIA = '" & Referencia & "' and OPERARIO='" & Operario & "'"
  #3 (permalink)  
Antiguo 19/04/2010, 15:42
 
Fecha de Ingreso: febrero-2010
Mensajes: 28
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Filtrar un listview por varios criterios

Gracias Insomnia. He probado y funciona. Pero me obliga a buscar por ambos campos. Yo lo que queria mas bien era poder buscar por uno, por otro o por los dos. Imagino que habra que programar cada una de las opciones, el problema es que son muchas combinaciones posibles de busqueda. Quiero buscar por fecha y por operario, por referencia y operario, solo por referencia, solo por operario.... etc etc. Lo mas parecido que he visto son los autofiltros de excell. Filtras una columna, luego filtras los resultados con otro filtro en otra columna y asi. es posible hacerlo???

Última edición por 41b3r70; 20/04/2010 a las 09:39
  #4 (permalink)  
Antiguo 20/04/2010, 02:03
 
Fecha de Ingreso: noviembre-2005
Mensajes: 751
Antigüedad: 18 años, 5 meses
Puntos: 13
Respuesta: Filtrar un listbox por varios criterios

Hola

Puedes crear un formulario con unos CheckBox con las posibles opciones de busqueda que quieras (fecha, operario, referencia,...). Luego vas revisando los checkbox seleccionados y construyendo la sentencia select. P.e.

Código vb:
Ver original
  1. Dim SQL as String
  2.  
  3. SQL = "select * from Tabla_de_fabricacion where "
  4. If check1.value=1 'El usuario ha activado esta opción
  5.   SQL=SQL & "referencia ='" & referencia & "'"
  6. end if
  7. if check2.value=1
  8. .
  9. .
  10. .

De esta forma vas creando poco a poco la sentencia SQL, tendras que tener en cuenta si solo ha seleccionado un filtro o varios, en el caso de varios tendrás que añadir el AND antes de la condición.

--Saludos--
  #5 (permalink)  
Antiguo 20/04/2010, 09:38
 
Fecha de Ingreso: febrero-2010
Mensajes: 28
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Filtrar un listview por varios criterios

Vale gracias. Esta mañana he hecho eso mismo que me comentas, ir añadiendo checkbox y la idea que tenia era esa, ir contruyendo poco a poco los filtros pero pensaba que a lo mejor habia algo mas facil para hacerlo sin tener que añadir todos los posibles casos de busqueda. Lo ire haciendo poco a poco, supongo que quitare los criterios que no se vayan a usar para hacerlo mas corto. Ya te contare que tal. Gracias por tu tiempo.
  #6 (permalink)  
Antiguo 20/04/2010, 09:48
 
Fecha de Ingreso: noviembre-2005
Mensajes: 751
Antigüedad: 18 años, 5 meses
Puntos: 13
Respuesta: Filtrar un listbox por varios criterios

De nada y suerte con el proyecto.

--Saludos--
  #7 (permalink)  
Antiguo 20/04/2010, 16:22
 
Fecha de Ingreso: febrero-2010
Mensajes: 28
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Filtrar un listbox por varios criterios

Me he encontrado con un problema que no se resolver otra vez. Resulta que 3 de los campos que hay que rellenar para hacer las busquedas los cargo en 3 combobox mediante un recorset. Esto me funciona perfectamente y en los combos aparecen los valores que hay en la tabla de access. El problema surge cuando he seleccionado un valor de los combos. Osea el combo esta cerrado y con un valor dentro.

Intento hacer la busqueda con el valor ". text" del combo pero el programa se queda colgado.

'Buscar Solo por Operario
ElseIf Chk_Orden.Value = 0 And Chk_Fecha.Value = 0 And Chk_Codigo.Value = 0 And Chk_Referencia.Value = 0 And Chk_Operario.Value = 1 _
And Chk_Maquina.Value = 0 And Chk_Operacion.Value = 0 And Chk_Lote.Value = 0 And Chk_Visibles.Value = 0 And Chk_Archivadas.Value = 0 Then
rs.Open "select * from TablaAlberto where Nombre = '" & Cbb_Operario.Text & "'", cn


Tampoco me funciona al hacer la busqueda por fecha.

'Buscar Solo por fecha
'ElseIf Chk_Orden.Value = 0 And Chk_Fecha.Value = 1 And Chk_Codigo.Value = 0 And Chk_Referencia.Value = 0 And Chk_Operario.Value = 0 _
And Chk_Maquina.Value = 0 And Chk_Operacion.Value = 0 And Chk_Lote.Value = 0 And Chk_Visibles.Value = 0 And Chk_Archivadas.Value = 0 Then
'rs.Open "select * from TablaAlberto where FHInicio = '" & Txt_Fecha & "'", cn

Por que me pasa esto? Con otros campos y otras busquedas funciona perfectamente. He de decir que el campo fecha es logicamente para fechas y el campo operario es solo texto "apellidos, nombre".
  #8 (permalink)  
Antiguo 21/04/2010, 08:23
Avatar de lokoman  
Fecha de Ingreso: septiembre-2009
Mensajes: 502
Antigüedad: 14 años, 7 meses
Puntos: 47
Respuesta: Filtrar un listbox por varios criterios

Por que no haces la sentencia y luego la pasas? es un poquito mas entendible...

dim strCabecera as string, strSelect as string, strSentencia as string

strCabecera = "SELECT * FROM TABLAALBERTO WHERE "

IF Chk_Operario.Value = 1 THEN
IF strSelect<>"" then
strSelect=strSelect & " Nombre = '" & Cbb_Operario.Text & "'"
else
strSelect=strSelect & " AND Nombre = '" & Cbb_Operario.Text & "'"
end if
end if

IF Chk_Fecha.Value = 1 THEN
IF strSelect<>"" then
strSelect=strSelect & " FHInicio = '" & Txt_Fecha & "'"
else
strSelect=strSelect & " AND FHInicio = '" & Txt_Fecha & "'"
end if
end if
...
...
...
strSentencia=strCabecera & strSelect '<---- DETEN EL PROGRAMA AQUI PARA EVALUAR LA SENTENCIA
rs.Open strSentencia, cn
..
..

Asi puedes evaluar la sentencia antes del RS.OPEN

Última edición por lokoman; 21/04/2010 a las 08:41
  #9 (permalink)  
Antiguo 21/04/2010, 09:56
 
Fecha de Ingreso: noviembre-2005
Mensajes: 751
Antigüedad: 18 años, 5 meses
Puntos: 13
Respuesta: Filtrar un listbox por varios criterios

Hola

Eso es, trata de hacerlo como dice lokoman, ya que si lo haces a tu forma las posibles combinaciones serian un montón (no pongo cuantas porque de estadística ando un poco flojo) de la otra forma "solo" tienes tantos if como condiciones a mirar.

En la select del nombre no veo ningún error, en el de la fecha puede que tengas algunos problemas con los formatos de la fecha.

Como dice lokoman, comprueba el valor de la variable que contiene la sentencia SQL final, luego puedes pegar esa sentencia directamente en la base de datos de access y ejecutarla para ver el posible error

--Saludos--
  #10 (permalink)  
Antiguo 25/04/2010, 14:33
 
Fecha de Ingreso: febrero-2010
Mensajes: 28
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Filtrar un listbox por varios criterios

Hola. He probado a hacerlo como dice lokoman. No funciona me dice que la sentencia select tiene una sintaxis no valida. Os pongo el codigo que tengo, bueno una parte que es largo. Os pongo las dos primeras opciones y luego la busqueda en el recordset a ver si veis el fallo porque yo no he sido capaz.

If Chk_Orden.Value = 1 Then
If strSelect <> "" Then
strSelect = strSelect & " Orden = '" & Txt_Orden & "'"
Else
strSelect = strSelect & " and Orden = '" & Txt_Orden & "'"
End If
End If

If Chk_Fecha.Value = 1 Then
If strSelect <> "" Then
strSelect = strSelect & " FHInicio = '" & Txt_Fecha & "'"
Else
strSelect = strSelect & " and FHInicio = '" & Txt_Fecha & "'"
End If
End If

Dim clmAdd As ColumnHeader
Dim itmAdd As ListItem

Set rs = New ADODB.Recordset

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= C:\Documents _
and Settings\Alberto\Escritorio\Goitek_Logic.mdb"

rs.Source = "TablaAlberto"
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic

If rs.State = 0 Then
strCabecera = "Select * from TablaAlberto Where"
strSentencia = strCabecera & strSelect

rs.Open strSentencia, cn

End If




Y el error que me da:

Error '-2147217900 (80040e14)' en tiempo de ejecucion:
Error de sintaxis (falta operador) en la expresion de consulta 'and Orden='090044'

090044 es el numero de orden que busco.
  #11 (permalink)  
Antiguo 26/04/2010, 01:24
 
Fecha de Ingreso: noviembre-2005
Mensajes: 751
Antigüedad: 18 años, 5 meses
Puntos: 13
Respuesta: Filtrar un listbox por varios criterios

Hola

Acostumbra a utilizar los puntos de interrupción, coloca uno en la linea "strSentencia = strCabecera & strSelect" y revisa el valor que coge la sentencia SQL. A primera vista, me parece que las condiciones están al revés, es decir, creo que tienes que cambiar el <> por =

Código vb:
Ver original
  1. If Chk_Orden.Value = 1 Then
  2.    If strSelect = "" Then
  3.       strSelect = strSelect & " Orden = '" & Txt_Orden & "'"
  4.    Else
  5.       strSelect = strSelect & " and Orden = '" & Txt_Orden & "'"
  6.    End If
  7. End If
  8.  
  9. If Chk_Fecha.Value = 1 Then
  10.    If strSelect = "" Then
  11.       strSelect = strSelect & " FHInicio = '" & Txt_Fecha & "'"
  12.    Else
  13.       strSelect = strSelect & " and FHInicio = '" & Txt_Fecha & "'"
  14.    End If
  15. End If

De todas formas, repito, utiliza puntos de interrupción para depurar la aplicación, ya que es un sistema muy sencillo de depurar errores.

--Saludos--
  #12 (permalink)  
Antiguo 01/05/2010, 12:00
 
Fecha de Ingreso: febrero-2010
Mensajes: 28
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Filtrar un listbox por varios criterios

Ya lo he conseguido. Empece a usar los puntos de interupcion para ver el valor de las variables y me di cuanta que los fallos estaban en las comillas de las sentencias. Asi que lo he ido arreglando y funciona perfecto. Muchas gracias a los dos.
  #13 (permalink)  
Antiguo 03/05/2010, 01:52
 
Fecha de Ingreso: noviembre-2005
Mensajes: 751
Antigüedad: 18 años, 5 meses
Puntos: 13
Respuesta: Filtrar un listbox por varios criterios

Me alegro que todo funcione correctamente

--Saludos--

Etiquetas: criterios, filtrar, listbox
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:13.