Codice che controlla correttezza CF da tabella

di il
2 risposte

Codice che controlla correttezza CF da tabella

Ciao a tutti,
ho un problema con un modulo che ho creto in access per controllare la corretteza del CF (ovvero la lunghezza e l'ultimo carattere di controllo). In pratica ho una tabella angrafica in cui ho la colonna del codice fiscale popolata e una colonna controllo_codfis vuota. Il codice dovrebbe, per ogni codice fiscale presente, controllare la lunghezza e l'ultimo campo e scrivere nella colonna controllo_codfis ok o errore formale nel primo caso o cf errato nel secondo.
Ho due problemi, con il primo controllo mi popola la colonna del controllo con tutti "errore formale" anche se il CF è giusto, con il secondo controllo mi da un errore a questa riga intValAscCar = Asc(UCase(Mid(cod_fisc, i, 1))) - Asc("0")
Avete qualche idea? premetto che con una maschera i controlli funzionano, ho cercato di adattarli alla tabella ma non vanno...

il codice è il seguente:

Public Sub controllo_codfis()

Dim CNT As DAO.Database
Dim T1 As DAO.Recordset
Dim strCF As String
Dim i As Integer
Dim intSumTot As Integer
Dim intValAscCar As Integer
Dim intCodice As Integer
Dim ValoriDispari() As Variant
Dim ValoriPari() As Variant



Set CNT = CurrentDb
Set T1 = CNT.OpenRecordset("anagrafica", dbOpenTable)

With T1
.Index = "ID_FISC"

T1.MoveFirst

Do

T1.Seek "=", T1!cod_fisc

If T1.NoMatch Then
Stop

Else

'se il codice fiscale non è nullo viene memorizzato nella variabile strCF se CF nullo allora strCf=""

If Not IsNull(cod_fisc) Then
strCF = cod_fisc
Else
strCF = ""
End If

'verifica che il strCF non sia vuoto e che la lunghezza sia 16

If cod_fisc = "" Or Len(cod_fisc) <> 16 Then

T1.Edit
T1!controllo_codfis = "errore formale"
T1.Update


Else

T1.Edit
T1!controllo_codfis = "ok"
T1.Update

End If
End If

T1.MoveNext

Loop Until T1.EOF

T1.MoveFirst

Do

T1.Seek "=", T1!cod_fisc

If T1.NoMatch Then
Stop

Else

'definisco valoripari e valoridispari come array e ogni calore occupa ua posizione da 0 in avanti

ValoriPari = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25)
ValoriDispari = Array(1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 2, 4, 18, 20, 11, 3, 6, 8, 12, 14, 16, 10, 22, 25, 24, 23)

'ricerca del valore di conversione nei due array da 1 a 15 e lo memroizza in intvalasccar
'con mid estraggo il codice fiscale e con ucase lo faccio diventare maiuscolo e con asc mi restituisce l'ascii del carattere e sottraggo 48, in ascii 0 cos' trovo se è pari o dispari


intSumTot = 0
For i = 1 To 15
intValAscCar = Asc(UCase(Mid(cod_fisc, i, 1))) - Asc("0")


'i valori trovati vengono sommati in sumtot


If (i Mod 2) = 0 Then 'I è pari
intSumTot = intSumTot + ValoriPari(intValAscCar)
Else 'I è dispari
intSumTot = intSumTot + ValoriDispari(intValAscCar)
End If

Next

'divido la somma per 26 e al resto aggiungo 65, in ascii A, per trasformarlo in uno dei valori ascii

intCodice = (intSumTot Mod 26) + Asc("A")

'verifico che il codice di controllo sia uguale a quello appena calcolato

If intCodice <> Asc(UCase(Right(strCF, 1))) Then

T1.Edit
T1!controllo_codfis = "cf errato"
T1.Update


Else

T1.Edit
T1!controllo_codfis = "ok"
T1.Update


End If
End If


T1.MoveNext

Loop Until T1.EOF

T1.Close

End With

End Sub

2 Risposte

Devi accedere o registrarti per scrivere nel forum
2 risposte