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

    Ciao,
ho messo in funzione il codice relativo alla generazione del Codice Fiscale
che, grazie alla tabella tanto cercata passatami da Francesco, sembra
funzionare a dovere. La generazione del Codice canna in caso di nome troppo
corto però non è più corretta, quali indicazioni dovrei seguire in questo
caso? Come sono le regole in caso di nomi o cognomi corti?
Nel frattempo, come promesso (ricordatevi però che non è ancora del tutto
corretto!!) ...
function GeneraCodiceFiscale(sCognome,sNome,sNascita,sSesso,sLuogo: string)
: string;
type
    TTabella = array[1..36, 0..1] of byte;
const
    Tabella: TTabella = (
       {pari  dispari   carattere }
        (  0,  1),      {0}
        (  1,  0),      {1}
        (  2,  5),      {2}
        (  3,  7),      {3}
        (  4,  9),      {4}
        (  5, 13),      {5}
        (  6, 15),      {6}
        (  7, 17),      {7}
        (  8, 19),      {8}
        (  9, 21),      {9}
        (  0,  1),      {A}
        (  1,  0),      {B}
        (  2,  5),      {C}
        (  3,  7),      {D}
        (  4,  9),      {E}
        (  5, 13),      {F}
        (  6, 15),      {G}
        (  7, 17),      {H}
        (  8, 19),      {I}
        (  9, 21),      {J}
        ( 10,  2),      {K}
        ( 11,  4),      {L}
        ( 12, 18),      {M}
        ( 13, 20),      {N}
        ( 14, 11),      {O}
        ( 15,  3),      {P}
        ( 16,  6),      {Q}
        ( 17,  8),      {R}
        ( 18, 12),      {S}
        ( 19, 14),      {T}
        ( 20, 16),      {U}
        ( 21, 10),      {V}
        ( 22, 22),      {W}
        ( 23, 25),      {X}
        ( 24, 24),      {Y}
        ( 25, 23));     {Z}
    Alfabeto = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var w, x,y, somma, posizione, i, ck, cz: integer;
    lt, k, z, ccog, cnom, valmese, canno, cmese, cgiorno, codf, ccontrol,
    cy, cx : string;
    wanno, wmese, wgiorno: word;
begin
    x           := 0;
    y           := 0;
    k           := '';
    z           := '';
    sCognome    := trim(sCognome);
    sNome       := trim(sNome);
    // cognome
    for  w := 1 to length(sCognome) do begin
        lt:= copy(sCognome,w,1);
        if (lt <> 'A') and (lt <> 'E') and (lt <> 'I') and (lt <> 'O') and
(lt <> 'U') then begin
            x := x + 1;
            z := z + lt;
        end else begin
            y := y + 1;
            k := k + lt;
        end;
    end;
    if x > 3 then
        ccog:= copy(z,1,1)+ copy(z,2,1)+ copy(z,3,1);
    if x = 2 then
        ccog:= copy(z,1,1)+ copy(z,2,1)+ copy(k,1,1);
    if (x = 1) and ((y > 2) or (y =2)) then
        ccog:= copy(z,1,1)+ copy(k,1,1)+ copy(k,2,1);
    if (x = 1) and (y = 1) then
        ccog:= copy(z,1,1)+ copy(k,1,1)+ 'X';
    if (x = 0) and ((y > 2) or (y =2)) then
        ccog:= copy(k,1,1)+ copy(k,2,1)+ 'X';
    cX:= '';
    cy:= '';
    ck:= 0;
    cz:= 0;
    for w:=1 to length(snome) do begin
        lt:= copy(snome,w,1);
        if (lt <> 'A') and (lt <> 'E') and (lt <> 'I') and (lt <> 'O') and
(lt <> 'U') then begin
            cz:=cz+1;
            cx:=cx+lt;
        end else begin
            ck:=ck+1;
            cy:=cy+lt;
        end;
    end;
    if  (cz > 4) or (cz = 4) then
        cnom:=copy(cx,1,1)+ copy(cx,3,1)+ copy(cx,4,1);
    if cz = 3 then
        cnom:= copy(cx,1,1)+ copy(cx ,2,1)+ copy(cx,3,1);
    if cz = 2 then
        cnom:= copy(cx,1,1)+ copy(cx,2,1)+ copy(cx,1,1);
    if (cz = 1) and ((ck > 2) or (ck = 2)) then
        cnom:= copy(cx,1,1)+ copy(cy,1,1)+ copy(cy,2,1);
    if (cz = 1) and (ck = 1) then
        cnom:= copy(cx,1,1)+ copy(cy,1,1)+ 'X';
    if (cz = 0) and ((ck > 2) or (ck = 2)) then
        cnom:= copy(cy,1,1)+ copy(cy,2,1)+ 'X';
    decodedate(strtodate(snascita),wanno,wmese,wgiorno);
    canno:= copy(inttostr(wanno),3,2);  // solo le ultime 2 cifre
    valmese:='ABCDEHLMPRST' ;
    cmese:= copy(valmese,wmese,1);
    if sSesso= 'F' then
        cgiorno:=inttostr(wgiorno + 40);
    //
    if sSesso= 'M' then
        cgiorno:=inttostr(wgiorno);
    codf:= ccog + cnom + canno + cmese + cgiorno + sluogo;
    Somma := 0;
    for i:= 1 to 15 do begin
        Posizione:= Pos(codf[i], Alfabeto);
        inc(Somma , Tabella[Posizione, i mod 2])
    end;
    ccontrol:= Chr(65+(Somma mod 26));
    result:= codf + ccontrol;
end;
--
    yVega
--
[ 1.0#@ 1.07 yrs ]

Guarda, se vai qualche messaggio indietro col subject ' vorrei creare
una DLL .... ma non ci riesco' ho postato le funzioni complete per il
calcolo del codice fiscale che funziona perfettamente e non 'canna'
neppure coi nomi coreti. :-)
Ciao 
robin
P.S. Fammi sapere se funziona, e se ti riesce prova a farne una DLL
utilizzando i PChar al posto delle string. Io non ci sono riuscito.


 function GeneraCodiceFiscale(sCognome,sNome,sNascita,sSesso,sLuogo:
string)
[CUT]

caso? Come sono le regole in caso di nomi o cognomi corti?
Ciao yVega sul .DOC che ti ho dato c'e' scritto cosa fare nel caso di
nomi e cognomi corti:
<<Se il cognome contiene due sole consonanti si rilevano tali due
consonanti e la prima vocale; se contiene una sola consonante si
rileva tale consonante e le prime due vocali; se contiene una sola
consonante ed una sola vocale si rilevano entrambe e si assume come
terzo carattere la lettera X.
Se il nome contiene tre consonanti si rilevano tali tre consonanti; se
ne contiene meno si applicano le stese regole indicate per il cognome.
Per le donne coniugate si prende in considerazione soltanto il cognome
da nubile.>>
Ciao
~Guybrush~

    ... anche se in ritardo, grazie a tutti per l'aiuto. Ciao.
