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