Codice Fiscale in Access
Il calcolo del codice fiscale in linguaggio VBA
Per effettuare il calcolo del codice fiscale abbiamo bisogno di una tabella dei comuni, dalla quale estrarre il codice di quello della persona fisica.
In codice VBA dobbiamo creare queste funzioni:
- Public Function ExtractLetters(strValue As String, bCognome As Boolean) As String che ci consenta di estrarre le 3 lettere dal cognome e poi dal nome.
- Public Function ExtractDate(strDate As String, bUomo As Boolean) As String per estrarre i valori dalla data di nascita.
- Public Function ExtractComune(strComune As String) As String per andare a ricercare il codice fiscale del comune di nascita dalla tabella.
- Public Function CalcCodControllo(strCodice as String) As String per calcolare il carattere di controllo con i pesi pari e dispari del codice fin qui ottenuto.
Iniziamo allora a sviluppare la prima funzione, quella per estrarre i tre caratteri dal nome e dal cognome.
|
Public Function ExtractLetters(strValue As String, bCognome As Boolean) As String
Dim i, iVoc, iCon As Integer, strTemp, strVoc, strCon As String
i = 1
iVoc = 0
iCon = 0
strTemp = ""
strVoc = ""
strCon = ""
strValue = UCase(strValue)
While i <= Len(strValue)
strTemp = Mid(strValue, i, 1)
If Asc(strTemp) >= 65 And Asc(strTemp) <= 90 Then
If InStr(1, "AEIOU", strTemp) Then
iVoc = iVoc + 1
strVoc = Trim(strVoc) + strTemp
Else
iCon = iCon + 1
strCon = Trim(strCon) + strTemp
End If
End If
i = i + 1
Wend
strTemp = ""
If bCognome Then
If iCon >= 3 Then
strTemp = Left(strCon, 3)
ElseIf iCon = 2 Then
strTemp = strCon
If iVoc > 1 Then
strTemp = strTemp + Left(strVoc, 1)
Else
strTemp = strTemp + "*"
End If
ElseIf iCon = 1 Then
strTemp = strCon
If iVoc >= 2 Then
strTemp = strTemp + strVoc
ElseIf iVoc = 1 Then
strTemp = strTemp + strVoc + "*"
Else
strTemp = strTemp + "**"
End If
Else
If iVoc >= 3 Then
strTemp = strVoc
ElseIf iVoc = 2 Then
strTemp = strVoc + "*"
ElseIf iVoc = 1 Then
strTemp = strVoc + "**"
Else
strTemp = "***"
End If
End If
Else
If iCon >= 4 Then
strTemp = Left(strCon, 1)
strTemp = strTemp + Mid(strCon, 3, 2)
ElseIf iCon = 3 Then
strTemp = strCon
ElseIf iCon = 2 Then
strTemp = strCon
If iVoc > 1 Then
strTemp = strTemp + Left(strVoc, 1)
Else
strTemp = strTemp + "*"
End If
ElseIf iCon = 1 Then
strTemp = strCon
If iVoc >= 2 Then
strTemp = strTemp + strVoc
ElseIf iVoc = 1 Then
strTemp = strTemp + strVoc + "*"
Else
strTemp = strTemp + "**"
End If
Else
If iVoc >= 3 Then
strTemp = strVoc
ElseIf iVoc = 2 Then
strTemp = strVoc + "*"
ElseIf iVoc = 1 Then
strTemp = strVoc + "**"
Else
strTemp = "***"
End If
End If
End If
ExtractLetters = strTemp
End Function
|
|
Tra gli argomenti della funzione ritroviamo il primo che è il valore del nome o del cognome ed il secondo di tipo boolean che indica se trattare il cognome o il nome, perché
come sapete nel primo caso si prendono la prima, la seconda e la terza consonante, mentre nel secondo caso si prende la prima, la seconda e la quarta.
Ora implementiamo la seconda funzione per estrarre i dati dalla data di nascita.
|
Public Function ExtractDate(strDate As String, bUomo As Boolean) As String
Dim strCarMese(12), strTemp As String
strTemp = ""
strCarMese(1) = "A"
strCarMese(2) = "B"
strCarMese(3) = "C"
strCarMese(4) = "D"
strCarMese(5) = "E"
strCarMese(6) = "H"
strCarMese(7) = "L"
strCarMese(8) = "M"
strCarMese(9) = "P"
strCarMese(10) = "R"
strCarMese(11) = "S"
strCarMese(12) = "T"
strTemp = Right(strDate, 2)
strTemp = strTemp + strCarMese(CInt(Mid(strDate, 4, 2)))
If bUomo Then
strTemp = strTemp + Left(strDate, 2)
Else
strTemp = strTemp + CStr(CInt(Left(strDate, 2)) + 40)
End If
ExtractDate = strTemp
End Function
|
|
Questa funzione è semplice da capire, si prendono le ultime due cifre dall'anno di nascita, una lettera corrispondente al mese ed infine il giorno di nascita
che nel caso delle donne viene aumentato di 40 unità. Ora sviluppiamo un'altra funzione per estrarre il codice fiscale dal comune di nascita, in questo caso dovremo collegarci
alla tabella e poi trovare il comune corrispondente.
|
Public Function ExtractComune(strComune As String) As String
Dim strTemp As String, myData As DAO.Database, myrec As DAO.Recordset
strTemp = "SELECT CF FROM Comuni WHERE IDComune = " & strComune
Set myData = CurrentDb
Set myrec = myData.OpenRecordset(strTemp)
strTemp = ""
If Not myrec.EOF Then
strTemp = myrec!CF
End If
myrec.Close
Set myrec = Nothing
Set myData = Nothing
ExtractComune = strTemp
End Function
|
|
Anche nel caso di questa funzione il compito è semplice, basta aprire la tabella dei "Comuni" e con una query trovare il valore che è stato inviato tramite argomento della funzione.
Infine dobbiamo implementare la funzione che calcola il carattere di controllo dai primi 15 trovati, ecco come fare.
|
Public Function GetPesiPari(strVal As String) As Integer
Dim iTemp As Integer
If Asc(strVal) >= Asc("0") And Asc(strVal) <= Asc("9") Then
iTemp = Asc(strVal) - Asc("0")
ElseIf Asc(strVal) >= Asc("A") And Asc(strVal) <= Asc("Z") Then
iTemp = Asc(strVal) - Asc("A")
End If
GetPesiPari = iTemp
End Function
Public Function GetPesiDispari(strVal As String) As Integer
Dim vPesiDispari As Variant, iTemp As Integer
vPesiDispari = Array("1", "0", "5", "7", "9", "13", "15", "17", "19", "21" _
, "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")
If Asc(strVal) >= Asc("0") And Asc(strVal) <= Asc("9") Then
iTemp = vPesiDispari(Asc(strVal) - Asc("0"))
ElseIf Asc(strVal) >= Asc("A") And Asc(strVal) <= Asc("Z") Then
iTemp = vPesiDispari(Asc(strVal) - Asc("A") + 10)
End If
GetPesiDispari = iTemp
End Function
Public Function CalcCodControllo(strVal As String) As String
Dim i, iWeightPari, iWeightDispari As Integer, strTemp As String
iWeightPari = 0
iWeightDispari = 0
i = 2
While i <= 14
strTemp = Mid(strVal, i, 1)
iWeightPari = iWeightPari + GetPesiPari(strTemp)
i = i + 2
Wend
i = 1
While i <= 15
strTemp = Mid(strVal, i, 1)
iWeightDispari = iWeightDispari + GetPesiDispari(strTemp)
i = i + 2
Wend
iWeightPari = iWeightPari + iWeightDispari
strTemp = Chr(65 + (iWeightPari Mod 26))
CalcCodControllo = strTemp
End Function
|
|
In effetti sono 3 funzioni, questo perché calcolare i pesi pari e dispari è un'operazione che dobbiamo fare più volte, ecco che allora è meglio suddividere i compiti elementari.
Ora non ci resta che richiamare tutte le funzioni implementate finora per trovare il valore del codice fiscale della persona fisica.
|
If Uomo.Value = 1 Then
bUomo = True
Else
bUomo = False
End If
strCognome = ""
strNome = ""
strComune = ""
strCodFisc = ""
If Not IsNull(editCognome.Value) Then strCognome = ExtractLetters(editCognome.Value, True)
If Not IsNull(editNome.Value) Then strNome = ExtractLetters(editNome.Value, False)
If Not IsNull(editData.Value) Then strData = ExtractDate(editData.Value, bSex)
If Not IsNull(editComune.Value) Then strComune = ExtractComune(editComune.Value)
strCodFisc = strCognome + strNome + strData + strComune
If Len(strCodFisc) = 15 Then
strCodFisc = strCodFisc + GetControlChar(strCodFisc)
Else
strCodFisc = "ERRORE"
End If
|
|
Dopo aver creato una form con tutti i controlli per richiedere i dati all'utente ( nome e cognome, data di nascita, se uomo o donna ed il comune di nascita )
prendiamo i valori inseriti e facciamo il calcolo del codice fiscale tramite le nostre funzioni sviluppate in precedenza.
Trovare il codice fiscale delle persone fisiche non è un'operazione molto complicata, forse l'unica funzione un po' più difficile da implementare è quella del calcolo del carattere di controllo,
per il resto sembra tutto molto semplice ed intuitivo. Se comunque non conoscete bene il linguaggio VBA potete sempre scaricare la nostra
applicazione completa in MS Access® che fa il calcolo del codice fiscale ed anche il processo inverso,
ossia che dal codice fiscale si arriva a conoscere i dati anagrafici.
|
Ritorna all'indice degli argomenti -> Vai a pagina web
|