Probleem verificatie subforms

Status
Niet open voor verdere reacties.

TdsGerard

Gebruiker
Lid geworden
1 nov 2014
Berichten
39
Hey allemaal,
Ik heb een probleem met het verifieren van data die ingevoerd wordt via een subformulier. Wanneer ik een getal invoer dat niet aan de verificatie regel voldoet krijg ik een foutmelding. Wanneer ik deze foutmelding wegklik popt hij gelijk weer op. Ik heb dus geen tijd om mijn invoer aan te passen. Weet iemand misschien waardoor dit probleem wordt veroorzaakt? Ik heb in de bijlage een vereenvoudigde database gezet. Om een of andere reden geeft hij de melding in deze database ~3 keer weer, waarna de invoer aangepast kan worden. Ik hoop dat het probleem toch duidelijk is.

In de bijlage moet in het tweede tabblad in het subform Simulation PIOL bij het veld PIOL Lens een invoer gedaan worden van lager dan 100. Invoer kan alleen gedaan worden wanneer een patient en een oog is geselecteerd in de comboboxes boven de tab control.

Groet,

Gerard
 

Bijlagen

De herhaling wordt vermoedelijk getriggerd doordat de status van het formulier en het onderliggende formulier steeds wijzigt, want als je alleen het subformulier test, dan komt de melding maar één keer. Overigens zou ik de check gewoon op de Change van het tekstvak doen, en niet met een validatieregel. Kun je ook meer aspecten afvangen, zoals: 'is het wel een getal?'. Dus iets als dit:
Code:
Private Sub PIOL_Lens_Change()
Dim iTmp As Integer

    iTmp = Me.PIOL_Lens.Text
    If Len(iTmp) > 0 Then
        If Not IsNumeric(Me.PIOL_Lens.Text) Then
            Me.PIOL_Lens.Text = iTmp
            Me.PIOL_Lens.SelStart = Len(iTmp)
        ElseIf IsNumeric(Me.PIOL_Lens.Text) And iTmp > 100 Then
            MsgBox "PIOL waarde moet kleiner zijn dan 100."
            iTmp = Left(iTmp, Len(iTmp))
            Me.PIOL_Lens.Text = iTmp
            Me.PIOL_Lens.SelStart = Len(iTmp)
        Else
            Exit Sub
        End If
    End If
End Sub
Dit lost in ieder geval je probleem op.
 
Hey Michel,
Ik ben niet bepaald geweldig in dit soort dingen. Ik heb je code uitgeprobeerd en hij werkt inderdaad prima in dit geval. Maar hoe zou hij eruitzien wanneer ik een waarde moet invoeren van -10 tot 100? Wanneer ik jouw code gebruik geeft access zodra ik een "-" intyp een "run-time error '13'". Hij geeft dezelfde foutmelding wanneer ik een waarde invoer in het tekstvak, en deze vervolgens backspace tot het vak weer leeg is. Dat zou ik ook liever niet hebben, een gebruiker kan natuurlijk altijd per ongeluk een getalletje in het verkeerde veld invoeren.

Groet,
Gerard

Code die ik op dit moment heb:
Code:
Private Sub PIOL_Lens_Change()
Dim iTmp As Integer

    iTmp = Me.PIOL_Lens.Text
    If Len(iTmp) > 0 Then
        If Not IsNumeric(Me.PIOL_Lens.Text) Then
            Me.PIOL_Lens.Text = iTmp
            Me.PIOL_Lens.SelStart = Len(iTmp)
        ElseIf IsNumeric(Me.PIOL_Lens.Text) And iTmp > 100 Then
            MsgBox "PIOL waarde moet tussen de 0 en 100 liggen."
            iTmp = Left(iTmp, Len(iTmp))
            Me.PIOL_Lens.Text = iTmp
            Me.PIOL_Lens.SelStart = Len(iTmp)
        ElseIf IsNumeric(Me.PIOL_Lens.Text) And iTmp < 0 Then
            MsgBox "PIOL waarde moet tussen de 0 en 100 liggen."
             iTmp = Right(iTmp, Len(iTmp))
            Me.PIOL_Lens.Text = iTmp
            Me.PIOL_Lens.SelStart = Len(iTmp)
        Else
            Exit Sub
        End If
    End If
