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

So che ve lo avranno chiesto un milione di volte, ma ci sarebbe qualcuno
cosě gentile da postarmi la procedura per trovare il codice fiscale?
Ringrazio in anticipo.
Sean

 wrote in message
8tp804$jtc00$1...@ID-51780.news.dfncis.de...


reperirla... spero di esserti stato di aiuto.
Dove si puo' torvare un db aggiornato con i codici istat dei comuni e
degli stati esteri?
La procedura seguente non so se sia del tutto "a norma", ma pare
funzionare. Per sComune si intende il codice istat del luogo di
nascita.
Bye.
- Mariano La Via.-
function sMakeCodFis(const sCognome, sNome: string; const dData:
TDateTime;  const sSesso, sComune: string): string;
var
  i: byte;
  nYear, nMonth, nDay: word;
  nControllo, nPosizione: integer;
  function sGetTriple(const sText: string; const nMode: byte=0):
string;
  // nMode=0 ->Cognome, altrimenti Nome
  var
    i: byte;
    sVocali, sConsonanti: string;
  begin
    // acquisizione vocali e consonanti
    sVocali:=''; sConsonanti:=''; i:=1;
    while (i<=Length(sText)) and (Length(sConsonanti)<4) do begin
      if Pos(Copy(sText,i,1),'AEIOU')>0 then
        sVocali:=sVocali + Copy(sText,i,1)
      else if Pos(Copy(sText,i,1),'BCDFGHJKLMNPQRSTVWXYZ')>0 then
        sConsonanti:=sConsonanti + Copy(sText,i,1);
      // altrimeni e' uno spazio, un apostrofo o altro che non va
considerato
      Inc(i)
    end; //while
    // quante sono le consonanti?
    case Length(sConsonanti) of
      // se sono tre va bene cosi'
      3: Result:=sConsonanti;
      // se sono quattro differenziamo Cognome (nMode=0) e Nome
      4: if nMode=0 then Result:=Copy(sConsonanti,1,3)
         else Result:=Copy(sConsonanti,1,1)+Copy(sConsonanti,3,2);
      // se sono meno aggiungiamo vocali ed "X"
      0..2: Result:=Copy(sConsonanti+sVocali+'XXX',1,3);
    end; //case
  end;
begin
  // processiamo il cognome (123)
  Result:=sGetTriple(UpperCase(sCognome),0);
  // processiamo il nome (456)
  Result:=Result+sGetTriple(UpperCase(sNome),1);
  // processiamo la data di nascita
  if dData=Null then Result:=Result+'00X00'
  else begin
    DecodeDate(dData, nYear, nMonth, nDay);
    // anno di nascita (78)
    Result:=Result+Copy(Format('%4.4d',[nYear]),
                        Length(Format('%4.4d',[nYear]))-1,2);
    // mese di nascita(9)
    Result:=Result+Copy('ABCDEHLMPRST',nMonth,1);
    // giorno di nascita (AB)
    if UpperCase(sSesso) = 'F' then
Result:=Result+Format('%2.2d',[nDay+40])
    else Result:=Result+Format('%2.2d',[nDay]);
  end; //else
  // località di nascita (CDEF)
  Result:=Result+UpperCase(sComune)+Copy('X000',Length(sComune)+1,4);
  // calcolo carattere di controllo
  nControllo:=0; i:=1;
  repeat
    // I DISPARI
nPosizione:=Pos(Copy(Result,i,1),'B1A0KKPPLLC2QQD3RRE4VVOOSSF5TTG6UUH7MMI8NNJ9WWZZYYXX');
    nControllo:=nControllo+(((nPosizione-1) and 32766) div 2);
    Inc(i);
    if i > 15 then break;
    // I PARI
nPosizione:=Pos(Copy(Result,i,1),'A0B1C2D3E4F5G6H7I8J9KKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ');
    nControllo:=nControllo+(((nPosizione-1) and 32766) div 2);
    Inc(i);
  until False;
  nControllo:=(nControllo mod 26)+1;
  Result:=Result+Copy('ABCDEFGHIJKLMNOPQRSTUVWXYZ',nControllo,1);
end;