Pubblicato il 4 Luglio 2020 da Maurizio Matetich
Alcuni giorni fa mi hanno fatto al seguente domanda: in una maschera Access devo inserire dei nominativi e poi il relativo codice fiscale. Come faccio a sapere se il codice fiscale è inserito correttamente ?
Utilizzando alcune istruzioni VBA ho creato una semplice procedura per la verifica.
Ma come si risolve questo problema ?
1) per prima cosa è fondamentale documentarsi. Ho recuperato le informazioni per capire come viene costruito il codice fiscale. Non lo sapevo ed è molto istruttivo !
2) le informazioni che servono per il calcolo sono: cognome, nome, sesso, DataNascita, LuogoNascita e ProvinciaNascita. Quindi ho creato una tabella, che ho chiamato Clienti, contenente questi campi (e anche altri) necessari per verificare il codice fiscale. Ovviamente serve anche il campo CodiceFiscale !
3) poi ho creato una maschera per l’inserimento dei dati
4) l’operatore inserisce i dati anagrafici del cliente e poi inserisce il codice fiscale. Dopo l’inserimento del codice fiscale parte il controllo per verificarne la correttezza.
5) Ho creato una routine associata all’evento “Dopo aggiornamento” del campo CodiceFiscale
Le istruzioni VBA per controllare il codice fiscale
Come detto sopra, dopo aver inserito i dati anagrafici, inserisco il codice fiscale e voglio sapere se ci sono errori di inserimento.
I primi 3 caratteri sono ricavati dal Cognome della persona. Partendo dalla prima lettera del Cognome si procede in avanti prendendo le prime tre consonanti.
Ad esempio se il cliente ha il cognome “Barani” saranno prese in successione la lettera B, poi la R ed infine la N (BaRaNi) ottenendo così la sigla “BRN”.
Se il cognome è più corto di 5 caratteri, una volta raggiunta la fine, si riprende di nuovo
dall’inizio partendo però questa volta dalla seconda lettera. Ad esempio per il cognome “Neri” sarà generata la sigla “NRE”.
Se il cognome è costituito da 2 sole lettere si prendono entrambe e si aggiunge una “X” finale. Quindi il cognome “Re” sarà indicato con “REX”
Sono esclusi dal calcolo eventuali spazi, apostrofi o accenti presenti nel cognome stesso.
Ad esempio “Lo Bianco” sarà considerato come “LoBianco” tutto attaccato.
Vediamo il codice VBA che ho utilizzato
Le righe precedute da apostrofo corrispondono a commenti
‘converte il codice fiscale in maiuscolo
Me.CodiceFiscale = UCase(Me.CodiceFiscale)
‘controllo del cognome
LunghezzaCognome = Len(Me.Cognome)
ConsonantiCognome = “”
For i = 1 To LunghezzaCognome
Carattere = Mid(Me.Cognome, i, 1)
‘controllo se è una vocale oppure una consonante. Se è uguale a zero è una consonante
TipoCarattere = InStr(“AEIOU”, Carattere)
If (TipoCarattere = 0) And (Carattere <> ” “) Then
‘è una consonante
ConsonantiCognome = ConsonantiCognome + Carattere
End If
Next i
CognomeCF = Replace(CognomeCF, ” “, “”) ‘non considerare gli spazi nel cognome
CognomeCF = Replace(CognomeCF, “‘”, “”) ‘non considerare gli apici nel cognome
CognomeCF = Left(Me.CodiceFiscale, 3)
If CognomeCF = Left(ConsonantiCognome, 3) Then
‘caratteri corretti
Else
msgbox “Attenzione: i primi 3 caratteri non sono corretti. Controllare il cognome”
End If
I successivi 3 caratteri sono estratti dal Nome con le stesse modalità viste per il Cognome.
‘il 7° e l’8° carattere indicano le ultime due cifre dell’anno
AnnoCF = CStr(Mid(Me.CodiceFiscale, 7, 2))
AnnoNascita = CStr(Right(Me.DataNascita, 2))
If AnnoCF = AnnoNascita Then
‘MsgBox “Caratteri 7 e 8 per anno di nascita sono ok”
Else
msgbox “Attenzione: i caratteri 7 e 8 non sono corretti (sono le ultime due cifre dell’anno di nascita)”
End If
‘il 9° carattere è una lettera che indica il mese di nascita (ad esempio: “D” indica il mese di Aprile).
‘Le lettere dei mesi non sono consecutive ma esiste un’apposita tabella di corrispondenza.
‘A Gennaio
‘B Febbraio
‘C Marzo
‘D Aprile
‘E Maggio
‘H Giugno
‘L Luglio
‘M Agosto
‘P Settembre
‘R Ottobre
‘s Novembre
‘T Dicembre
LetteraMeseCF = Mid(Me.CodiceFiscale, 9, 1)
Select Case LetteraMeseCF
Case “A”
MeseCF = “01”
‘MsgBox “Mese di nascita gennaio”
Case “B”
MeseCF = “02”
‘MsgBox “Mese di nascita febbraio”
Case “C”
MeseCF = “03”
‘MsgBox “Mese di nascita marzo”
Case “D”
MeseCF = “04”
‘MsgBox “Mese di nascita aprile”
Case “E”
MeseCF = “05”
‘MsgBox “Mese di nascita maggio”
Case “H”
MeseCF = “06”
‘MsgBox “Mese di nascita giugno”
Case “L”
MeseCF = “07”
‘MsgBox “Mese di nascita luglio”
Case “M”
MeseCF = “08”
‘MsgBox “Mese di nascita agosto”
Case “P”
MeseCF = “09”
‘MsgBox “Mese di nascita settembre”
Case “R”
MeseCF = “10”
‘MsgBox “Mese di nascita ottobre”
Case “S”
MeseCF = “11”
‘MsgBox “Mese di nascita novembre”
Case “T”
MeseCF = “12”
‘MsgBox “Mese di nascita dicembre”
Case Else
MsgBox “errore carattere 9”
End Select
MeseNascita = CStr(Mid(Me.DataNascita, 4, 2))
If MeseCF = MeseNascita Then
‘MsgBox “Carattere 9 per mese di nascita ok”
Else
MsgBox “Attenzione: il carattere 9 non è corretto (è il mese di nascita)”
End If
‘il 10° e l’11° carattere contengono il giorno di nascita; per le donne è aumentato di 40
GiornoCF = CStr(Mid(Me.CodiceFiscale, 10, 2))
GiornoNascita = CStr(Left(Me.DataNascita, 2))
If Me.Sesso = “F” Then
GiornoCF = GiornoCF – 40
End If
If GiornoCF = GiornoNascita Then
‘MsgBox “Caratteri 10 e 11 per giorno di nascita ok”
Else
MsgBox “Attenzione: i caratteri 10 e 11 non sono corretti (sono il giorno di nascita e per le donne si aggiunge 40)”
End If
‘Gli ultimi 5 caratteri indicano il codice del comune di nascita (rappresentato da 4 cifre) e il carattere di controllo determinato secondo un calcolo ben preciso che tiene conto dei precedenti 15 caratteri.
Per questi ultimi 5 caratteri … vi preparo un aggiornamento a breve. Intanto provate da soli e fatemi sapere come procede !
Conclusione:
Ho aggiunto commenti e istruzioni “in abbondanza” per farvi capire meglio cosa ho fatto.
Le istruzioni VBA utilizzate sono poche: il solito IF-THEN-ELSE, l’istruzione CASE, UCase per trasformare tutto in maiuscolo, Len per calcolare la lunghezza di una stringa, il ciclo FOR, le istruzioni Left, Mid e Right per lavorare sulle stringhe, Cstr per convertire una variabile in stringa, Replace per sostituire i caratteri non ammessi, InStr per verificare se un carattere è una vocale oppure una consonante.
Poche istruzioni ma fondamentali !
Scrivi un commento