End Sub
Wanneer ik deze gebruik geeft hij continu de MsgBox weer bij een waarde onder de 0. (vermoedelijk vanwege de regel Me.PIOL_Lens.Text = iTmp) bovendien is het na het wegklikken van de msbox wanneer ik deze regel weghaal gewoon mogelijk om naar een ander tekstvak te gaan en de foutieve data te laten staan.
 
Laatst bewerkt:
't Is een beetje broddelwerk, moet ik bekennen :). Ik had een paar verschillende dingen geprobeerd, en de code niet helemaal goed gekopieerd. Ken gebeuren :D. Maar het helpt ook als je een volledige beschrijving geeft van je vraag; je hebt het namelijk niet gehad over negatieve getallen en dat die dus niet kleiner mogen zijn dan -10. En dat verandert de zaak een beetje. Ik zal de code aanpassen, en ook een check maken die controleert of je wel alleen een getal invoert. Bij letters moet het tekstvak sowieso leeg worden gemaakt namelijk, want dan voldoet je berekening nooit meer.
 
is geen probleem hoor, bedankt voor de moeite. :)

Ik heb in mijn formulier een stuk of 40 parameters staan die allemaal andere grenswaarden hebben. Bij sommige zijn de grenswaarden allebei positief, bij sommige allebei negatief en bij anderen loopt het van negatief tot positief. Het makkelijkste voor mij is natuurlijk om een code te hebben die voor alle mogelijkheden werkt, of in ieder geval iets dat een groentje als ik zou kunnen uitvogelen.

Groet,

Gerard
 
Ik heb de code aangepast, en hij controleert nu zowel op - teken als op tekstinvoer. Daarbij wordt het veld leeggemaakt als je een letter invoert.
Code:
Private Sub PIOL_Lens_Change()
Dim tmp As String

    tmp = Me.PIOL_Lens.Text
    If Len(tmp) > 0 Then
        If Not IsNumeric(tmp) And Not tmp = "-" Then
            If Len(tmp) = 1 Or Not IsNumeric(tmp) Then
                Me.PIOL_Lens.Text = ""
            Else
                Me.PIOL_Lens.Text = Left(tmp, Len(tmp) - 1)
                Me.PIOL_Lens.SelStart = Len(tmp)
            End If
        ElseIf IsNumeric(tmp) And Val(tmp) > 100 Then
            MsgBox "PIOL waarde moet tussen de -10 en 100 liggen."
            tmp = Left(tmp, Len(tmp) - 1)
            Me.PIOL_Lens.Text = tmp
            Me.PIOL_Lens.SelStart = Len(Me.PIOL_Lens.Text)
        ElseIf Val(tmp) < -10 Then
            MsgBox "PIOL waarde moet tussen de -10 en 100 liggen."
            Me.PIOL_Lens.Text = Left(tmp, Len(tmp) - 1)
            Me.PIOL_Lens.SelStart = Len(Me.PIOL_Lens.Text)
        Else
            Me.PIOL_Lens.SelStart = Len(Me.PIOL_Lens.Text)
            Exit Sub
        End If
    End If
    Me.PIOL_Lens.SelStart = Len(Me.PIOL_Lens.Text)
End Sub

Ik krijg de cursor nog niet netjes achter de ingevoerde tekst, maar dat komt waarschijnlijk doordat de Change gebeurtenis eigenlijk continue naar de inhoud blijft kijken. Is wel mee te leven, denk ik :)
 
Wat bedoel je precies met die laatste opmerking? Wanneer ik een waarde boven de 100 invoer wist hij het laatste cijfer en plaatst de cursor aan het eind van de invoer. Is er iets dat ik mis?

Ben er trouwens achter waarom die runtime error steeds de kop op stak. Ik was vergeten om de validatieregel te wissen. Hij lijkt nu prima te werken. Enorm bedankt! :)

Groet,

Gerard
 
Ik sommige gevallen zet hij de cursor niet achter het laatste cijfer, maar selecteert hij de complete waarde. Moet je zelf op F2 drukken om de cursor achteraan te zetten. Zoals ik al zei: is mee te leven :D. Ik was inderdaad vergeten te zeggen dat je eigen validatie er uit moest.
 
Dat had ik me zelf waarschijnlijk moeten realiseren. Ik heb wel nog een ander vraagje.
Je gebruikt in je code deze regel:
Code:
 ElseIf IsNumeric(tmp) And Val(tmp) > 100 Then

Waarom gebruik je hier de Val-functie, en is dat absoluut noodzakelijk? Val() stopt met lezen zodra er een komma gebruikt word, dus waarden van 100,9 zouden hierbij ook nog geaccepteerd worden.

Groet,

Gerard
 
Ik heb tmp als string gedeclareerd, om een - teken uit te kunnen lezen. Met Val zet je de variabele om naar een getal. VBA kent geen komma in getallen, maar punten. Je zou dus met Replace de komma moeten vervangen door een punt. Wel dan aan het eind weer terugzetten, of alleen voor de vergelijking gebruiken.
 
Nog een ander probleem opgemerkt trouwens, en misschien een iets groter. Wanneer je een waarde hebt die tussen de 20 en de 50 moet liggen is het niet mogelijk om deze in te voeren. Zodra je een 2 invoert wist hij hem gelijk, omdat 2 lager is dan de ondergrens. Heb je daar nog ideeën over?
 
Da's een probleem dat je vermoedelijk op de verkeerde plek tackelt. Dat kun je niet doen bij de invoer (=Change event) omdat die naar elk ingevoerd teken kijkt. Dus je kunt hooguit de bovengrens afvinken, of de ondergrens. Moet de waarde minimaal 20 zijn, dan kun je beter de AfterUpdate gebruiken; die wordt getriggerd als je het tekstveld verlaat, en de waarde dus geheel is ingevoerd.
 
Hmm, als ik de code verplaats naar de after update event gedraagd hij zich heel anders. Wanneer ik een waarde invoer die boven de 100 ligt verwijderd hij het laatste cijfer en geeft de MsgBox weer. Wanneer ik die wegklik geeft hij weer een pop up waarschuwing dat access de invoer niet kan opslaan wegens een conflict in de validatie regel of de before update event (van beide is geen sprake). Vervolgens zet hij het laatste cijfer weer terug.

Gerard
 
Ik heb ook niet gezegd dat je de code moet verplaatsen; sowieso werkt de gebeurtenis anders, en moet je de waarde anders uitlezen. Je wilt verschillende dingen, dus die hebben een verschillende aanpak.
 
Ik hoop dat je het niet erg vind dat ik nog een `paar vraagjes stel.

Ik heb nu het volgende stukje in elkaar geflanst:
Code:
Dim tmp As Integer
    tmp = PIOL_Lens.Text
    
    If tmp = 0 Then
        PIOL_Lens.Text = ""
    End If

Wanneer ik dit stukje onder de afterupdate event plak werkt hij niet. maar bij de lostfocus werkt hij wel. Is er een reden dat jij specifiek aanraadde om dit bij afterupdate te regelen?

Ook heb ik je andere advies opgevolgd en de replace functie gebruikt om te zorgen dat decimale getallen geaccepteerd werden. Ik had verwacht dat dit automatisch ook zou zorgen dat een waarde die met punten ingevoerd werd in de database zou worden omgezet naar komma's, maar in plaats daarvan wist hij de punt zodra ik wegklik van het tekstvak. Is er een andere manier om dit voor elkaar te krijgen?

Groet,

Gerard
 
Laatst bewerkt:
VBA en decimalen is een geweldige combinatie; zeker als je Nederlandse (Europese) instellingen gebruikt zoals een komma als scheidingsteken. Want VBA gebruikt dus een punt, en bij het wegschrijven zet hij weg wat je als waarde meegeeft. Dus een punt in een getal is precies dat: een punt, en die wordt genegeerd. Gevolg: geen decimalen. Ditzelfde onderwerp was overigens de reden dat ik bij HelpMij ben terechtgekomen, want ik had een paar jaar dus exact hetzelfde probleem :). Je moet bij het wegschrijven dus de omgekeerde weg bewandelen, en een punt weer vervangen door een komma.
Wat je eerste vraag betreft: zolang je 'live' naar een tekstveld kijkt (Change is zo'n gebeurtenis) moet je de eigenschap Text gebruiken. AfterUpdate treedt op als het tekstvak niet meer bewerkt wordt, en dan heb je weinig aan Text, maar moet je Value gebruiken.
 
De herhalende waarschuwing kwam volgens mij doordat het formulier zich steeds vernieuwde.
Ik heb al mijn subformulieren aan het hoofdformulier gekoppeld via het Patient Number dat werd weergegeven in het textvak TXT Patient Number, dat op zijn beurt het patient nummer uit een combobox haalde. Als ik in mijn subformulieren in plaats daarvan direct aan de combobox koppel werkt alles zoals het zou moeten werken.

Groet en bedankt voor de hulp,

Gerard
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan