Newsgroup: it.comp.lang.delphi
Titolo: Codice Fiscale

Scusate, č la prima volta che scrivo su questo NG e vorrei che qualcuno mi
indicasse dove poter trovare il codice per il calcolo del Cod. Fiscale. Ci
vuole pure un database dei comuni? E perchč?
Con gratitudine
Luisa.

 ha scritto nel messaggio
news:cuks8.60644$pT1.1...@news1.tin.it...

Qui trovi tutte le istruzioni:
http://www.gmax.it/infocod.htm
Il problema č, come supponevi tu, che bisogna avere un database dei comuni.
Io ce l'ho, lo avevo preso da un programma per il calcolo del codice fiscale
che mi era arrivato con una rivista. Se vuoi te lo posso mandare per posta,
oppure puoi fare come me e cercarlo in qualche software per il calcolo del
CF
ciao Pibe

 Grazie per la disponibilità, ho trovato il dabatase dei comuni ma
l'algoritmo per il calcolo del codice fiscale è davvero complesso ci vuole
troppo tempo e pazienza. Chissà magari qualcuno ha già un sorgente pronto o
conosce un sito da dove scaricarlo. Confesso di averlo cercato sul web ma
inutilmente.
Ciao.
Luisa


Dove l'hai trovato il db dei comuni?
ciao
Alessandro

 ha scritto nel messaggio
news:mhns8.3208$m41....@twister2.libero.it...

L'ho trovato per caso a questo indirizzo:
http://rifrizzo.port5.com/cf/scarica.htm
 . Puoi scaricare un sorgente in PHP
(sic!) che contiene anche i codici dei comuni frazionati in quattro file
.csv. Fai come me, importali in un file Access e da li puoi esportarli nei
formati che vuoi.
E adesso forza, cerchiamo un buon sorgente in Delphi (meglio se D6).
Ciao. Luisa.

 wrote in message
Xvns8.74580$S52.2...@news2.tin.it...

Bè possiamo scrivercelo partendo dal sorgente php....
ciao
Alessandro

 vuole pure un database dei comuni? E perchč?
Per quanto riguarda il db dei comuni (Paradox):
http://www24.brinkster.com/walkietalkie/comuni.zip
Per quanto riguarda il codice, lo prendo pari pari da un mio
progetto:
unit uVerifCodici;
interface
type TSetCaratteri = set of Char;
function VerificaCodiceFiscale(CodiceFiscale: String): Boolean;
function VerificaPartitaIVA(PartitaIVA: String): Boolean;
function CalcolaCodiceFiscale(Cognome, Nome: String;
                              Sesso: Char;
                              Giorno, Mese, Anno: Word;
                              CodiceComune: String): String;
function FiltraStringa(S: String; SetCar: TSetCaratteri): String;
implementation
uses SysUtils;
const InsiemeConsonanti: TSetCaratteri =
['A'..'Z']-['A','E','I','O','U'];
      InsiemeVocali: TSetCaratteri = ['A','E','I','O','U'];
const CodiciMesi: String = 'ABCDEHLMPRST';
      CodiciControllo: String = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
function ValoreCarPosPari(C: Char): Integer;
begin
  Result := -1;
  case C of
    '0' : Result := 0;
    '1' : Result := 1;
    '2' : Result := 2;
    '3' : Result := 3;
    '4' : Result := 4;
    '5' : Result := 5;
    '6' : Result := 6;
    '7' : Result := 7;
    '8' : Result := 8;
    '9' : Result := 9;
    'A' : Result := 0;
    'B' : Result := 1;
    'C' : Result := 2;
    'D' : Result := 3;
    'E' : Result := 4;
    'F' : Result := 5;
    'G' : Result := 6;
    'H' : Result := 7;
    'I' : Result := 8;
    'J' : Result := 9;
    'K' : Result := 10;
    'L' : Result := 11;
    'M' : Result := 12;
    'N' : Result := 13;
    'O' : Result := 14;
    'P' : Result := 15;
    'Q' : Result := 16;
    'R' : Result := 17;
    'S' : Result := 18;
    'T' : Result := 19;
    'U' : Result := 20;
    'V' : Result := 21;
    'W' : Result := 22;
    'X' : Result := 23;
    'Y' : Result := 24;
    'Z' : Result := 25;
  end;
