Foutafhandeling in Formulier...

Status
Niet open voor verdere reacties.

RadboudAKF

Gebruiker
Lid geworden
3 nov 2010
Berichten
219
Beste forumbezoekers,

Ik heb een formulier waarin in meerdere velden kan worden gezocht naar gegevens (in dit geval geneesmiddelen). (zie afbeelding1)

Als er een zoekactie wordt gestart die geen resultaat oplevert krijg ik een foutmelding.(afbeelding 2)

Uiteraard wil ik niet dat mijn gebruikers iets dergelijks in hun scherm krijgen. Hoe kan ik deze 'foutmelding' vervangen door iets als een mededeling "Niets gevonden, u keert terug naar het formulier")

Kortom: hoe zorg ik voor een goede foutafhandeling? (ik was al heel trots op de mogelijkheid van het zoeken in meerdere velden ... maar van foutafhandeling heb ik echt geen kaas gegeten).

Zie bijlages:

ZoekinFormulier.jpg
ZoekinFormulier2.jpg

Groet,

Jan
Nijmegen
 
Zonder code valt er weinig te helpen...
 
(Ik wilde dit eerst privé versturen want misschien lach je je wel een kriek als je deze code leest.)
Ik ben slecht thuis in code en was al heel blij dat deze code werkt ... behalve dan als er geen 'match' is.

Private Sub Knop32_Click()

On Error GoTo Err_Knop32_Click

Dim strSearch As String

strSearch = InputBox$("U kunt zoeken op z-indexnr, Naam, Stofnaam, Merknaam, of ATC-code. Zoek u in meerdere velden tegelijkertijd, gebruik dan een spatie tussen de zoekvragen ", "Zoek in g-standaard")

Dim strSearchArr() As String, strWhere As String, strFields As String

strFields = "[TXATNM]&[Stofnaam]&[TXATNR]&[Merkstamnaam]&[ATC]&[HPK]&[GPK]&[PRK]"

strSearchArr = Split(strSearch, " ")

For n = 0 To UBound(strSearchArr)

If Len(strWhere) > 0 Then strWhere = strWhere & " AND "

strWhere = strWhere & strFields & " like '*" & strSearchArr(n) & "*'"

Next

If Not IsNull(strSearch) Then

If Len(strSearch) > 0 Then

strFilter = "Select * from Formulier where " & strWhere

DoCmd.Close acForm, "G-Standaard"

DoCmd.OpenForm "g-standaard", acNormal, strFilter


End If
End If

Exit_Knop32_Click:
Exit Sub

Err_Knop32_Click:

'MsgBox "Fout", vbCritical
'Resume HandleButtonClick_Exit
MsgBox Err.Description
'Resume Knop32_Click_Exit

End Sub
 
Laatst bewerkt:
Ik lach hooguit omdat je de code niet als CODE hebt opgemaakt :). Overigens dan wel als de gelijknamige boer ;) Nu moeten we ons de halve wereld overscrollen. Komt ook doordat je zo te zien gek op lege regels bent?
 
Ik leer graag....dus....als mijn regeltjes korter kunnen....laat het mij weten.

En ik begrijp niet heel goed wat je bedoelt met 'code niet als CODE opgemaakt'. Ik ben leergierig dus ....

Vast bedankt voor de tijd en expertise die je hierin stopt.
 
Als ik je code een beetje doorloop met een paar (ingetypte) velden, en ik van de filterstring af, dan krijg ik dit:
Code:
SELECT * FROM Formulier WHERE [TXATNM]&[Stofnaam]&[TXATNR]&[Merkstamnaam]&[ATC]&[HPK]&[GPK]&[PRK] LIKE "*Naam*" 
AND [TXATNM]&[Stofnaam]&[TXATNR]&[Merkstamnaam]&[ATC]&[HPK]&[GPK]&[PRK] LIKE "*Stofnaam*" 
AND [TXATNM]&[Stofnaam]&[TXATNR]&[Merkstamnaam]&[ATC]&[HPK]&[GPK]&[PRK] LIKE "*Merknaam*"
Nog afgezien van de constructie, die ik niet ken en waarvan ik dus niet weet of die zo werkt, vraag ik me af of ik het wel snap....
Code:
Zoek[B]t[/B] u in meerdere velden tegelijkertijd, gebruik dan een spatie tussen de zoekvragen
Dus je hebt een hele waslijst aan velden, en nu vraag je de gebruiker of hij op meer velden wil zoeken. Moet-ie een spatie typen tussen de 'zoekvragen' (daar bedoel je toch velden mee?).
Doe je dat, dan staat dat 'veld' echter in de query als zoektekst! Dan ben je mij dus een beetje kwijt....
Bedoel je echter dat je op meerdere 'zoekwoorden' kunt zoeken, dan doe je het ook verkeerd, want de zoekopdracht moet nu voldoen aan ALLE zoekwoorden.
Dit:
Code:
SELECT * FROM Formulier WHERE [TXATNM]&[Stofnaam]&[TXATNR]&[Merkstamnaam]&[ATC]&[HPK]&[GPK]&[PRK] LIKE "*Fiat*" 
AND [TXATNM]&[Stofnaam]&[TXATNR]&[Merkstamnaam]&[ATC]&[HPK]&[GPK]&[PRK] LIKE "*Renault*" 
AND [TXATNM]&[Stofnaam]&[TXATNR]&[Merkstamnaam]&[ATC]&[HPK]&[GPK]&[PRK] LIKE "*Citroën*" 
AND [TXATNM]&[Stofnaam]&[TXATNR]&[Merkstamnaam]&[ATC]&[HPK]&[GPK]&[PRK] LIKE "*Lancia*"
kan volgens mij niet: dat zou moeten zijn:
Code:
SELECT * FROM Formulier WHERE [TXATNM]&[Stofnaam]&[TXATNR]&[Merkstamnaam]&[ATC]&[HPK]&[GPK]&[PRK] LIKE "*Fiat*" 
OR [TXATNM]&[Stofnaam]&[TXATNR]&[Merkstamnaam]&[ATC]&[HPK]&[GPK]&[PRK] LIKE "*Renault*" 
OR [TXATNM]&[Stofnaam]&[TXATNR]&[Merkstamnaam]&[ATC]&[HPK]&[GPK]&[PRK] LIKE "*Citroën*" 
OR [TXATNM]&[Stofnaam]&[TXATNR]&[Merkstamnaam]&[ATC]&[HPK]&[GPK]&[PRK] LIKE "*Lancia*"
 
Ik ben het nu ook een beetje kwijt ... Het gaat vanmiddag niet meer lukken ... moet gaan vergaderen. Hoop dat je maandag nog niet bent afgehaakt omdat mijn code te lang is of anderzins.

Het gaat inderdaad om 'velden' (maar dat hoeft de gebruiker niet te weten). Die typt bv. Parac tabl 500mg Panadol en ziet in het formulier vervolgens 2 matches:

2 matches .... (in een doosje van 50stuks en in een doosje van 30stuks)

Paracacetamol 500mg tablet [TXTNM]
Panadol [Merknaam]

Als hij "Panadol" als zoekvraag had weggelaten dan had hij alle Paracetamol 500mg Tablet 'aanbieders' (Van Makro tot Kruitvat) te zien gekregen (een waslijst van zo'n 300 artikelen) nu blijft resultaat beperkt tot één -of twee. Vandaar "AND" ipv "OR"

Ik zal hier in het weekend ook nog op studeren ...

Ik moet er NU vandoor helaas...
 
Volgens mij kan het ook netter, zonder het formulier af te sluiten en opnieuw te openen. Zonder dus de query te gebruiken.
Code:
Dim strSearch As String, strFilter As String
Dim strSearchArr() As String, strWhere As String, strFields As String
Dim n As Integer

    strSearch = InputBox("U kunt zoeken op z-indexnr, Naam, Stofnaam, Merknaam, of ATC-code.  " _
        & "Zoekt u in meerdere velden tegelijkertijd, gebruik dan een spatie tussen de zoekwoorden ", "Zoeken")
    strFields = "[TXATNM]&[Stofnaam]&[TXATNR]&[Merkstamnaam]&[ATC]&[HPK]&[GPK]&[PRK]"
    strSearchArr = Split(strSearch, " ")

    For n = 0 To UBound(strSearchArr)
        If Len(strWhere) > 0 Then strWhere = strWhere & " OR "
        strFilter = strFilter & strFields & " LIKE ""*" & strSearchArr(n) & "*"""
    Next
    If Not strSearch = vbNullString Then
        Me.Filter = strFilter 
        Me.FilterOn = True
    Else
        Me.Filter = ""
        Me.FilterOn = False
    End If
 
Laatst bewerkt:
Zoals je in mijn voorbeeldje ziet, gebruik ik gewoon het formulierfilter om te filteren. Ook om het filter uit te zetten als de gebruiker niks invult (en dan waarschijnlijk alles wil zien). Dat scheelt in de snelheid, lijkt mij want het formulier blijft gewoon open staan.
Zelf zou ik deze optie niet zo snel gebruiken, want elke keer de gebruiker opnieuw een filter in laten vullen vind ik niet echt gebruiksvriendelijk. Ik bouw filters liever op d.m.v. tekstvakken die 'live' op de toegestane velden filtert. Dus (in mijn voorbeeldje) een tekstvak boven Achternaam, Voornaam en Plaats. Typ je één of meer letters in dat tekstvak, dan filtert het formulier gelijk op dat veld. Je ziet de lijst dus 'live' korter worden. Daarnaast kun je snel switchen van velden, en je kunt een filter in zo'n tekstvak altijd aanpassen, want de ingevoerde tekst blijft gewoon staan (anders werkt het filter niet). Die methode vind ik dus een stuk gebruiksvriendelijker en intuïtiever dan een inputbox die niks onthoudt. Al is daar nog wel wat aan te doen, mocht dat gewenst zijn.
 
Dank voor alle input...
Ben met dit probleem nog niet klaar....maar kan me hier nu voor een tijdje niet mee bezig houden.

Ik zet de vraag voor nu op 'opgelost' .... en pak dit over een paar weken weer op.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan