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

Questa guida ha il solo scopo di fornire le indicazioni
per muovere i primi passi con questo bellissimo strumento.

 


dal 22 Giugno 1999
webmaster@foxitaly.com