Newsgroup: it.comp.appl.access
Titolo: anno di nascita errato se calcolato dal codice fiscale

Buonasera a tutti.
Nelle form in cui c'è da inserire il codice fiscale, su evento dopo
aggiornamento calcolo automaticamente il sesso, il luogo e la data di
nascita. Nel testare il tutto ho notato che inserendo il codice
fiscale ad esempio di mia figlia che è nata il 01/03/2000 la data
ricavata dal seguente codice
Me.Datanascita = IIf(Mid([codice fiscale], 10, 2) > "31",
Format(Int(Mid([codice fiscale], 10, 2)) - 40, "00"), Mid([codice
fiscale], 10, 2)) & "/" & Format(InStr("ABCDEHLMPRST", Mid([codice
fiscale], 9, 1)), "00") & "/" & "19" & Mid([codice fiscale], 7, 2)
è stata 01/03/1900 anzichè 01/03/2000.
Come modifico
& "19" & Mid([codice fiscale], 7, 2)
per fare in modo di riconoscere il giusto anno?
Grazie.
Giuseppe.


Prova così:
Ovviamente ipotizzo che nella stringa cf ci sia il Codice Fiscale:
ANNO = CLng(Mid$(cf, 7, 2))
If ANNO  < Year(Date) - 2000 Then
    ANNO  = ANNO  + 2000
Else
   ANNO  =ANNO  + 1900
End If
Ciao


Ti aggiungo perchè la trovo una cosa molto funzionale, la verifica
dell'inserimento tramite RegEX in LateBinding... cosa a mio avviso
molto tecnica:
Public Function Verifica_CF(testo As String) As Boolean
Dim RE As Object
Set RE = CreateObject("VBScript.RegExp")
RE.Global = True
RE.Pattern = _
    "^([A-Z]{6})" & _
    "(d{2})" & _
    "([A-EHLMPR-T]{1})" & _
    "(70|71|[0-6]{1}d{1})" & _
    "([A-Z]{1})([0-9L-NPQ-V]{3})" & _
    "([A-Z]{1})$"
Verifica_CF = RE.Test(testo)
End Function
Purtroppo non è codice mio, ma è roba vecchia e non ricordo dove l'ho
trovata...
@Alex

 > End If
dove lo metto questo codice?
Grazie.
Giuseppe.


Dovresti scrivere una funzione VBA, anzi tante funzioncine ognuna
delle quali restituisce il dettaglio...
Nel tuo caso:
Function GetYearFromCF(CF as String) as Integer
    Dim intY as Integer
    intY = CLng(Mid$(CF, 7, 2))
    If intY < Year(Date) - 2000 Then
        intY = intY + 2000
    Else
        intY =intY + 1900
    End If
    GetYearFromCF=intY
End Function
A quel punto nella TextBox che deve restituire l'anno al posto di
OrigineControllo, dove metti il tuo calcolo... scrivi:
=GetYearFromCF([ControlloCodiceFiscale])
Così puoi fare per il sesso, il luogo di nascita ecc...
L'altro codice che ti ho scritto serve solo a VALIDARE il CF in base
ad Espressioni Regolari.
Ciao
@Alex

 @Alex
-- 
Ciao
Geppo 

 Geppo
@Alex

 @Alex
-- 
Ciao
Geppo

 Verifica di avere RegEx come Librerie.
Se mancano le librerie non dovrebbe dare errore sull'oggetto?
Comunque non sapevo che i codici dei comuni potessero avere un 
alfanumerico nei tre digit, normalmente, numerici (pos. 13-15)
Il controllo dovrebbe poi fallire se c'e' qualche spazio in fondo
-- 
ac (x=y-1)

 Non funziona comunque.......per curiosità da te funziona?
Att. a occhio non consente le minuscole.
-- 
ac (x=y-1)


ho provato ma non va comuque.
-- 
Ciao
Geppo 

 Geppo
Si hai ragione ho provato e non rende mai True... credo che ci siano
anomalie nelle regole assegnate a REGEX... magari rivedendole in modo
puntuale si corregge di certo, il concetto è in tutti i modi corretto
e la cosa utile da sfruttare è il LateBinding su RegEx... poi prenditi
il tempo
che ti serve, sempre che la cosa ti sia utile, per perfezionare
l'epressione.
@Alex


Ciao Alex, e saluti anche a Geppo ed Alessandro Cara che sono
intervenuti.
Con la tua funzione e l'origine messa in una casella di testo ho
risolto.
Grazie.

 Il controllo dovrebbe poi fallire se c'e' qualche spazio in fondo
Se la casella di testo contenente il codice fiscale è stata impostata
con una maschera di Input selezionata su codice fiscale e su evento
dopo aggiornamento viene impostata la funzione di controllo del codice
fiscale il problema non si pone.
Giusto?
Saluti.
Giuseppe.


Per chiunque possa interessare, il pattern cosi composto cosi sembra andare:
"^([A-Z]{6})(\d{2})([A-EHLMPR-T]{1})(70|71|[0-6]{2})([A-Z]{1})([0-9L-NPQ-V]{3})([A-Z]{1})$"
Il ^ indica che il controllo è da eseguirsi all'inizio della stringa..... la 
cifra tra {} limita il controllo ai primi 6 caratteri che possono essere 
solo lettere "maiuscole" (se si preferisce validare il codice anche con le 
minuscole va modificata cosi ([A-Za-z]{6}) questo vale anche per il 
controllo in altri punti del codice)
'=========
^([A-Z]{6})
'=========
controlla che dopo i primi 6 caratteri ci siano solo due cifre {2}
'=====
(\d{2})
'=====
questa controlla che dopo i primi 8 caratteri venga inserito il carattere 
giusto ed uno solo "maiuscolo"{1}
'===============
([A-EHLMPR-T]{1})
'===============
questa controlla che dopo i primi 9 caratteri siano presenti solo due cifre 
{2} comprese tra 0-6 oltre cui sono valide solo  70 e 71
'============
(70|71|[0-6]{2})
'============
questa controlla che dopo i primi 11 caratteri sia presente una sola lettera 
{1} "maiuscola"
'=========
([A-Z]{1})
'=========
questa controlla che dopo i primi 12 caratteri siano presenti solo 3 
caratteri composti da numeri compresi tra 0 e 9 e dalle lettere comprese tra 
L a NPQ a V
'==============
([0-9L-NPQ-V]{3})
'==============
questa controlla che alla fine della stringa sia presente un solo carattere 
(la fine della stringa viene indicata dal carattere $)
'=========
([A-Z]{1})$
'=========
Uno spettacolo queste "Regular Expression" che di certo meritano un 
approfondimento.
Grazie @Alex
-- 
Ciao
Geppo 

 15ª posizione nel codice fiscale.
Questo e' quello che sapevo anch'io ma il "pattern" postato da @Alex, 
per quelle posizioni, afferma tutt'altro (cfr post di Geppo con la 
spiegazione del pattern)
-- 
ac (x=y-1)

 '==============
diventa:
questa controlla che dopo i primi 12 caratteri siano presenti solo 3
caratteri composti da numeri compresi tra 0 e 9
'==============
([0-9]{3})
'==============
pertanto il "pattern" corretto è:
"^([A-Z]{6})(\d{2})([A-EHLMPR-T]{1})(70|71|[0-6]{2})([A-Z]{1})([0-9]{3})([A-Z]{1})$"


Infatti è giusto quello che dite.......sono io che non corretto il 
"pattern".
Pardon
-- 
Ciao
Geppo

 ac (x=y-1)
Ho scritto che il codice non era mio e non l'ho testato..., ma visto
che ora lo avete fatto voi... lo aggiorno.
@Alex


Scusate l'ignoranza ma io ho sempre utilizzato su evento prima di
aggiornare della casella di testo contente il codice fiscale
Dim Msg As Integer
If Len(Me.codfisc) > 11 Then
    If CheckCodFiscale(codfisc) = False Then
    Msg = MsgBox("Codice Fiscale errato. Proseguire ugualmente?",
vbYesNo, "CF errato")
        If Msg = 6 Then
        Cancel = False
        Exit Sub
        Else
        Cancel = True
        Exit Sub
        End If
    Else
    Cancel = False
    Exit Sub
    End If
con la
Public Function CheckCodFiscale(CFis As String) As Boolean
    'Autore: Federico Luciani
    'Accetta: CFis = Codice fiscale da verificare
    'Restituisce: true se il Codice fiscale è corretto
    'Modificata da Giovani Menga
 ecc..... presa dal sito comune.
Questo thread, partito con il problema delle prime due cifre
dell'anno, è scivolato, credo, sul codice da usare per  il controllo
del codice fiscale inserito.
E' così? Devo sostituire la funzione di cui sopra con il codice di
questa discussione o si deve integrare in qualche altro evento?
Vi prego di togliere questo dubbio a me e credo anche a coloro che
seguono il gruppo.
Grazie.
Giuseppe.

"Giuseppe"  ha scritto nel messaggio 
news:ba55b8ca-9595-4cdf...@w6g2000vbo.googlegroups.com...



    'Restituisce: true se il Codice fiscale č corretto
    'Modificata da Giovani Menga
ecc..... presa dal sito comune.
Questo thread, partito con il problema delle prime due cifre
dell'anno, č scivolato, credo, sul codice da usare per  il controllo
del codice fiscale inserito.
E' cosě? Devo sostituire la funzione di cui sopra con il codice di
questa discussione o si deve integrare in qualche altro evento?
Vi prego di togliere questo dubbio a me e credo anche a coloro che
seguono il gruppo.
Grazie.
Giuseppe.
____Risposta:
Questo cdice č sufficiente (ovviamente reintroducendo la parte che  ha 
tolto.
Seguiamolo:
"If Len(Me.codfisc) > 11 Then"
primo controllo č che sia maggiore di 11...
qui probabilmente lui verfica che tu non abbia un codice fiscale uguale alla 
partita iva
se č cosě,
verifica il codice fiscale chiamando la funzione di sotto
"    If CheckCodFiscale(codfisc) = False Then"
se č sbagliato lui ti avvisa ma non ti blocca (č possibile che scceda, 
quando il ministero ha riscontrato una omocodia e da un codice fiscale 
diverso)
se scegli sě č ok
se invece il test č positivo lui usa cancel = false (questo probabile perchč 
ha usato l'evento codicefiscale_beforeupdate)
quindi questo codice funziona
Vai perň su AccessGroup.it c'č (se on ricordo male) un articolo di Sv che ha 
notato un piccolo bug su questa funzione
MA 

 del codice fiscale inserito.
Controllo *solo* formale  e non *da* usare obbligatoriamente e' solo un 
altro modo per farlo.
Di funzioni per il controllo del CF se ne trovano a dozzine, vanno tutte 
bene - se funzionano -. Quello postato da @Alex, in particolare, usa le 
espressioni regolari. E' impreciso nella gestione del giorno di nascita 
(fa *passare* i giorni da 32 a 36 e non li relativizza al mese) ma non 
e' nello scopo del pattern, credo, controllare in maniera  *fine* la 
validita' del CF.
-- 
ac (x=y-1)


Questo risolve il problema dei giorni e gli spazi alla fine:
"^([A-Za-z]{6})(\d{2})([A-EHLMPR-Ta-ehlmpr-t]{1})(3[0-1]|2[0-9]|1[0-9]|0[1-9])([A-Za-z]{1})([0-9]{3})([A-Za-z]{1}) 
*$"
-- 
Ciao
Geppo 



Hanno ragione le donne ad incavolarsi e chiedere che ci sia parita' di 
diritti!
-- 
ac (x=y-1)

 diritti!
Porca Pupazza, poi de sti tempi:
(3[0-1]|2[0-9]|1[0-9]|0[1-9]|4[1-9]|6[0-9]|7[0-1])
P.S.: Maestro, visto che hai il cosiddetto "occhio clinico", se riscontri 
altre anomalie ti prego di "spararle" tutte insieme.
Grazie
-- 
Ciao
Geppo 

 notato un piccolo bug su questa funzione
Lo farò sicuramente.
Grazie.
Giuseppe.


Mi sembra, e bada bene oggi e' l'8 marzo, che hai *ammazzato* tutte 
quelle nate tra il 10 ed il 19.
-- 
ac (x=y-1)


è una battuta? Non l'ho capita.
Se non è una battuta non ho capito cosa intendi.
-- 
Ciao
Geppo


Se non sbaglio manca la gestione dei giorni fra il 10 ed il 19  (i.e 5[0-9])
-- 
ac (x=y-1)


ecco, si hai ragione .... non avendo fatto copia/incolla, facevo il "test" 
su quella corretta e non capivo.
Copia / incolla:
"^([A-Za-z]{6})(\d{2})([A-EHLMPR-Ta-ehlmpr-t]{1})(3[0-1]|2[0-9]|1[0-9]|0[1-9]|4[1-9]|5[0-9]|6[0-9]|7[0-1])([A-Za-z]{1})([0-9]{3})([A-Za-z]{1}) 
*$"
questa va.
Grazie ancora
-- 
Ciao
Geppo 


Comunque potrebbe (dovrebbe) esserci anche un flag di "case insensitive"
-- 
ac (x=y-1)

 insensitive"
Si, effettivamente c'è un flag ma non credo sia possibile utilizzarlo in 
questo "ambiente".
-- 
Ciao
Geppo