Avatar billede bbkdk Seniormester
23. januar 2008 - 10:06 Der er 13 kommentarer og
2 løsninger

Anvendelse af funktion i Modul

Jeg har altid haft problemer med at anvende funktioner, som jeg selv har oprettet i et modul i Access - så nu forsøger jeg at få lidt hjælp

I et modul, som tester et cvr.nr efter Modulus 11, har jeg skrevet følgende:

Public Function CvrTest()

    Dim TestSum  As Long
    Dim A As Integer, B As Integer, C As Integer, D As Integer, E As Integer, F As Integer, G As Integer, H As Integer

    A = Mid(cvr, 1, 1)
    B = Mid(cvr, 2, 1)
    C = Mid(cvr, 3, 1)
    D = Mid(cvr, 4, 1)
    E = Mid(cvr, 5, 1)
    F = Mid(cvr, 6, 1)
    G = Mid(cvr, 7, 1)
    H = Mid(cvr, 8, 1)

    TestSum = (2 * A + 7 * B + 6 * C + 5 * D + 4 * E + 3 * F + 2 * G + 1 * H)
   
    If (TestSum Mod 11) <> 0 Then
   
    MsgBox "CVR er ikke korrekt"
   
    Cancel = True
       
    End If
   
End Function

Det skal bemærkes, at ovenstående virker fint, når sætningen er sat ind i en procedure i en formular.

Jeg har oprettet en testtabel, hvor der kun er et felt, nemlig Cvr af typen langt heltal.

På grundlag af denne tabel har jeg oprettet en formular, også kun med et felt, nemlig Cvr.

På dette felts Før Opdatering hændelse, skriver jeg følgende:

=CvrTest(Cvr)

Jeg får så følgende fejlmeddelelse:

Udtrykket FørOpdatering, du indtastede som indstilling af hændelsesegenskaben gav en fejl: Det indtastede udtryk indeholder et funktionsnavn, som Konkurser og Tvangsopløsninger (det hedder mit program) ikke kan finde.

Men når jeg ser i Udtryksgenerator, er der faktisk en funktion der hedder CvrTest, og som kan sættes ind.

Håber der er en, der har tid til at hjælpe mig, da jeg altid får det samme problem, når jeg forsøger at bruge egne funktioner.
Avatar billede terry Ekspert
23. januar 2008 - 10:15 #1
=CvrTest(Cvr) The cvr inside () is a parameter you need to send to the function but the function has no paramater!

Public Function CvrTest(cvr as variant)
Avatar billede terry Ekspert
23. januar 2008 - 10:16 #2
and the = also means that you want a value returned, is that correct?
Avatar billede terry Ekspert
23. januar 2008 - 10:21 #3
I would also change the function to something like thsi so that message boxes arent used here but in the code which calls the function.


Public Function CvrTest(cvr As Variant) AS Boolean

    Dim TestSum  As Long
    Dim A As Integer, B As Integer, C As Integer, D As Integer, E As Integer, F As Integer, G As Integer, H As Integer

CvrTest = False

    A = Mid(cvr, 1, 1)
    B = Mid(cvr, 2, 1)
    C = Mid(cvr, 3, 1)
    D = Mid(cvr, 4, 1)
    E = Mid(cvr, 5, 1)
    F = Mid(cvr, 6, 1)
    G = Mid(cvr, 7, 1)
    H = Mid(cvr, 8, 1)

    TestSum = (2 * A + 7 * B + 6 * C + 5 * D + 4 * E + 3 * F + 2 * G + 1 * H)
   
    If (TestSum Mod 11) <> 0 Then Exit sub
   
    CvrTest = True
End Function


And I'm not at all sure if your fucntion works, doesnt seem to wok with mine!
Avatar billede mugs Novice
23. januar 2008 - 10:21 #4
Jeg kan sende en lille db der viser, hvordan jeg sender en variabel fra en formular til et modul og foretager en beregning. Måske den kan hjælpe dig lidt videre. f.eks.således:

CPR.Check CPRNR

der kalder modulet CPR funktionen Check og sender variablen CPRNR til modulet.
Avatar billede terry Ekspert
23. januar 2008 - 10:22 #5
Wjen you call the finction it would be something like this

If cbrTest(cvr) Then

'OK

Else

'Ej OK

End if
Avatar billede terry Ekspert
23. januar 2008 - 10:32 #6
This works

' Returns TRUE if CPR is valid

Dim I As Integer
Dim Multipliers(1 To 10) As Integer
Dim Sum As Integer


    If Not IsNull(CPR) Then
        Multipliers(1) = 4
        Multipliers(2) = 3
        Multipliers(3) = 2
        Multipliers(4) = 7
        Multipliers(5) = 6
        Multipliers(6) = 5
        Multipliers(7) = 4
        Multipliers(8) = 3
        Multipliers(9) = 2
        Multipliers(10) = 1
       
        Sum = 0
       
        If Len(CPR) = 10 Then
            For I = 1 To 10
                Sum = Sum + CInt(Mid$(CPR, I, 1)) * Multipliers(I)
            Next I
       
            CPR_Ok = (Sum Mod 11) = 0
           
        End If
    End If
       
   
End Function
Avatar billede terry Ekspert
23. januar 2008 - 10:33 #7
Sorry you need the first line too :o)

Public Function CPR_Ok(ByVal CPR As Variant) As Variant
' Returns TRUE if CPR is valid

Dim I As Integer
Dim Multipliers(1 To 10) As Integer
Dim Sum As Integer


    If Not IsNull(CPR) Then
        Multipliers(1) = 4
        Multipliers(2) = 3
        Multipliers(3) = 2
        Multipliers(4) = 7
        Multipliers(5) = 6
        Multipliers(6) = 5
        Multipliers(7) = 4
        Multipliers(8) = 3
        Multipliers(9) = 2
        Multipliers(10) = 1
       
        Sum = 0
       
        If Len(CPR) = 10 Then
            For I = 1 To 10
                Sum = Sum + CInt(Mid$(CPR, I, 1)) * Multipliers(I)
            Next I
       
            CPR_Ok = (Sum Mod 11) = 0
           
        End If
    End If
       
   
End Function
Avatar billede mugs Novice
23. januar 2008 - 10:43 #8
Der er altid flere måder at gøre tingene på:

Public Function Check(CPRNR) Dim Rst As Recordset, Db As Database
Dim VGT As String, i, Sum As Integer, ModSum As Integer, Kontrolciffer As Integer, Svar As String 
VGT = 432765432
If Len(CPRNR) <> 10 Then
Svar = Msgbox(Prompt:="Der skal indtastes 10 cifre i CPR." & Chr$(13) & Chr$(13) & "Der må ikke indtastes bindestreg." & Chr$(13) & Chr$(13) & "Klik på OK og vend tilbage til CPR-feltet og foretag ny indtastning.", Title:="Indtastningsfejl", Buttons:=vbOKOnly)
DoCmd.GoToControl "CPRNR"
Exit Function
End If
For i = 1 To 9
Sum = Sum + (Val(Mid(CPRNR, i, 1)) * Val(Mid(VGT, i, 1)))
Next
ModSum = Sum Mod 11
If ModSum = 0 Then
Kontrolciffer = 0
Else
Kontrolciffer = 11 - ModSum
End If
If Val(Right(CPRNR, 1)) <> Kontrolciffer Then
Svar = Msgbox(Prompt:="Efter indtastning af CPR-nummer har programmet foretaget en gyldighedstest af det indtastede." & Chr$(13) & Chr$(13) & "Testen har afsløret en eller flere fejl i det indtastede CPRNR." & Chr$(13) & Chr$(13) & "Klik på OK vend tilbage til CPR-feltet og foretag en ny indtastning." & Chr$(13) & Chr$(13) & "Du kan ikke gå videre, før programmet har godkendt CPR-NR", Title:="Forkert indtastet CPR-NR", Buttons:=vbCritical + vbExclamation)
DoCmd.GoToControl "CPRNR" 'Vender tilbage til CPR-feltet hvis dette er forkert'
End If
End Function
Avatar billede bbkdk Seniormester
23. januar 2008 - 12:22 #9
Hej Begge !!
Tak for de hurtige svar - men jeg har stadig samme problem, selvom jeg har prøvet begge løsninger (Terry 10:33 og Mugs 10:43)

Jeg har oprettet et modul til hver og forsøgt at køre modulet i hændelsen Før Opdatering med følgende tekst:

=CPR_Ok([CPR])(Terrys forslag)
=Check([CPR]) (Mugs forslag)

Specielt vedrøende Mugs forslag ville jeg synes, at den direkte skulle skrive tilbage, hvis CPR nummeret ikke var validt. Men den siger stadig, at programmet ikke kan finde funktionsnavnet, selvom funktionen er sat ind fra udtryksgenerator.

Så det er min opfattelse, at jeg gør et eller andet forkert, når jeg kalder funktionen.

Til Mugs: Min e-mail er kristensen@dbmail.dk så det ville være fint, hvis det kunne hjælpe mig videre.
Avatar billede terry Ekspert
23. januar 2008 - 12:31 #10
Can you sen me your dB?
ekspertenATsanthell.dk

AT = @
Avatar billede mugs Novice
23. januar 2008 - 12:32 #11
Sendt
Avatar billede terry Ekspert
23. januar 2008 - 12:37 #12
I wouldnt use

I would use something like this in the cpr number field BEFORE update event
NOTE the Cancel = True

Private Sub CprNo_BeforeUpdate(Cancel As Integer)

    If (CPR_Ok(CprNo)) Then
        MsgBox "The CPR number is valid ..."
    Else
        MsgBox "The CPR number is invalid ..."
        Cancel = True
    End If

End Sub
Avatar billede bbkdk Seniormester
23. januar 2008 - 14:25 #13
Hej igen !!
Terry, din løsning virker fint.
Mugs - tak for mails - jeg ved ikke om jeg kan åbne RAR filerne, men jeg forsøger.
Men jeg er stadig lidt varm på dit forslag, da det ser ud til, at funktionen må kunne køres, uden at der skal yderligere kode i VBA til.
Og hvis der skal kode til i hændelse BEFORE Update, hvordan skal den så se ud - og kan den skrives direkte ind i egenskabsvinduet (som jeg har forsøgt jf. ovenstående), eller skal der lidt VBA til?
Er det i orden, hvis jeg deler points, da jeg har fået en masse god input fra jer begge?
Avatar billede terry Ekspert
23. januar 2008 - 14:34 #14
"Er det i orden, hvis jeg deler points, da jeg har fået en masse god input fra jer begge?"

Thats fine :o)
Avatar billede mugs Novice
23. januar 2008 - 14:54 #15
Så tillader jeg mig at lægge et svar :o)
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
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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