Newsgroup: it.comp.lang.visual-basic
Titolo: Calcolo codice fiscale

Oi!
Qualcuno sa dirmi dove posso trovare una funzione che calcoli il
codice fiscale?
Grazie mille e 
Axč!

E' una funzione che ho fatto alcuni anni fa.
Funzionava perfettamente con Access97. Prova a dare un'occhiata, con piccole
modifiche potrebbe servirti
Function CODFISC(Cognome As Variant, Nome As Variant, DataNascita As
Variant, LuogoNascita As Variant, Sesso As Variant) As String
    Dim CB As Recordset, nConsTot As Integer, nCons As Integer, X As
Integer, S As String
    Dim sData As String, sMesi(1 To 12) As String, Tot As Long, y As Integer
    Dim sPari(65 To 90) As Integer
    sMesi(1) = "A"
    sMesi(2) = "B"
    sMesi(3) = "C"
    sMesi(4) = "D"
    sMesi(5) = "E"
    sMesi(6) = "H"
    sMesi(7) = "L"
    sMesi(8) = "M"
    sMesi(9) = "P"
    sMesi(10) = "R"
    sMesi(11) = "S"
    sMesi(12) = "T"
    sPari(65) = 1
    sPari(66) = 0
    sPari(67) = 5
    sPari(68) = 7
    sPari(69) = 9
    sPari(70) = 13
    sPari(71) = 15
    sPari(72) = 17
    sPari(73) = 19
    sPari(74) = 21
    sPari(75) = 2
    sPari(76) = 4
    sPari(77) = 18
    sPari(78) = 20
    sPari(79) = 11
    sPari(80) = 3
    sPari(81) = 6
    sPari(82) = 8
    sPari(83) = 12
    sPari(84) = 14
    sPari(85) = 18
    sPari(86) = 10
    sPari(87) = 22
    sPari(88) = 26
    sPari(89) = 24
    sPari(90) = 29
    CODFISC = ""
    If IsNull(Cognome) Or IsNull(DataNascita) Or IsNull(LuogoNascita) Or
IsNull(Sesso) Then
        Exit Function
    End If
    If IsNull(Nome) Then
        If InStr(Cognome, ",") = 0 Then
            Exit Function
        Else
            Nome = Trim(Mid$(Cognome, InStr(Cognome, ",") + 1))
            Cognome = Trim(Left$(Cognome, InStr(Cognome, ",") - 1))
        End If
    End If
    Set CB = CurrentDb.OpenRecordset("Comuni Belfiore", dbOpenTable)
    CB.Index = "Descrizione"
    Cognome = UCase$(Cognome)
    Nome = UCase$(Nome)
    ' COGNOME
    For X = 1 To Len(Cognome)
        S = Mid$(Cognome, X, 1)
        If S <> " " Then
            If S <> "A" And S <> "E" And S <> "I" And S <> "O" And S <> "U"
Then
                CODFISC = CODFISC & S
            End If
            If Len(CODFISC) = 3 Then
                Exit For
            End If
        End If
    Next X
    If Len(CODFISC) < 3 Then
        For X = 1 To Len(Cognome)
            S = Mid$(Cognome, X, 1)
            If S <> " " Then
                If S = "A" Or S = "E" Or S = "I" Or S = "O" Or S = "U" Then
                    CODFISC = CODFISC & S
                End If
                If Len(CODFISC) = 3 Then
                    Exit For
                End If
            End If
        Next X
    End If
    Do While Len(CODFISC) < 3
        CODFISC = CODFISC & "X"
    Loop
    ' NOME
    ' conto le consonanti del nome
    nConsTot = 0
    For X = 1 To Len(Nome)
        S = Mid$(Nome, X, 1)
        If S <> "A" And S <> "E" And S <> "I" And S <> "O" And S <> "U" Then
            nConsTot = nConsTot + 1
        End If
    Next X
    nCons = 0
    For X = 1 To Len(Nome)
        S = Mid$(Nome, X, 1)
        If S <> " " Then
            If S <> "A" And S <> "E" And S <> "I" And S <> "O" And S <> "U"
Then
                nCons = nCons + 1
                If nCons <> 2 Or nConsTot < 4 Then
                    CODFISC = CODFISC & S
                End If
            End If
            If Len(CODFISC) = 6 Then
                Exit For
            End If
        End If
    Next X
    If Len(CODFISC) < 6 Then
        For X = 1 To Len(Nome)
            S = Mid$(Nome, X, 1)
            If S <> " " Then
                If S = "A" Or S = "E" Or S = "I" Or S = "O" Or S = "U" Then
                    CODFISC = CODFISC & S
                End If
                If Len(CODFISC) = 6 Then
                    Exit For
                End If
            End If
        Next X
    End If
    Do While Len(CODFISC) < 6
        CODFISC = CODFISC & "X"
    Loop
    ' DATA DI NASCITA
    sData = Format$(DataNascita, "dd/mm/yy")
    CODFISC = CODFISC & Mid$(sData, 7, 2)
    CODFISC = CODFISC & sMesi(Mid$(sData, 4, 2))
    If UCase$(Sesso) = "M" Then
        CODFISC = CODFISC & Mid$(sData, 1, 2)
    Else
        CODFISC = CODFISC & Format$(Mid$(sData, 1, 2) + 40, "00")
    End If
    ' LUOGO DI NASCITA
    LuogoNascita = UCase$(LuogoNascita)
    CB.Seek "=", LuogoNascita
    If CB.NoMatch Then
        CODFISC = ""
        CB.Close
        Exit Function
    End If
    CODFISC = CODFISC & CB!CodiceBelfiore
    'CRC
    Tot = 0
    For X = 1 To 15
        S = Mid$(CODFISC, X, 1)
        y = Asc(S)
        If y < 65 Then y = y + 17
        If Int(X / 2) <> X / 2 Then ' dispari
            Tot = Tot + sPari(y)
        Else                        ' pari
            Tot = Tot + y - 65
        End If
    Next X
    y = Tot - (Int(Tot / 26) * 26)
    CODFISC = CODFISC & Chr(y + 65)
    CB.Close
End Function
' ritorna il valore del parametro richiesto. Se non esistente ritorna ""
Function GetParametro(NomeParametro As String, Optional ValoreDef As String
= "") As String
    GetParametro = Nz(DLookup("ValoreParametro", "Parametri procedura",
"IDParametro='" & _
                                                    NomeParametro & "'"),
ValoreDef)
End Function
' scrive il valore del parametro richiesto.
Function PutParametro(NomeParametro As String, ValoreParametro As String) As
Boolean
    Dim RS As Recordset
    On Error GoTo err_PutParametro
    Set RS = CurrentDb.OpenRecordset("Parametri procedura")
    RS.FindFirst "IDParametro='" & NomeParametro & "'"
    With RS
        If .NoMatch Then
            .AddNew
            !IDParametro = NomeParametro
        Else
            .Edit
        End If
        !ValoreParametro = ValoreParametro
        .Update
    End With
    PutParametro = True
exit_PutParametro:
    RS.Close
    Exit Function
err_PutParametro:
    PutParametro = False
    GoTo exit_PutParametro
End Function

 codice fiscale?
Sito Comune. Trovi anche il DB con i codici dei comuni
--
Ciao Stefano
steve...@tiscalinet.it

 Sito Comune. Trovi anche il DB con i codici dei comuni
Aggiungo un importante consiglio.
In alcuni software, avviene un test del CF inserito e, se questo non
coincide con quello calcolato, è impossibile proseguire.
Questa è una cazzata grande come una casa in quanto, come tutti sanno, il CF
può anche essere diverso da quello calcolato, in alcuni casi molto rari.
Occorre sempre dare la possibilità di dire "Sì, è diverso da quello
calcolato, ma in questo caso è effettivamente così, quindi prendilo per
buono...".
ciao
Alberto

 buono...".
Non è regola di programmazione.
E' regola di buon senso...   ;-P
ciao
ugo

 per buono...".
piccola ulteriore chiosa: il cf deve essere comunque rifiutato se il
carattere di controllo è errato, senza dare possibilità all'operatore di
accettarlo.
Salutoni
Sergio

 coincide con quello calcolato, è impossibile proseguire.
Provate a costruire il CF con la località:
Sant'andrea Apostolo dello Jonio
Non vi racconto le disavventure
giuseppeD


Dico la mia. Il vero sbaglio è dare la possiblità di calcolare il codice 
fiscale, attività questa che spetta unicamente alle Finanze. Quello che 
un programmatore puo' e deve fare, sempre secondo me, è il solo 
controllo della validità del codice fiscale.
Ciao.

 controllo della validità del codice fiscale.
pienamente daccordo, soprattutto tenendo conto che poi dovreste portarvi
appresso il db dei comuni e aggiornarlo, secondo me il controllo della
validita' e' + che sufficiente.