Newsgroup: it.comp.appl.access
Titolo: Re: calcolo età a partire da codice fiscale

 Luigi
Dal 7° carattere fino al 12 compreso, se non ricordo male, 
sono indicativi della data di nascita.
Le prme 2 sono l'anno, quindi il Mese codificato con una
lettera
Gennaio A 
Febbraio B 
Marzo C 
Aprile D 
Maggio E 
Giugno H 
Luglio L 
Agosto M 
Settembre P 
Ottobre R 
Novembre S 
Dicembre T 
 
quindi il giorno.
Anno=Mid$(CF,7,2)
Mese=Mid$(CF,9,1)
  Funzione di conversione con Select Case
  per recuperare il numero del mese.
Giorno=Mid$(CF,10,2)
Quindi componi la tua data e la passi alla
funzione del calcolo Età.
Ciao
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


Ovviamente non dimentichiamo che nel caso di femmine il numero del giorno è 
aumentato di 40 




Ciao Alex,
grazie per la tua risposta. Siccome non sono super esperto sto cercando di 
fare le cose gradualmente. Prima di tutto ho inserito un casella di testo 
chiamata anno e ho scritto questo:
Private Sub AssisititoCodiceFIscale_AfterUpdate()
AnnoCF = Mid$(CodiceFIscale, 7, 2)
Me.anno.DefaultValue = AnnoCF
ma dopo l'aggiornamento del codice fiscale non mi succede assolutamente 
nulla. come mai? non dovrebbe comparirmi l'anno nella casella di testo?
Dove sbaglio?
Come faccio poi a distinguere fra uomini e donne? Ho un campo in cui 
inserisco il sesso posso usarlo per controllare?
Ciao e grazie,
Luigi 

 Luigi



Ciao Alex,
qualcosina di programmazione la conosco ma mi perdo quando devo mettere 
insieme qualcosa di più complesso.
Grazie alle tue informazioni sono riuscito adesso ad estrapolare dal codice 
fiscale la data di nascita delle persone aggiungendo a quello che mi hai 
scritto tu:
  Me!DataNascita = DateSerial(anno, Mese, giorno)
ho solo un problema. Ho una persona che è nata nel 1913 ma quando vado a 
generare la data di nascita mi compare 2013. Come posso risolvere?
Fatto questo mi basta solo passare ad una funzione che calcola l'età la data 
di nascita e mettere il risultato nel campo età? Se non volessi mettere i 
singoli dati nelle caselle di testo ma usarli solo come variabili per 
calcolare quello che mi serve come devo modificare il codice dove è scritto 
Me!Anno etc?
Ciao e ancora grazie!
Luigi 

 Luigi
Allora, la prima cosa da risolvere è l'Anno.
Devi fare un controllo empirico, se l'anno è maggiore dell'anno
di year(Now()) allora togli 100 anni.
Non è una bella soluzione, ma non saprei se nel CF c'è modo di
capirlo, potresti leggerti il Decreto relativo.
Per la 2° domanda, si ti basta passare la data alla funzione
di calcolo età.
Per la 3° sostituisci i controlli con Variabili di tipo Integer,
quindi passa quelle alla funzione.


 quindi passa quelle alla funzione.
Ciao Alex,
ci sono quasi ma con alcuni errori da risolvere. Ho modificato quello di 
prima in questo che vedi sotto:
Private Sub AssisititoCodiceFIscale_AfterUpdate()
Dim anno As Integer
Dim Mese As Integer
Dim giorno As Integer
Dim DataNascita As Date
  anno = Mid$(AssisititoCodiceFIscale, 7, 2)
  If anno > Year(Now()) Then
    anno = anno - 100
    MsgBox "anno STRANO..."
    End If
  Mese = retMese(Mid$(AssisititoCodiceFIscale, 9, 1))
  giorno = Mid$(AssisititoCodiceFIscale, 10, 2)
  If giorno > 31 Then
         giorno = giorno - 40
         MsgBox "FEMMINA"
  End If
  DataNascita = DateSerial(anno, Mese, giorno)
  Me!AssisititoEta = eta(DataNascita)
 End Sub
ma succede che il controllo sull'anno non me lo fa mai perchè 2005 è sempre 
maggiore di 13 allora dovrei usare format per estrapolare solo le ultime due 
cifre dell'anno ma dopo qualche provo non sono arrivato a nulla di buono.
Ho preso dal sitocomune la funzione per il calcolo dell'età e l'ho un pò 
modificata in quanto segue:
Public Function eta(nascita As Date, Optional DataCorrente As Variant) As 
String
'Se non metti la data corrente prende in automatico la data odierna
If IsMissing(DataCorrente) Then DataCorrente = Date
Dim Anni As Integer
Dim Mesi As Integer
Dim Giorni As Integer
'Calcolo gli anni
    Anni = Year(DataCorrente) - Year(nascita)
    If DateSerial(Year(DataCorrente), Month(nascita), Day(nascita)) > 
DataCorrente Then
        Anni = Anni - 1
    End If
    eta = "Età : Anni=" & Anni
End Function
ma ricevo sempre un errore: è stato immesso un valore non valido per il 
campo e se faccio il debug mi trovo evidenziato la riga di codice dove ho 
scritto:
Me!AssisititoEta = eta(DataNascita)
Ti sono grato per l'aiuto che mi stai dando!
Ciao,
Luigi 

 Luigi
Prima cosa in questo caso no modificare una funzione simile per
restituire una stringa, quella la aggiungi dopo.
Io non uso quella funzione anche se è praticamente uguale ma uso
questa:
Function Age (varBirthDate As Variant) As Integer
   Dim varAge As Variant
   If IsNull(varBirthdate) then Age = 0: Exit Function
   varAge = DateDiff("yyyy", varBirthDate, Now)
   If Date < DateSerial(Year(Now), Month(varBirthDate), _
                        Day(varBirthDate)) Then
      varAge = varAge - 1
   End If
   Age = CInt(varAge)
End Function
Ho fatto una simulazione da me e funziona.



Ciao Alex,
ancora una volta grazie mille per l'aiuto. Con la funzione che mi hai 
scritto ora funziona, Resta solo il problema dell'età delle persone più 
anziane. Ad esempio per una persona nata nel 1913 mi ritrovo un'età di -9 
anni! Ho provato a fare qualche controllo di quelli di cui avevamo parlato 
nei post precedenti. Cmq, visto che i casi non dovrebbero essere tanti e che 
la ragazza che dovrebbe inserire i dati non dorme possiamo anche passarci su 
e magari metto un messaggio che segnali questo fatto!
Ciao e grazie ancora una volta
Luigi 

 Luigi
Assolutamente no, deve funzionare tutta e bene.
Il problema stà nella funzione di verifica dell'anno.
Se a questa passi ad es. 13 che nel CF starebbe per 1913
If anno> Year(Format(Now(),"dd/mm/yy")) Then
     anno = anno - 100
End If
anno=-87
ed è ovviamente errato.
Per risolvere il problema occorre ripristinare le 4 cifre
ma la cosa è un pò empirica e soprattutto ha il limite di 100
anni ma al momento non mi viene in mente nulla per risolvere
la cosa, occorrerebbe studiarsi il Decreto in questione e trovare
li la soluzione al problema che sicuramente è stata prevista.
Sostituisci il calcolo dell'anno in questo modo:
Private Sub AssisititoCodiceFIscale_AfterUpdate()
 Dim anno As Integer
 Dim Mese As Integer
 Dim giorno As Integer
 Dim DataNascita As Date
 
   anno = Mid$(AssisititoCodiceFIscale, 7, 2)
   If anno > Year(Format(Now(),"dd/mm/yy"))  Then
        anno = 1900 + anno
   Else
        anno = 2000 + anno
   End If
   Mese = retMese(Mid$(AssisititoCodiceFIscale, 9, 1))
   giorno = Mid$(AssisititoCodiceFIscale, 10, 2)
   If giorno> 31 Then
          giorno = giorno - 40
          MsgBox "FEMMINA"
   End If
   DataNascita = DateSerial(anno, Mese, giorno)
   Me!AssisititoEta = "Anni: " & Age(DataNascita)
  End Sub
Ciao



Ciao Alex e ancora una volta grazie per il tuo aiuto!
Ho provato ad incollare il tuo codice nella funzione ma non so perchè  è 
ancora peggio. Prima non mi calcolava solo le età più avanzate ora invece 
sono proprio tutte sbagliate. Cmq ti ripeto che per me non è un problema e 
può andare bene anche così!Ciao!
Luigi 

 Luigi
Meglio così, l'aternativa era come ti dicevo leggersi con
calma la normativa vigente, ma non ho una gran voglia...!
