Formulario de consulta con varios criterios

Tengo una BD sencilla en Access 2007, tabla principal vinculada a dos tablas secundarias, formulario principal para carga de registros con un subformulario. He creado otro formulario exclusivo para búsquedas con 5 textbox independientes y he creado una consulta basada en la tabla principal. Lo que necesito es poder introducir en dichos textbox los criterios de busqueda, puede ser en todos o en algunos, y que al presionar un boton me muestre en un cuadro de lista en el mismo formulario los registros que se ajustan a los criterios seleccionados. Además, que se pueda seleccionar de dicha lista cual imprimir en un informe.

1 Respuesta

Respuesta
1

Lo que debes hacer es ir analizando si los distintos cuadros de texto de búsqueda tienen valor o no, para construir la parte de filtro (el WHERE) de la SQL que te servirá de base para el cuadro de lista.

Sería una cosa así, suponiendo que tus cuadros de texto se llamen txtFiltro1, txtFiltro2... y el cuadro de lista se llame lstResultados:

Private Sub cmdFiltrar_Click()
Dim miSQL as String
Dim miFiltro as String
'Inicias la parte común de la SQL (la que coge todos los registros)
miSQL="SELECT * FROM TuTabla " 'Fijate que hay un espacio antes de las comillas de cierre
'Inicias el filtro
miFiltro="WHERE " 'Fijate que hay un espacio antes de las comillas de cierre
'Analizas el primer cuadro de filtro (campo de tipo texto)
If Nz(Me.txtFiltro1,"")<>"" Then
miFiltro=miFiltro & "[NombreCampo1]='" & Me.txtFiltro1 & "' AND "
End If
'Analizas el segundo cuadro de filtro (campo de tipo número)
If Nz(Me.txtFiltro1,-1)<>-1 Then
miFiltro=miFiltro & "[NombreCampo2]=" & Me.txtFiltro2 & " AND "
End If
'Analizas el tercer cuadro de filtro (campo de tipo fecha)
If Nz(Me.txtFiltro3,-1)<>-1 Then
miFiltro=miFiltro & "[NombreCampo3]=#" & Format(Me.txtFiltro3,"mm/dd/yyyy") & "# AND "
End If
...
'Quitas el último AND
if len(miFiltro)>6 Then 
miFiltro=Left(miFiltro,len(miFiltro)-5)
Else
MsgBox "No has seleccionado ningún campo para filtrar"
Exit Sub
End If
'Construyes la SQL Completa para el cuadro de lista
miSQL=miSQL & miFiltro
'Se la asignas al cuadro de lista
Me.lstResultados.RowSource=miSQL
Me.lstResultados.Requery
End Sub

Para seleccionar un valor del cuadro de lista, en su evento "Al hacer click" le generas un código como este:

Private Sub lstResultados_Click()
DoCmd.OpenReport "NombreInforme",,,"[CampoClave]=" & Me.lstResultados
End Sub

Supongo que tienes un campo clave principal (CampoClave, de tipo numérico, y que es la columna dependiente del cuadro de lista, es decir, el valor que coge el cuadro de lista)

¡Gracias Sveinbjorn El Rojo!... Mi campoclave es de texto pues coge un código alfanumérico... Lo pruebo y te digo como me fue...

Entonces te quedará algo así:

Private Sub lstResultados_Click()
DoCmd.OpenReport "NombreInforme",,,"[CampoClave]='" & Me.lstResultados & "'"
End Sub

es decir, con comillas simples antes y después del valor que coja el cuadro de lista. 

Un saludo y no te olvides de valorar la respuesta.

¡Gracias!. Funcionó de maravillas!. Ahora algunas ultimas preguntas: 1-Tengo el botón limpiar que cuando lo oprimo me limpia todos los textbox, ¿cómo hago para que ese mismo botón limpie el cuadro lista?. 2- Necesito otro botón que me imprima en un determinado informe el resultado de la lista. Nuevamente agradecido!

Fácil:

1º/ Añade esto a tu código:

Me.lstResultados.Rowsource=""

Me. LstResultados. Requery

2º/ Crea un informe con los mismos campos que tenga el cuadro de lista, y en el botón le pones este código:

DoCmd. OpenReport "NombreInforme", acViewDesign,,, acHidden
Reports("NombreInforme").RecordSource = Me.lstResultados.RowSource
DoCmd. Close acReport, "NombreInforme", acSaveYes
DoCmd. OpenReport "NombreInforme", acViewPreview

¡Gracias!. Probando...

Hola Sveinbjorn El Rojo!... Te comento que el Me.lstResultados.Rowsource="" efectivamente limpia el listbox pero cuando realizo otra busqueda no me arroja los resultados... Tal vez esté haciendo algo mal... Te comento que no utilicé tu codigo para el filtro -pues no me funcionó- sino que utilicé un ejemplo que encontre en la red que me pareció más sencillo y consistía en poner un criterio en la consulta: Como "*" & ([Formularios]![miformulario]![mitxtbox]) & "*"  y en el evento al hacer click del boton_buscar: Lista_RESULTADO.Requery... Funciona muy bien pero solo tengo el inconveniente de limpiar el listbox y que vuelva a llenarse con el resultado de la busqueda... Espero tu gentil ayuda... Gracias!

Te muestro el código de mi boton_limpiar:

Private Sub boton_limpiar_Click()
txt_1 = clearcontent
txt_2 = clearcontent
txt_3 = clearcontent
txt_4 = clearcontent
txt_5 = clearcontent
txt_6 = clearcontent
txt_7 = clearcontent
Lista_RESULTADO.Rowsource = ""
End Sub

Este código limpia efectivamente todos los textbox y el list box pero cuando realizo otra búsqueda el listbox se queda en blanco... Saludos! 

El código del botón limpiar es correcto.

El que tienes que modificar es el del botón filtrar, en el que tendrás que indicarle el origen de datos del cuadro de lista (imagino que será la consulta) antes del Requery:

Lista_RESULTADO.Rowsource ="NombreConsulta"

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas