Avatar billede martens Guru
09. juli 2021 - 22:14 Der er 4 kommentarer og
1 løsning

Validere om der er værdier indtastet i samtlige felter og derefter ....

Jeg roder lidt med at validere om der er værdier indtastet i samtlige felter og derefter , hvis samtlige felter er udfyldt eksekvere noget kode.
Jeg ar bare gået helt i baglås med at få det til at fungere..
Et stykke hen ad vejen virker det., men selve processen med at få "fyret" kode af, når samtlige felter er udfyldt volder mig lidt problemer..
Er der en venlig sjæl, der kan hjælpe mig på rette vej ?

mvh martens

kode :
-----------------------------------------------------------------------------------
Private Sub cmb_check_values_before_action_Click()

If IsNull(Me.Tekst0) Then
MsgBox "Boks 0 er tom"
Else
MsgBox "Boks 0 er IKKE tom"
End If

If IsNull(Me.Tekst1) Then
MsgBox "Boks 1 er tom"
Else
MsgBox "Boks 1 er IKKE tom"
End If

If IsNull(Me.Tekst2) Then
MsgBox "Boks 2 er tom"
Else
MsgBox "Boks 2 er IKKE tom"
End If

If IsNull(Me.Tekst3) Then
MsgBox "Boks 3 er tom"
Else
MsgBox "Boks 3 er IKKE tom"
End If

Exit Sub
' køres kun hvis ALLE 4 bokse er udfyldt !
MsgBox "Samtlige felter er udfyldt !"
' Kode "fyres af" her
End Sub
Avatar billede Gustav Ekspert
09. juli 2021 - 22:35 #1
Du kunne køre en loop:

Private Sub Form_BeforeUpdate(Cancel As Integer)

    Dim Index  As Integer
   
    For Index = 0 To 3
        If IsNull(Me("Tekst" & CStr(Index)).Value) Then
            Cancel = True
            Exit For
        End If
    Next
   
    If Cancel = True Then
        MsgBox "Boks" & Str(Index) & " er ikke tom.", vbInformation + vbOKOnly, "Validering"
    Else
        MsgBox "Samtlige felter er udfyldt.", vbInformation + vbOKOnly, "Validering"
        ' Kør kode.
    End If

End Sub
Avatar billede store-morten Ekspert
09. juli 2021 - 23:31 #2
Prøv med en tæller:
Private Sub cmb_check_values_before_action_Click()
'Tæller til antal
    Udfyldt = 0

If IsNull(Me.Tekst0) Then
MsgBox "Boks 0 er tom"
Else
MsgBox "Boks 0 er IKKE tom"
    Udfyldt = Udfyldt + 1
End If

If IsNull(Me.Tekst1) Then
MsgBox "Boks 1 er tom"
Else
MsgBox "Boks 1 er IKKE tom"
    Udfyldt = Udfyldt + 1
End If

If IsNull(Me.Tekst2) Then
MsgBox "Boks 2 er tom"
Else
MsgBox "Boks 2 er IKKE tom"
    Udfyldt = Udfyldt + 1
End If

If IsNull(Me.Tekst3) Then
MsgBox "Boks 3 er tom"
Else
MsgBox "Boks 3 er IKKE tom"
    Udfyldt = Udfyldt + 1
End If

If Udfyldt = 4 Then
' køres kun hvis ALLE 4 bokse er udfyldt !
MsgBox "Samtlige " & Udfyldt & " felter er udfyldt !"
' Kode "fyres af" her
Else
MsgBox Udfyldt & " af 4 felter er udfyldt."
End If
End Sub
Avatar billede Jørgen Kirkegaard Professor
10. juli 2021 - 13:07 #3
Mange muligheder. Det afhænger også af, om du skal bruge informationen videre eller bare skal have "fyret koden af".
Hvis du ønsker at bevare din kode eller på anden måde kan bruge det, kan du sætte et flag, som så kun sættes til False, hvis én er tom ("Sand indtil det modsatte er bevist"):

Dim AlleErUdfyldt as boolean
AlleErUdfyldt=True
'Og så dine statements:
If IsNull(Me.Tekst0) Then
AlleErUdfyldt=False
MsgBox "Boks 0 er tom"
Else
MsgBox "Boks 0 er IKKE tom"
End If

If IsNull(Me.Tekst1) Then
AlleErUdfyldt=False
MsgBox "Boks 1 er tom"
Else
MsgBox "Boks 1 er IKKE tom"
End If
osv.

Jeg ser efterfølgende, at det minder om Gustavs, hvor Cancel er false, indtil den evt. sættes til true. Jeg kan også lide Gustavs idé om at lave et loop, så den er klar til evt. at tage flere (eller færre) felter. Her får du dog ikke "MsgBox" på resten, når der er først er fundet én, som ikke er udfyldt. De er måske også kun på for at kunne teste det. Cancel bør her dog nok ikke være en overført Integer og skal vel sættes til False for god ordens skyld.

store-mortens er god, især hvis du vil vide, hvor mange, der er udfyldt.
Pas på med Exit Sub. Som den står nu, vil den jo exit'te efter sidste IF.

En ucharmerende måde kunne være, at exitte helt, straks du møder én som er tom. Det minder lidt om Gustavs "Exit For", men er mere "brutal".
Avatar billede bvirk Guru
05. september 2021 - 14:21 #4
Til inspiration mht.
- loop controls
- anvende controls property 'tag' (i egenskabsark på  dansk: mærke)

Ved at anvende en property for det enkelte kontrolelement opnåes:
- alle typer controls kan testes (combo og check)
- unbound textboxes kan undlades


Skal omskrives lidt for at fyre når alt er ok - dette chekker blot en record samlet.
Hvert kontrolelement som skal chekkes for ikke at have værdi null, skal i det egenskabsark->andet->mærke have indholdet:
    mustBeNullChecked


'in class module of form

Private Sub Form_Current()
    controlsEmptyTest ""
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Cancel = controlsEmptyTest()
End Sub

Private Function controlsEmptyTest(Optional tailMsg = "The record can not saved with these values")
    Dim ctrls
    ctrls = someControlsWithTagPropertiedIsNull(Form)
    If Not IsEmpty(ctrls) Then
        MsgBox "Following controls has null value" & vbCrLf & arr2list(ctrls, vbCrLf) & vbCrLf & tailMsg
        controlsEmptyTest = True: End If
End Function



'in a standard module
Function someControlsWithTagPropertiedIsNull(Form, Optional tagValue = "mustBeNullChecked")
    Dim ctrl
    For Each ctrl In Form.Controls
        If ctrl.Properties("tag") = tagValue Then
            If IsNull(ctrl) Then push someControlsWithTagPropertiedIsNull, ctrl.name
        End If: Next
End Function


' homebrew library in referenced mdb
Sub push(v, i, Optional rLevel = 0, Optional pushEmptyOrNull = False)
'push back on array V, value i or items of array i recursively
'V must NOT be dim'ed with fixed size or parentes
'Value can be anything - simple types, arrays or objects
    Dim ai
    If (IsNull(i) Or IsEmpty(i)) And Not pushEmptyOrNull Then Exit Sub
    If IsArray(i) And (rLevel <> 0) Then
        For Each ai In i
            push v, ai, rLevel - 1: Next
    Else
        If IsEmpty(v) Then v = Array()
        ReDim Preserve v(UBound(v) + 1)
        If IsObject(i) Then Set v(UBound(v)) = i Else v(UBound(v)) = i
    End If
End Sub

Function arr2str(arr, Optional delimit = ",", Optional lower, Optional upper)
    Dim i
    If Not IsNull(arr) Then
        If IsMissing(lower) Then lower = LBound(arr)
        If IsMissing(upper) Then upper = UBound(arr)
        i = lower
        If upper > lower Then
            For i = lower To upper - 1
                arr2str = arr2str & arr(i) & delimit: Next: End If
        arr2str = arr2str & arr(i)
    End If
End Function
Avatar billede rosco Novice
24. september 2021 - 11:52 #5
Private Sub cmb_check_values_before_action_Click()

'Sikre at alle felter er udfyldt
If Trim(Me.Tekst0.Value & vbNullString) = vbNullString Then
MsgBox "Boks 0 er tom"
ElseIf Trim(Me.Tekst1.Value & vbNullString) = vbNullString Then
MsgBox "Boks 1 er tom"
ElseIf Trim(Me.Tekst2.Value & vbNullString) = vbNullString Then
MsgBox "Boks 2 er tom"
ElseIf Trim(Me.Tekst3.Value & vbNullString) = vbNullString Then
MsgBox "Boks 3 er tom"
Else
End If

' køres kun hvis ALLE 4 bokse er udfyldt !
MsgBox "Samtlige felter er udfyldt !"
' Kode "fyres af" her
End Sub
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester