Condividi tramite

Come creare una Funzione che mi verifica un campo numerico

Anonimo
2011-05-15T17:12:34+00:00

Ciao e grazie in anticipo per chi mi risolve questo problema.

Ho una tabella carri con un campo nominato carro dove viene memorizzato la matricola del carro.

Composta di 12 cifre la quale ultima cifra è un autocontrollo.

calcolato in questo modo:

1 cifra * 2 =  N (se superiore a 10 sommare le due cifre)

2 cifra * 1 = N

3 cifra * 2 = N (se superiore a 10 sommare le due cifre)

4 cifra * 1 = N

5 cifra * 2 = N (se superiore a 10 sommare le due cifre)

6 cifra * 1 = N

7 cifra * 2 = N (se superiore a 10 sommare le due cifre)

8 cifra * 1 = N

9 cifra * 2 = N (se superiore a 10 sommare le due cifre)

10 cifra * 1 = N

11 cifra * 2 = N (se superiore a 10 sommare le due cifre)

12 cifra  = decina immediatamente superiore della somma di tutte le N trovate – somma di tutte le N trovate

Es: Carro   338079210732

1cifra 3*2 =6

2cifra 3*1=1

3cifra 8*2=16 (1+6)=7

4cifra 0*1=0

5cifra 7*2=14 (1+4)=5

6cifra 9*1=9

7cifra 2*2=4

8cifra 1*1=1

9cifra 0*2=0

10cifra 7*1=7

11cifra 3*2=6

12cifra= (6+1+7+0+5+9+4+1+0+7+6)= 48 {Decina immediatamente successiva 50} 50-48=2

L’autocontrollo deve essere 2 altrimenti deve darmi come risultato “Matricola Errata”

Io sono riuscito con Excel a fare questo http://cid-8f6ff0bda6f01267.office.live.com/view.aspx/Pubblica/VERIFICA%20MATRICOLA.xlsx

Mi servirebbe qualcosa di simile

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2011-05-17T13:19:54+00:00

Vedi se in questo modo abbiamo coperto tutte le possibilità della cifra di controllo:


Function fncTestMatricola(strMatricola As String) As Boolean

    Dim dbSomma As Double

    Dim intTemp As Integer

    Dim intCounter As Integer

    For intCounter = 1 To Len(strMatricola) - 1

        If intCounter Mod 2 = 1 Then    'Posizioni Dispari

            intTemp = Mid(strMatricola, intCounter, 1) * 2

            If intTemp > 9 Then

                dbSomma = dbSomma + Left(intTemp, 1) + Right(intTemp, 1)

            Else

                dbSomma = dbSomma + intTemp

            End If

        Else                            'Posizioni Pari

            dbSomma = dbSomma + Mid(strMatricola, intCounter, 1) * 1

        End If

    Next intCounter

    If dbSomma Mod 10 = 0 Then

        If Right(strMatricola, 1) = 0 Then

            fncTestMatricola = True

        Else

            fncTestMatricola = False

        End If

    Else

        If ((Int(dbSomma / 10) + 1) * 10) - dbSomma = Right(strMatricola, 1) Then

            fncTestMatricola = True

        Else

            fncTestMatricola = False

        End If

    End If

End Function


David

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

8 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2011-05-16T21:55:57+00:00

    Ciao david la tua funzione funziona solo parzialmente.

    Ti spiego funziona solo con le matricole che anno la 12 cifra = 2 come autocontrollo mentre non funziona per quelle matricole che termina con un numero diverso

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2011-05-16T21:52:45+00:00

    Ciao Cinzia La tua funzione mi da sempre matricola errata con qualsiasi nummero carro metto

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2011-05-16T09:28:18+00:00

    Ciao Giuseppe,

    questa funzione restituire vero se la cifra di controllo è 2, falso negli altri casi.

    Per la matricola che hai indicato funziona. Provala con le altre.


    Function fncTestMatricola(strMatricola As String) As Boolean

        Dim dbSomma As Double

        Dim intTemp As String

        Dim intCounter As Integer

        For intCounter = 1 To Len(strMatricola) - 1

            If intCounter Mod 2 = 1 Then    'Posizioni Dispari

                intTemp = Mid(strMatricola, intCounter, 1) * 2

                If Len(intTemp) = 2 Then

                    dbSomma = dbSomma + Left(intTemp, 1) + Right(intTemp, 1)

                Else

                    dbSomma = dbSomma + intTemp 'Posizioni Pari

                End If

            Else

                dbSomma = dbSomma + Mid(strMatricola, intCounter, 1) * 1

            End If

        Next intCounter

        If (Round((dbSomma / 10)) * 10) - dbSomma = 2 Then

            fncTestMatricola = True

        Else

            fncTestMatricola = False

        End If

    End Function


    David

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2011-05-16T08:38:35+00:00

    Ciao Giuseppe,

    in prima battuta mi è venuta questa funzione, che probabilmente può essere ottimizzata, vedi se può andarti bene:

    Function ControllaCorrettezzaFormale(matricola As String) As String

        Dim buf As String

        Dim i As Integer

        Dim molt As Integer

        Dim l As Integer

        Dim tot As Integer

        Dim nextDecina As Integer

       buf = Trim(matricola)

        If Len(buf) <> 11 Then

            ControllaCorrettezzaFormale = "Matricola Errata"

         Else

            tot = 0

            l = 0

            molt = 2

           For i = 1 To 11

              If (i Mod 2) = 1 Then

                    l = CInt(Mid(buf, i, 1)) * molt

                    If l > 10 Then

                        l = CInt(Mid(Trim(Str$(l)), 1, 1)) + CInt(Mid(Trim(Str$(l)), 2, 1))

                    End If

              Else

                l = CInt(Mid(buf, i, 1))

              End If

              tot = tot + l

           Next

           nextDecina = (tot \ 10) * 10 + 10

           If (nextDecina - tot) = 2 Then

            ControllaCorrettezzaFormale = "2"

          Else

            ControllaCorrettezzaFormale = "Matricola Errata"

         End If

        End If

    End Function

    La risposta è stata utile?

    0 commenti Nessun commento