filter met lege velden

Status
Niet open voor verdere reacties.

Jos Van den Bro

Gebruiker
Lid geworden
25 mei 2006
Berichten
60
Hallo,

Bij een filter gebruik ik de criteria in een bepaalde tabel : Like ("*" & [zoekonder] & "*") or is null. Dit werkt goed en records met de lege velden worden dan ook nog weer gegeven wanneer er niets in het "parameter waarde" wordt ingevuld.

Doch wanneer ik op een tweede veld wil gaan zoeken op dezelfde wijze wordt er niet meer op alle velden gezocht.

Dit geeft tot gevolg dat wanneer er in het eerste veld moet gezocht worden de records met de lege velden in het tweede veld niet worden weergegeven.

Ook wanneer er niets in beide parameter waardes wordt in gevuld, worden niet alle records meer getoond.

Kan dit opgelost worden?

Groeten,

Jos
 
je kan het oplossen door een OR voorwaarde in je filter te zetten in plaats van een AND voorwaarde. Ik zou trouwens een query aanmaken om de gegevens die je wil uit te filteren in plaats van een filter op een tabel. Tabellen zijn er alleen om je gegevens te bewaren, ze vormen de basis van je database. Maar alle bewerkingen zoals filtreren, sorteren doe je best in queries of eventueel in de formulieren/rapporten. Niet in de tabellen.
 
Filteren kun je veel beter op een formulier doen, en niet in een tabel of in een query. In een formulier kun je het filter ook veel beter opbouwen en uitvoeren. Zo kun je bijvoorbeeld heel simpel met een Ja/Nee selectieveld aangeven of het filter AND of OR moet zijn.
 
Hallo Octafish

Ik doe dit al in een formulier maar dan krijg ik het zelfde fenomeen.

Ik dacht dit op te lossen via een filter maar dit is dan ook geen goed idee.

Dit is hoe ik mijn data ga filteren.

Hoe kan ik dit dan gaan aanpassen?

Dank bij voorbaat.

Groeten

Jos

Code:
  zoek_type = "toestel  like '" & "*" & zoektype & "*' "
  zoek_reg = " And " & ("registratie  like '" & zoekreg & "*'")
  zoek_serial = " And " & ("serial  like '" & "*" & zoekserial & "*'")
  zoek_comp = " And " & ("company  like '" & "*" & zoekcomp & "*'")
  zoek_plaats = " And " & ("plaats like '" & "*" & zoekplaats & "*'")
   
  
  te_zoeken = zoek_type & zoek_reg & zoek_serial & zoek_comp & zoek_plaats
  
  
   Me.Filter = te_zoeken
 
als je ook de lege waarden wil meebrengen kan je iets alsproberen:
Code:
zoek_type = "toestel  like ""*" & zoektype & ""*"" or toestel is null"
 zoek_reg = " And  (registratie  like """ & zoekreg & "*"" or registratie is null )"

enzovoort
 
Waarom filter je niet alleen op de ingevulde velden? Ik vind het een beetje onzin(nig) om te filteren op een veld waar je niet op filtert.
 
Om dat even uit te werken, dan krijg je dus dit:
Code:
Sub cmdFilter_Click()
Dim sFilter As String
    With Me
        If .ZoekType & "" <> "" Then sFilter = "Toestel Like ""*" & .ZoekType & """*"""
        If .ZoekReg & "" <> "" Then
            If sFilter <> "" Then sFilter = sFilter & " AND "
            sFilter = sFilter & "Registratie Like ""*" & .ZoekReg & """*"""
        End If
        If .ZoekComp & "" <> "" Then
            If sFilter <> "" Then sFilter = sFilter & " AND "
            sFilter = sFilter & "Company Like ""*" & .ZoekComp & """*"""
        If .ZoekPlaats & "" <> "" Then
            If sFilter <> "" Then sFilter = sFilter & " AND "
            sFilter = sFilter & "Plaats Like ""*" & .ZoekPlaats & """*"""
        End If
        If sFilter <> "" Then
            .Filter = sFilter
            .FilterOn = True
        Else
            .Filter = ""
            .FilterOn = False
        End If
    End With
End Sub

En hiermee filter je dus altijd op de juiste (namelijk: ingevulde) tekstvelden. Overigens is deze methode behoorlijk foutgevoelig (voor de gebruiker) want het is behoorlijk simpel om typefouten te maken. Daarnaast lijkt het er op dat je db niet lekker is genormaliseerd, omdat je op tekstvelden filtert, waar ik keuzelijsten had gebruikt. Die leveren dan (vermoedelijk) numerieke ID's op en geen tekst, en je kunt dus nooit typefouten maken.
 