end;
function ValoreCarPosDispari(C: Char): Integer;
begin
  Result := -1;
  case C of
    '0' : Result := 1;
    '1' : Result := 0;
    '2' : Result := 5;
    '3' : Result := 7;
    '4' : Result := 9;
    '5' : Result := 13;
    '6' : Result := 15;
    '7' : Result := 17;
    '8' : Result := 19;
    '9' : Result := 21;
    'A' : Result := 1;
    'B' : Result := 0;
    'C' : Result := 5;
    'D' : Result := 7;
    'E' : Result := 9;
    'F' : Result := 13;
    'G' : Result := 15;
    'H' : Result := 17;
    'I' : Result := 19;
    'J' : Result := 21;
    'K' : Result := 2;
    'L' : Result := 4;
    'M' : Result := 18;
    'N' : Result := 20;
    'O' : Result := 11;
    'P' : Result := 3;
    'Q' : Result := 6;
    'R' : Result := 8;
    'S' : Result := 12;
    'T' : Result := 14;
    'U' : Result := 16;
    'V' : Result := 10;
    'W' : Result := 22;
    'X' : Result := 25;
    'Y' : Result := 24;
    'Z' : Result := 23;
  end;
end;
function FiltraStringa(S: String; SetCar: TSetCaratteri): String;
var
  I: Integer;
  T: String;
begin
  T := '';
  for I := 1 to Length(S) do
  begin
    if S[I] in SetCar then
      T := T + S[I];
  end;
  Result := T;
end;
function CalcolaCodiceControllo(CodiceFiscale: String): Char;
var
  I, CodiceControllo: Integer;
begin
  CodiceControllo := 0;
  for I := 1 to Length(CodiceFiscale) do
  begin
    if Odd(I) then
      Inc(CodiceControllo, ValoreCarPosDispari(CodiceFiscale[I]))
    else
      Inc(CodiceControllo, ValoreCarPosPari(CodiceFiscale[I]))
  end;
  CodiceControllo := CodiceControllo mod 26;
  Result := CodiciControllo[CodiceControllo+1];
end;
//
// ------ Interfaccia
//
function CalcolaCodiceFiscale;
var
  ConsonantiCognome: String;
  ConsonantiNome: String;
  VocaliCognome: String;
  VocaliNome: String;
  CodiceCognome: String;
  CodiceNome: String;
  CodiceAnno: String;
  CodiceMese: String;
  CodiceGiorno: String;
begin
  if (Sesso = '') or
     (Cognome = '') or
     (Nome = '') or
     (CodiceComune = '') then
  begin
    Result := '';
    Exit;
  end;
  Sesso := UpCase(Sesso);
  Cognome := FiltraStringa(UpperCase(Trim(Cognome)), ['A'..'Z']);
  Nome := FiltraStringa(UpperCase(Trim(Nome)), ['A'..'Z']);
  ConsonantiCognome := FiltraStringa(Cognome, InsiemeConsonanti);
  ConsonantiNome := FiltraStringa(Nome, InsiemeConsonanti);
  VocaliCognome := FiltraStringa(Cognome, InsiemeVocali);
  VocaliNome := FiltraStringa(Nome, InsiemeVocali);
  CodiceCognome := Copy(ConsonantiCognome + VocaliCognome + 'XX', 1, 3);
  CodiceNome := ConsonantiNome + VocaliNome + 'XX';
  if (Length(ConsonantiNome) > 3) then
    Delete(CodiceNome, 2, 1);
  CodiceNome := Copy(CodiceNome, 1, 3);
  CodiceAnno := Format('%.2d', [Anno mod 100]);
  CodiceMese := CodiciMesi[Mese];
  if (Sesso = 'F') then Giorno := Giorno + 40;
  CodiceGiorno := Format('%.2d', [Giorno]);
  Result := CodiceCognome + CodiceNome +
            CodiceAnno + CodiceMese + CodiceGiorno +
            CodiceComune;
  Result := Result + CalcolaCodiceControllo(Result);
end;
function VerificaCodiceFiscale;
begin
  CodiceFiscale := UpperCase(CodiceFiscale);
  Result := (CalcolaCodiceControllo(
                    Copy(CodiceFiscale, 1, Length(CodiceFiscale)-1)
                                   ) =
             CodiceFiscale[Length(CodiceFiscale)]);
end;
function VerificaPartitaIVA;
var
  I: Integer;
  Somma: Integer;
  Cifre: array [1..11] of Integer;
  K: Integer;
begin
  PartitaIVA := Trim(PartitaIVA);
  if Length(PartitaIVA) <> 11 then
  begin
    Result := false;
    Exit;
  end;
  for I := 1 to Length(PartitaIVA) do
  begin
    if not (PartitaIVA[I] in ['0'..'9']) then
    begin
      Result := false;
      Exit;
    end;
  end;
  for I := 1 to 11 do
  begin
    Cifre[I] := Ord(PartitaIVA[I]) - Ord('0');
  end;
  Somma := Cifre[1] + Cifre[3] + Cifre[5] + Cifre[7] + Cifre[9];
  I := 2;
  while (I <= 10) do
  begin
    K := 2 * Cifre[I];
    if K > 9 then K := K - 9;
    Somma := Somma + K;
    Inc(I, 2);
  end;
  Result := ((10 - Somma mod 10) mod 10) = Cifre[11];
end;
end.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


Grazie, lo proverň.
Intanto anch'io ho travato un sorgente simile (con meno linee di codice) che
funzione benissimo, se credete posso postarlo.
Luisa

 indicasse dove poter trovare il codice per il calcolo del Cod. Fiscale.
il codice per il calcolo del codice fiscale dovrebbe essere disponibile sul
news server di Marco Cantů. Fai l'iscrizione ai loro ng (č gratutita)
utilizzando il sito 
www.marcocantu.it
 e vai nella sezione repository,
dopodichč scarica il sorgente Delphi per il calcolo del codice fiscale.
Dovrebbe essere stato scritto da Antonio Tarolla ... č un programmatore di
cui ci si puň fidare, quindi scarica tranquillamente! :-)
Ciao
--
- Carlo -
c.b...@libero.it

     '3' : Result := 7;
    ....


      'A'..'Z': Result := Integer(C) - Integer('A') + 10;
Dal punto di vista prestazionale, se proprio vogliamo discutere
di queste idiozie, c'e' un costo maggiore nel tuo metodo che 
non nel mio: vogliamo vedere quanto occupa una sottrazione 
rispetto alla restituzione di un valore secco ?
Un case e' un case, se credi che venga prodotto piu' codice
macchina, perche' usi '0', '1, '2', '3,'..'9', anziche' 
'0'..'9' ti sbagli.
Se parli di stile, poi, siamo d'accordo, ma io tendo ad ottimizzare
il codice, anche dal punto di vista stilistico, quando ne vale
realmente la pena e non e' questo il caso.  Il codice e' stato
scritto per un progetto reale in tempi brevissimi.



Anche questo è più lento, occupi più memoria, è meno leggibile, è più
faticoso fare un eventuale debug e il codice macchina generato è
pressapoco uguale.

 realmente la pena e non e' questo il caso.
Infatti! Impiegavi meno tempo a scrivere set of che tutta la sfilza
dei case... cq anche a me piace ottimizzare e conoscere nuove tecniche
relative.


 pressapoco uguale.
ci sono ottimizzazioni e ottimizzazioni... velocita', dimensione,
linee di eseguibile...


linee di eseguibile...
Appunto: con la tua correzione hai peggiorato la velocità, forse hai
migliorato la dimensione el le linee di eseguibile generato, che forse
rallentano di qualche millesimo di secondo il caricamento del
programma in memoria, ma le cose più importanti sono la leggibilità e
la facilità di debug del codice, che hai reso più complessi. Inoltre
la velocità dell'eseguibile non è una cosa trascurabile se hai un file
con i nomi e codici fiscali degli abitanti di un'intera  città e ne
devi controllare l'esattezza ;)

 devi controllare l'esattezza ;)
infatti sono d'accordo con te su questo :) 


 ampiamente trascurabile.
Sensibilmente piu' lenta, quindi, di una restituzione secca.
In un calcolo del CF e' ampiamente trascurabile, quindi, che
vi sia una sottrazione o una restituzione di un valore secco.
Bene.
Non capisco, a questo punto, la tua puntualizzazione sul codice.
Ti faccio inoltre presente che potresti dover scorrere una
tabella di 100.000 record e calcolare il codice fiscale mancante
per ogni record.  Ora fai il calcolo di quanti cicli di clock
ti servono.


 beh dipende... io programmo dall'86 quindi... 
Quindi ?


 ti servono.
Sě questo lo so. Ma la mia dimsotrazione te lo farŕ vedere.


 Però è più lento e meno leggibile.
ho fatto dei test a casa con Delphi 6 enterprise. Il mio codice è
tutt'altro che più lento. Ora pubblico su internet i miei risultati.


Nemmeno io voglio lezioni di programmazione da te.
Io non te ne sto dando, difatti, per lo meno non
gratuitamente.
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

tutt'altro che più lento.
Stiamo aspettando.


 Quindi ?
Nell'86 o giů di li si ottimizzava tutto, le famose date ddmmyy, i tempi
di cpu, e si,
c'erano i famosi server multiuser, multitasking etc etc. 
Ma oggi, 15 Aprile 2002, dove mio nipote di soli 16 anni usa il PC per
giocarci che ha 512 Mb di RAM e 2 o 3 HD mi venite a parlare di
ottimizzazione
per migliorare di qualche decimo di secondo il risultato?
Parliamo di lana caprina.
Bye
  Marco


   Marco
non tutti hanno il picchio da 2Ghz e 512mb ram...e nemmeno la lana
caprina!


 wrote in message
news:bb0b63b3306c89859ca...@mygate.mailgate.org...
