Post by Cosimo Picenoaltro problema,
come si controlla il codice fiscale della società,
quello di 11 cifre che a volte è uguale alla partita IVA
mentre in altri casi è diverso
Questo esegue un controllo formale:
**************************************************************************
* Controlla la validità di una partita
iva. *
* Restituisce comunque in caso di errore
<>*blanks *
* Se passato completerà il messaggio di errore con una
descrizione che *
* dovrebbe aver senso per chi usa il programma
chiamante. *
**************************************************************************
p mchkpiva b export
dmchkpiva pi
1 Errore
d piva const like(cdpaiva)
d tipocont 1 const
d errore 1 options(*omit)
d descrizione 30 const
options(*omit) Descrizione PI
d si c const(*on)
d no c const(*off)
d msg s 100 varying
d*------------------------------------------------------------------------
*
d errorex s 1
d i s 3 0
d p s 5 0
d n1 s 2 0
d tre s 3
c*------------------------------------------------------------------------
*
/Free
clear errorex;
if piva=*blanks and %scan(tipocont:' ')=0; // Obbligatoria
msg='obbligatoria';
exsr msg_out;
endif;
if piva<>*blanks and piva<>'. '; // Vuota o
bypass.
if %subst(piva:1:7)='000000'; // I primi 7 non possono
essere tutti 0
msg='I primi 7 caratteri non possono essere 0000000';
exsr msg_out;
endif;
clear p; // Calcola check digit.
for i=1 to %len(piva)-1;
if %scan(%subst(piva:i:1):'0123456789')>0;
n1=%dec(%subst(piva:i:1):1:0);
if %int(i/2)<>i/2;
p+=n1;
else;
n1*=2;
p+=%int(n1/10)+n1-%int(n1/10)*10;
endif;
else;
msg='Il carattere "'+%subst(piva:i:1)+'" a '
+'posizione '+%trim(%char(i))+' non è valido';
exsr msg_out;
endif;
endfor;
p=10-(p-%int(p/10)*10);
if %subst(piva:%len(piva):1)<>%subst(%editc(p:'Z'):%len(p):
1);
msg='Il carattere "'+%subst(piva:%len(piva):1)
+'" di controllo non quadra';
exsr msg_out;
endif;
// Le ultime 3 posizioni PRIMA del check digit hanno range
fissi.
tre=%subst(piva:%len(piva)-3);
if tre<'001' or tre>'100' and (tre<>'120' and tre<>'121');
msg='Le ultime posizioni "'+tre+'" possone essere 120,'
+'121 oppure comprese tra 001 e 100';
exsr msg_out;
endif;
endif;
return errorex; // Ok
// ***********************************************
begsr msg_out; // Gestione errori
errorex=si;
if %addr(descrizione)<>*null;
winmsg(%trim(descrizione)+' Partita Iva '+msg);
else;
winmsg('Partita Iva '+msg);
endif;
if %addr(errore)<>*null; // Solo in caso di
errori
errore=si;
endif;
return errorex;
endsr;
/End-free
p mchkpiva e
Ciao
Marco