OctaFish,

Lijkt mij een beetje kort door de bocht.

Als je zoekt op 1 veld dan zeg ik oké, nu heb je een situatie met noem maar wat honderdduizend record waarvan er 5000 van dat veld niet ingevuld zijn, op die manier filter je die 5000, waarop je weer een volgend filter kan los laten.

Gr. Cor

Je was me voor.
 
Laatst bewerkt:
@pletter: Desalniettemin snap ik je opmerking niet :).
 
Volgens mij gaat de originele vraag over het meenemen van lege velden in het resultaat, wat de code van octafish niet doet.
 
Bij een filter gebruik ik de criteria in een bepaalde tabel : Like ("*" & [zoekonder] & "*") or is null. Dit werkt goed en records met de lege velden worden dan ook nog weer gegeven wanneer er niets in het "parameter waarde" wordt ingevuld.

@noella: dan begrijp je ofwel de vraag niet, ofwel de manier van filteren niet. TS wil velden die leeg zijn óók zien als er geen filterwaarde voor is ingetypt. Door niet op een (al dan niet leeg) veld te filteren, zit dat veld altijd in de selectie. Je filtert er namelijk niet op, dus dat is hetzelfde als je in een query bij elk veld een '*' typt als criterium. Wat, zul je met me eens zijn, een volkomen onzinnig 'filter' is.
 
Als je bij elk veld een like '*' voorwaarde typt krijg je geen lege velden te zien, alleen alle records waar overal iets is ingevuld. Elementaire SQL kennis.
 
Nogmaals: je snapt blijkbaar het probleem niet. Míjn oplossing zorgt voor een correcte filtering gebaseerd op de ingevulde zoekvelden. That’s all that matters.
 
Hallo,

Ik heb het op deze wijze kunnen oplossen.

Bedankt voor de hulp.

Groeten

Jos

Code:
 ' deze 3 velden zijn nooit leeg, type en comp worden samengebracht in het veld onderwerp bij het ingeven
  
  zoek_type = "onderwerp  like '" & "*" & zoektype & "*' "
  
  zoek_comp = " And " & ("onderwerp like '" & "*" & zoekcomp & "*'")
  
  zoek_plaats = " And " & ("plaats like '" & "*" & zoekplaats & "*'")
  
  
  'zoeken op de andere velden
  
  
  If zoekreg <> "" Then
  
    zoek_reg = " And " & ("registratie  like '" & "*" & zoekreg & "*'")
     
     Else: zoek_reg = ""
      
   End If
  
   
  
   If zoekserial <> "" Then
   
    zoek_serial = " And " & ("serial  like '" & "*" & zoekserial & "*'")
    
     Else: zoek_serial = ""
   
  End If
  
  
  If zoekopmerk <> "" Then
   
    zoek_opmerk = " And " & ("opmerking  like '" & "*" & zoekopmerk & "*'")
    
     Else: zoek_opmerk = ""
   
  End If
  
    
  
  
  te_zoeken = zoek_type & zoek_comp & zoek_reg & zoek_serial & zoek_plaats & zoek_opmerk
  
  
   Me.Filter = te_zoeken

Me.FilterOn = True
 
Ik ben blij dat je niks met de tips hebt gedaan en aan je eigen ‘systeem’ bent blijven hangen. Dan weet ik dat ik de volgende keer niet meer hoef mee te denken :).
 
Blij dat je het zelf hebt kunnen oplossen, en bedankt om je oplossing te delen.
 
Nu maar hopen dat TS nooit op teksten met een ' hoeft te zoeken. Maar daar heb je vast een oplossing voor :).
 
Natuurlijk, de enkele quote ' vervangen door twee dubbele quotes ""
 
Ook al zo'n tip die TS niet heeft overgenomen, ook al hebben zowel jij als ik hem aangereikt. Zoals je al kon afleiden uit bericht#15: ik ben wel zo'n beetje klaar met vragenstellers die niks doen met de aangedragen oplossingen/verbeteringen.
 
Hallo octafish,

Ik heb inderdaad uw oplossing niet gebruikt maar het heeft mij wel tot een oplossing gebracht.

Ik ben zeker geen specialist in VBA ( zoals vele in dit forum ) en ik ben tevreden in het geen ik voor mij gerealiseerd heb tot het zoeken in mijn gegevens.

Het zal daarvoor niet de juiste methode zijn maar als het werkt voor mij ben ik tevreden.

Hierbij apprecieer uw hulp en ik hoop dat je me in de toekomst nog verder kan helpen met uw kennis.

Groeten,

Jos
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan