Generatore di Codice Fiscale
di Annibale Freda ©
Riprendendo un listato comparso su un newsgroup e sviluppato genericamente per il linguaggio XBASE ho adattato il programma all'uso con VFP. Il programma sembra funzionare abbastanza correttamente. Il codice catasto del comune può essere rilevato dall'archivio Comuni.dbf già presente nel mio programma freeware Gestione codice fiscale scritto in Clipper 5.2e e prelevabile sul mio sito http://users.iol.it/fredaannibale basterà inserire e indicizzare opportunamente l'archivio per prelevare il codice del comune di nascita della persona dall'archivio Comuni.
Il listato che penso sia sufficientemente commentato comprende anche un controllo sulla presenza di eventuali segni o spazi che compongono il cognome od il nome della persona interessata alla creazione del codice fiscale. Questo per evitare errori nella creazione del codice fiscale dovuto, per esempio, alla presenza di un apostrofo nel cognome della persona fisica.
Questo è il listato. Sono graditi commenti e miglioramenti della procedura:
****************************************************************************
*
* Genera il codice fiscale
*
* Parametri : cCognome = Cognome della persona ( da 2 a 20 caratteri )
* cNome = Nome della persona ( da 2 a 20 caratteri )
* cSesso = Sesso della persona ( "M" o "F" )
* dNascita = Data di nascita
* cCatasto = Codice catasto del comune Es.: F205
*
*
* Ritorno : cCodFiscale = Codice fiscale
****************************************************************************
lparameter cCognome, cNome, cSesso, dNascita, cCatasto, CODICE_FISCALE
LOCAL nLOOP
LOCAL cELIMINA_COGNOME
LOCAL cELIMINA_NOME
local Csingolo_carattere
local aZ
LOCAL aK
LOCAL aX
LOCAL aY
LOCAL X
local Y
local K
local Z
local W
local LT
local AN
local MES
local MS
local ME
local GR
local CGN
local NM
local CODF
local NUMERO1
local NUMERO2
local NUMERO
local T
local I
local CAR
local CHAR
local CODE
local Q
local QUOZ
local CC
local QWERTY
local C
local N
local S
local D
local L
local P
local m.prov
local m.comu
Declare aMese(12)
Declare aContr1(72)
Declare aContr2(72)
Declare aZ(20)
Declare aK(20)
Declare aX(20)
Declare aY(20)
***assegnazioni
aMese[1] = 'A'
aMese[2] = 'B'
aMese[3] = 'C'
aMese[4] = 'D'
aMese[5] = 'E'
aMese[6] = 'H'
aMese[7] = 'L'
aMese[8] = 'M'
aMese[9] = 'P'
aMese[10] = 'R'
aMese[11] = 'S'
aMese[12] = 'T'
***dati per carattere di controllo
aContr1[1] = '0'
aContr1[2] = 0
aContr1[3] = '1'
aContr1[4] = 1
aContr1[5] = '2'
aContr1[6] = 2
aContr1[7] = '3'
aContr1[8] = 3
aContr1[9] = '4'
aContr1[10] = 4
aContr1[11] = '5'
aContr1[12] = 5
aContr1[13] = '6'
aContr1[14] = 6
aContr1[15] = '7'
aContr1[16] = 7
aContr1[17] = '8'
aContr1[18] = 8
aContr1[19] = '9'
aContr1[20] = 9
aContr1[21] = 'A'
aContr1[22] = 0
aContr1[23] = 'B'
aContr1[24] = 1
aContr1[25] = 'C'
aContr1[26] = 2
aContr1[27] = 'D'
aContr1[28] = 3
aContr1[29] = 'E'
aContr1[30] = 4
aContr1[31] = 'F'
aContr1[32] = 5
aContr1[33] = 'G'
aContr1[34] = 6
aContr1[35] = 'H'
aContr1[36] = 7
aContr1[37] = 'I'
aContr1[38] = 8
aContr1[39] = 'J'
aContr1[40] = 9
aContr1[41] = 'K'
aContr1[42] = 10
aContr1[43] = 'L'
aContr1[44] = 11
aContr1[45] = 'M'
aContr1[46] = 12
aContr1[47] = 'N'
aContr1[48] = 13
aContr1[49] = 'O'
aContr1[50] = 14
aContr1[51] = 'P'
aContr1[52] = 15
aContr1[53] = 'Q'
aContr1[54] = 16
aContr1[55] = 'R'
aContr1[56] = 17
aContr1[57] = 'S'
aContr1[58] = 18
aContr1[59] = 'T'
aContr1[60] = 19
aContr1[61] = 'U'
aContr1[62] = 20
aContr1[63] = 'V'
aContr1[64] = 21
aContr1[65] = 'W'
aContr1[66] = 22
aContr1[67] = 'X'
aContr1[68] = 23
aContr1[69] = 'Y'
aContr1[70] = 24
aContr1[71] = 'Z'
aContr1[72] = 25
aContr2[1] = '0'
aContr2[2] = 1
aContr2[3] = '1'
aContr2[4] = 0
aContr2[5] = '2'
aContr2[6] = 5
aContr2[7] = '3'
aContr2[8] = 7
aContr2[9] = '4'
aContr2[10] = 9
aContr2[11] = '5'
aContr2[12] = 13
aContr2[13] = '6'
aContr2[14] = 15
aContr2[15] = '7'
aContr2[16] = 17
aContr2[17] = '8'
aContr2[18] = 19
aContr2[19] = '9'
aContr2[20] = 21
aContr2[21] = 'A'
aContr2[22] = 1
aContr2[23] = 'B'
aContr2[24] = 0
aContr2[25] = 'C'
aContr2[26] = 5
aContr2[27] = 'D'
aContr2[28] = 7
aContr2[29] = 'E'
aContr2[30] = 9
aContr2[31] = 'F'
aContr2[32] = 13
aContr2[33] = 'G'
aContr2[34] = 15
aContr2[35] = 'H'
aContr2[36] = 17
aContr2[37] = 'I'
aContr2[38] = 19
aContr2[39] = 'J'
aContr2[40] = 21
aContr2[41] = 'K'
aContr2[42] = 2
aContr2[43] = 'L'
aContr2[44] = 4
aContr2[45] = 'M'
aContr2[46] = 18
aContr2[47] = 'N'
aContr2[48] = 20
aContr2[49] = 'O'
aContr2[50] = 11
aContr2[51] = 'P'
aContr2[52] = 3
aContr2[53] = 'Q'
aContr2[54] = 6
aContr2[55] = 'R'
aContr2[56] = 8
aContr2[57] = 'S'
aContr2[58] = 12
aContr2[59] = 'T'
aContr2[60] = 14
aContr2[61] = 'U'
aContr2[62] = 16
aContr2[63] = 'V'
aContr2[64] = 10
aContr2[65] = 'W'
aContr2[66] = 22
aContr2[67] = 'X'
aContr2[68] = 25
aContr2[69] = 'Y'
aContr2[70] = 24
aContr2[71] = 'Z'
aContr2[72] = 23
C = ALLTRIM( UPPER ( cCognome ) )
N = ALLTRIM( UPPER ( cNome))
S = cSesso
D = DTOS( dNascita )
L = cCatasto
cELIMINA_COGNOME = ""
cELIMINA_NOME = ""
&& elimina caratteri non compatibili da cognome ( APOSTROFI, SPAZI
ecc... )
for nloop = 1 to len ( C )
csingolo_carattere = substr ( C, nloop, 01 )
if ASC ( cSINGOLO_CARATTERE ) > 64 .AND. ASC
cSINGOLO_CARATTERE ) < 91
CELIMINA_COGNOME = CELIMINA_COGNOME + cSINGOLO_CARATTERE
ENDIF ASC
next nLOOP
C = cELIMINA_COGNOME
&& elimina caratteri non compatibili da cognome ( APOSTROFI, SPAZI
ecc... )
for nloop = 1 to len ( N )
csingolo_carattere = substr ( N, nloop, 01 )
if ASC ( cSINGOLO_CARATTERE ) > 64 .AND. ASC
cSINGOLO_CARATTERE ) < 91
CELIMINA_NOME = CELIMINA_NOME + cSINGOLO_CARATTERE
ENDIF ASC
next nLOOP
N = cELIMINA_NOME
X = 0
Y = 0
K = 0
Z = 0
***separazione vocali-consonanti nome
FOR W = 1 TO LEN(N)
LT = SUBSTR( N, W, 1 )
IF ASC(LT) >= 65 .AND. ASC( LT ) <= 90
IF !( LT $ "AEIOU" )
Z = Z + 1
aX[Z] = LT
ELSE
K = K + 1
aY[K] = LT
ENDIF
ENDIF
NEXT
***separazione vocali-consonanti cognome
FOR W = 1 TO LEN(C)
LT = SUBSTR( C, W, 1 )
IF ASC(LT) >= 65 .OR. ASC(LT) <= 90
IF !( LT $ "AEIOU" )
X = X + 1
aZ[X] = LT
ELSE
Y = Y + 1
aK[Y] = LT
ENDIF
ENDIF
NEXT
***determinazione anno nascita
AN = SUBSTR (D, 3, 2)
***determinazione mese di nascita
MES = SUBSTR( D, 5, 2 )
MS = VAL(MES)
ME = aMese[ MS ]
***determinazione giorno di nascita e sesso
GR = SUBSTR( D, 7, 2 )
IF S = "F"
GR = VAL(GR) + 40
GR = STR( GR, 2 )
ENDIF
***composizione codice fiscale
* cognome
DO CASE
CASE X >= 3
CGN = aZ[ 1 ] + aZ[ 2 ] + aZ[ 3 ]
CASE X = 2
CGN = aZ[ 1 ] + aZ[ 2 ] + aK[ 1 ]
CASE X = 1 .AND. Y >= 2
CGN = aZ[ 1 ] + aK[ 1 ] + aK[ 2 ]
CASE X = 1 .AND. Y = 1
CGN = aZ[ 1 ] + aK[ 1 ] + "X"
CASE X = 1 .AND. Y = 0
CGN = aZ[ 1 ] + "X" + "X"
CASE X = 0 .AND. Y = 1
CGN = aK[ 1 ] + "X" + "X"
CASE X = 0 .AND. Y = 2
CGN = aK[ 1 ] + aK[ 2 ] + "X"
CASE X = 0 .AND. Y = 3
CGN = aK[ 1 ] + aK[ 2 ] + aK[ 3 ]
CASE X = 0 .AND. Y = 0
CGN = "X" + "X" + "X"
ENDCASE
* nome
DO CASE
CASE Z >= 4
NM = aX[ 1 ] + aX[ 3 ] + aX[ 4 ]
CASE Z =3
NM = aX[ 1 ] + aX[ 2 ] + aX[ 3 ]
CASE Z = 2
NM = aX[ 1 ] + aX[ 2 ] + aY[ 1 ]
CASE Z = 1 .AND. K >= 2
NM = aX[ 1 ] + aY[ 1 ] + aY[ 2 ]
CASE Z = 1 .AND. K = 1
NM = aX[ 1 ] + aY[ 1 ] + "X"
CASE Z = 1 .AND. K = 0
NM = aX[ 1 ] + "X" + "X"
CASE Z = 0 .AND. K = 1
NM = aY[ 1 ] + "X" + "X"
CASE Z = 0 .AND. K = 2
NM = aY[ 1 ] + aY[ 2 ] + "X"
CASE Z = 0 .AND. K = 3
NM = aY[ 1 ] + aY[ 2 ] + aY[ 3 ]
CASE Z = 0 .AND. K = 0
NM = "X" + "X" + "X"
ENDCASE
* codice 15 caratteri
CODF = CGN + NM + AN + ME + GR + m.L
* carattere di controllo
NUMERO1 = 0
NUMERO2 = 0
FOR T = 2 TO 14 STEP 2
CAR = SUBSTR( CODF, T, 1 )
I = 1
DO WHILE .T.
CHAR = aContr1[ I ]
CODE = aContr1[ I + 1 ]
I= I + 2
IF CHAR <> CAR
LOOP
ENDIF
NUMERO1 = NUMERO1 + CODE
EXIT
ENDDO
NEXT
FOR T = 1 TO 15 STEP 2
CAR = SUBSTR( CODF, T, 1 )
I = 1
DO WHILE .T.
CHAR = aContr2[ I ]
CODE = aContr2[ I + 1 ]
I= I +2
IF CHAR <> CAR
LOOP
ENDIF
NUMERO2 = NUMERO2 + CODE
EXIT
ENDDO
NEXT
NUMERO = NUMERO1 + NUMERO2
Q = INT( NUMERO / 26 )
QUOZ = NUMERO - ( Q * 26 )
CC = CHR( 65 + QUOZ )
* codice completo
CODICE_FISCALE = CGN + NM + AN + ME + GR + L + CC
RETURN CODICE_FISCALE
| Giugno 2000 |
|
|
![]() |
FoxPro e Visual FoxPro® sono un marchi registrati
da Microsoft Corporation© |
![]() |
|
|