Buscar por varios campos y filtrar mientras escribes

¿Es posible buscar en un subformulario (tipo hoja de datos) por varios campos mientras escribes?

Es decir, yo escribo en un campo y simultáneamente, el subformulario presenta el resultado del filtro. Desde un solo campo lo sé hacer, hay varios ejemplos en la web. Hasta ahí bien. Pero en el momento que meto más campos, todo se complica.

En el resto de campos que no son ActiveControl, puedo hacer un bucle y buscar su valor (no text que es lo que busco en el ActiveControl) y más o menos lo consigo, creo, pero si cambio o borro el texto de un campo (volveríamos al ActiveControl), el cambio no lo recoge el filtro.

2 Respuestas

Respuesta

Si la referencia para buscar en tres (o mas) campos es la misma, no veo cual es el problema.

Es lo mismo que se hace para un campo, pero concatenando las condiciones con OR (que se cumpla en cualquiera de los campos) o con AND (que se cumpla en los tres campos).

Que el formulario sea continuo o en hoja de datos es indiferente (solo es una forma de presentar datos).

Que se utilice la propiedad TEXT solo indica que se utiliza el texto que se esta introduciendo y que se efectúa la búsqueda en tiempo real.

Aclarando lo de TEXT:

Al iniciar la introducción de un dato (comenzar a teclearlo) las pulsaciones se han de guardar en una variable temporal, al finalizar su introducción, el valor actual en el objeto pasa a la propiedad OLDVALUE, el valor de/en TEXT a la propiedad VALUE y la propiedad TEXT se desprecia.

Un ejemplo, en un cuadro de texto hay un valor ("Pedro")

En VALUE === Pedro, EN TEXT ==="" (nada)
Se teclea el primer carácter de Luis (la 'L')
En VALUE === Pedro, EN TEXT === L
Se teclea el segundo carácter de Luis (la 'u')
En VALUE === Pedro, EN TEXT === Lu
Se teclea el tercer carácter de Luis (la 'i')
En VALUE === Pedro, EN TEXT === Lui
Se teclea el cuarto carácter de Luis (la 's')
En VALUE === Pedro, EN TEXT === Luis

Se valida la entrada (un simple 'enter')
En OLDVALUE === Pedro, EN VALUE === Luis
En este momento VALUE = TEXT
Se guarda el registro:
En OLDVALUE === Luis, EN VALUE === Luis en TEXT ""(nada)

Esto permite utilizar lo que se escribe en tiempo de ejecución (según se teclea) y si se aborta la introducción de datos que no se pierdan los originales y mientras no se guarde el registro, la recuperación de los valores iniciales (de todas las modificaciones en cualquier campo gracias a OLDVALUE).

Respuesta

Este ejemplo le puede servir

https://youtu.be/Bwg4KlJEkX4 

Haga clic en "Filtro con Subformulario" y estudie el código del evento Al cambiar de este control

A medida que vaya escribiendo busca el texto en todos los campos de la tabla o consulta como lo muestra este código.

Public Function toma_todos(TblQuery As Byte, tblqueryNombre As String, strTexto As String) As String
 'Función para tomar todos los campos de la tabla o consulta para hacer la búsqueda
    Dim db As DAO.Database
    Dim tdfld As DAO.TableDef
    Dim fld As Field
    Dim qryfld As DAO.QueryDef
    Dim sFiltro As String
    Set db = CurrentDb()
  If TblQuery = 1 Then
    Set tdfld = db.TableDefs(tblqueryNombre)
    For Each fld In tdfld.Fields
        If fld.Type <> 4 And fld.Type <> 8 Then 'No tocar campo automumérico
              sFiltro = sFiltro & "StrConv(" & fld.Name & ", 2, 1042)" & " LIKE '*" & _
               StrConv(Replace(strTexto, "'", "''"), 2, 1042) & "*'" & " OR "
        End If
    Next
    If sFiltro <> "" Then
     sFiltro = Left(sFiltro, Len(sFiltro) - 4)
    End If
    Set tdfld = Nothing
  Else 'Tomar campos de la consulta
    Set qryfld = db.QueryDefs(tblqueryNombre)
    For Each fld In qryfld.Fields
      If fld.Type <> 4 And fld.Type <> 8 Then 'No tocar campo automumérico o fecha
              sFiltro = sFiltro & "StrConv(" & fld.Name & ", 2, 1042)" & " LIKE '*" & _
               StrConv(Replace(strTexto, "'", "''"), 2, 1042) & "*'" & " OR "
       End If
    Next
    If sFiltro <> "" Then
     sFiltro = Left(sFiltro, Len(sFiltro) - 4)
    End If
    Set tdfld = Nothing
    Set db = Nothing
    Set qryfld = Nothing
  End If
   Set db = Nothing
   toma_todos = sFiltro
End Function

Trate de adaptarlo a sus necesidades.

Ya, bueno, se lo agradezco pero no es lo que necesitaba. Lo que me pone es para buscar desde un solo campo si no me equivoco y además creo que es innecesario tanto código para filtrar directamente en un subformulario, porque ya lo he conseguido yo solita.

Yo al final solo pedía que me revisaran el código porque no estoy muy segura pero, de momento me funciona.

Pero bueno, pues nada :-) Lo dejo para quien le pueda hacer falta.

¿Y cuál es el código? Parece que no entendió la respuesta o yo no entendí su pregunta. Pero sería bueno ver su código así aprendo algo nuevo, nunca es tarde

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas