In Access zoeken naar een record binnen een formulier

Status
Niet open voor verdere reacties.

rolfohtar

Gebruiker
Lid geworden
23 aug 2008
Berichten
136
Hallo,

Ik ben bezig met een bestand voor al mijn contacten. Ik heb het vrijwel helemaal klaar, ik zit alleen nog met de zoekfunctie. De situatie is als volgt:

  • Ik heb een formulier genaamd Contacten_lijst.
  • Daarin heb ik een veld waarin ik een zoekterm kan kiezen, genaamd ZoekForm
  • Naast ZoekForm heb ik een knop genaamd cmdZoeken waarmee ik een [gebeurtenisprocedure] aanzet, die zorgt voor het zoeken. Dit met behulp van filters (zie code 1). Het is de bedoeling dat er in meerdere kolommen tegelijk gezocht kan worden, via één zoekvak.
  • Daarnaast staat nog een knop, die alle filters weer weghaalt, genaamd cmdAllesWeergeven (zie code 2).

Code 1:
Code:
Private Sub cmdZoeken_Click()
On Error GoTo cmdZoeken_Err

    If (Eval("[Forms]![Contacten_lijst]![ZoekForm] Is Null")) Then
        ' Clear Filter when search box empty
        DoCmd.RunCommand acCmdRemoveFilterSort
        DoCmd.SetProperty "cmdAllesWeergeven", acPropertyEnabled, "0"
        End
    End If
    ' Handle "'s in search
    TempVars.Add "strSearch", Replace([Forms]![Contacten_lijst]![ZoekForm], """", """""")
    ' Build the Filter
    TempVars.Add "strFilter", "([Voornaam] Like "" * " & [TempVars]![strSearch] & " * "" )"
    TempVars.Add "strFilter", TempVars!strFilter & " OR ([Achternaam] Like "" * " & [TempVars]![strSearch] & " * "" )"
    TempVars.Add "strFilter", TempVars!strFilter & " OR ([Bedrijfsnaam] Like "" * " & [TempVars]![strSearch] & " * "" )"
    DoCmd.ApplyFilter "", TempVars!strFilter, ""
    TempVars.Remove "strFilter"
    TempVars.Remove "strSearch"
    DoCmd.SetProperty "cmdAllesWeergeven", acPropertyEnabled, "1"

cmdZoeken_Exit:
    Exit Sub

cmdZoeken_Err:
    MsgBox Error$
    Resume cmdZoeken_Exit
End Sub

Code 2:
Code:
Private Sub cmdAllesWeergeven_Click()
On Error GoTo Algemeen_filters_uit_Err

    On Error Resume Next
    DoCmd.RunCommand acCmdRemoveAllFilters
    Me.OrderBy = "ID"
    Me.OrderByOn = True
    Me!ZoekForm = ""


Algemeen_filters_uit_Exit:
    Exit Sub

Algemeen_filters_uit_Err:
    MsgBox Error$
    Resume Algemeen_filters_uit_Exit
End Sub

Code 2 werkt helemaal goed. Maar de zoekcode (1) die krijg ik niet aan de praat. Wanneer ik dan ga zoeken, dan wordt er wel gefilterd, maar ik krijg alleen een witte regel, zonder de overeenkomende records erin.

Hoe krijg ik code 1 wel aan de praat?
 
Gruwelijk ingewikkelde manier van filteren, maar als het werkt, dan werkt het. Alhoewel, was dat niet net het probleem?

"([Voornaam] Like " & Chr(34) & "*" & [TempVars]![strSearch] & "*" & Chr(34) * ")"
 
Bedankt voor je reactie. Ik wist niet dat dit een zo ingewikkelde manier van filteren was. Als je een betere oplossing met hetzelfde resultaat hebt, dan hoor ik dat graag.

De code die je net hebt neergezet lijkt niet te werken, ik krijg de foutmelding "Typen komen niet met elkaar overeen".
 
Ik ben hier al een hele tijd met bezig. Ik kom er nu achter dat het wel lijkt te werken wanneer ik het als [ingesloten macro] invoer. Maar dan snap ik niet waarom ik het niet in VBA voor elkaar krijg.
 
Ik zou zo iets doen, op basis dus van je tekstveld (hier maar even strSearch genoemd)

Code:
Private Sub strSearch_Change()
Dim sFilter As String

    If Me.strSearch.Text & "" = "" Then
        Me.Filter = ""
        Me.FilterOn = False
    Else
        sFilter = ""
        If Not Me.strSearch.Text & "" = "" Then
            sFilter = "([Voornaam] Like " & Chr(34) & "*" & Me.strSearch.Text & "*" & Chr(34) & ") OR "
            sFilter = sFilter & "([Achternaam] Like " & Chr(34) & "*" & Me.strSearch.Text & "*" & Chr(34)
            sFilter = sFilter & "([Bedrijfsnaam] Like " & Chr(34) & "*" & Me.strSearch.Text & "*" & Chr(34)
        End If
        Me.FilterOn = True
        Me.Filter = sFilter
    End If
    Me.Requery

End Sub
 
Ik heb het toegepast, maar helaas krijg ik een foutmelding.

Ik begon te typen in het tekstvak, bij de eerste letter, een r, kreeg ik al deze foutmelding:

Fout 3075 tijdens uitvoering:
Ontbrekend ),] of element in query-expressie ([Voornaam] Like "*r*") OR ([Achternaam] Like "*r*"([Voornaam] Like "*r*".
 
Als je mijn voorbeeld bekijkt, dan zie je dat hij niet klopt; alleen achter [Voornaam] staat de code die OR er bij plakt. En die heb je bij Achternaam ook nodig. Krijg je gelijk het haakje er bij...
 
Dat was het inderdaad. Ik heb nu:

Code:
Private Sub strSearch_Change()
Dim sFilter As String
    If Me.strSearch.Text & "" = "" Then
        Me.Filter = ""
        Me.FilterOn = False
    Else
        sFilter = ""
        If Not Me.strSearch.Text & "" = "" Then
            sFilter = "([Voornaam] Like " & Chr(34) & "*" & Me.strSearch.Text & "*" & Chr(34) & ") OR "
            sFilter = sFilter & "([Achternaam] Like " & Chr(34) & "*" & Me.strSearch.Text & "*" & Chr(34) & ") OR "
            sFilter = sFilter & "([Bedrijfsnaam] Like " & Chr(34) & "*" & Me.strSearch.Text & "*" & Chr(34) & ")"
        End If
        Me.FilterOn = True
        Me.Filter = sFilter
    End If
    Me.Requery
End Sub

Alleen als ik nu in het tekstvak typ, dan ververst hij direct bij de eerste letter en wordt het filter toegepast en gaat meteen de focus naar de eerste kolom. Dat betekend dat ik niet verder kan typen in het tekstvak.
Hoe kan ik dan de focus houden in dat tekstvak zodat ik een hele naam kan typen zonder dat de focus verloren gaat, maar dat wel het filter wordt toegepast?
 
Ik gebruik de filter code iets anders, want ik heb er een functie van gemaakt. Die roep ik aan, en na het opbouwen van het filter zet ik de focus weer terug op het tekstvak. Dat ziet er dan zo uit:

Code:
    sNaam = Screen.ActiveControl.Name
    sTag = Screen.ActiveControl.Tag
    sWaarde = Me.txtFilter2.Text
    CheckFilter sNaam, sWaarde
    Me.txtFilter2 = sWaarde
    Me.txtFilter2.SelStart = Me.txtFilter2.SelLength

Beetje aanpassen, en het zou moeten werken.
 
Hoi Michel,

Ik krijg het allemaal niet voor elkaar. Ik heb nu geprobeerd een ander filter toe te passen. Een van jou volgens mij, al ben ik de url kwijt van de post.

Ik heb dat bestand (semi-origineel: Filteren.mdb) proberen aan te passen op mijn eigen gegevens (File: Filteren - Contacten.mdb) en nu krijg ik de foutmelding dat de kolom instellingen niet bekend is, wat ook klopt, want die heb ik verwijderd. Alleen ik zie in VBA nergens een verwijzing naar de kolom instellingen staan. Ik kan dus niets aanpassen (zover mijn kennis strekt) om het te laten werken voor mij.

En kan ik ook zorgen dat er slechts 1 zoekvak is die in alle rijen (behalve telefoonnummer) zoekt naar het ingevulde?

Bestand (lukte niet via deze site helaas)
 
Je had een versie gevonden waar nog een paar foutjes in zaten; die heb ik er dus maar even uitgehaald :)
De werking is overigens relatief simpel, zodat je hem makkelijk moet kunnen uitbreiden. Het principe is gebaseer op één trucje: de naam van het veld waarop je wilt filteren zit in de eigenschap <Extra Info> (tag in het engels) van het zoekveld. Bij meerdere zoekvelden moet je namelijk weten in welk veld de zoekwaarde moet worden gezocht. Per zoekveld geef je dus in deze eigenschap aan in welk veld je gaat zoeken. De rest is vrij uniform, dus het toevoegen van een nieuw zoekveld is simpel een kwestie van een zoekveld kopieëren, en het tabelveld noteren in de eigenschap <Extra Info>.
 

Bijlagen

Dat verklaard een hoop :P. Het schiet niet op om verkeerde versies te gebruiken.
Ik snap het principe van wat je uitlegt en begrijp ook hoe ik dat zou moeten toepassen.

Is het ook mogelijk om hiermee slechts één zoekveld te hebben waarin een keyword getypt kan worden waar dan naar gezocht wordt in Voornaam, Achternaam en Bedrijfsnaam?
 
Met een kleine aanpassing, zou dat wel moeten kunnen. Zelf zou ik dat overigens nooit doen, want als de db groot wordt, loopt de zoektijd op, en ga je veel te veel records vinden. Ik zou dus altijd zoeken op een specifiek veld, zoals in het voorbeeld. Ik zou er nog eens een nachtje over slapen of het wel zo'n goed idee is om door alle velden heen te zoeken :)
 
Ik heb er een nachtje over geslapen ;). Ik wil toch graag één zoekveld, maar ik wil niet dat het de boel vertraagt. Ik heb nu een andere oplossing bedacht: ik heb een query aangemaakt met daarin een veld Contactpersoon, dat is een samenvoeging van Voornaam en Achternaam. Het werkt, maar zou dat ook de boel zo vertragen of is dit een goede oplossing?
 
Da's een betere oplossing; zoeken in één veld is geen probleem. Dat lag meer in het feit dat je met één zoektekst door meer velden wilt gaan zoeken. Je kunt dat samengestelde veld overigens ook op je formulier maken; dat hoeft niet in een query, al is dat uiteraard een prima oplossing!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan