Olá Pessoal eu tenho uma função que eu usava em pascal que valida UF se alguem quiser transcrever fique a vontade, esta função foi retirada do componente do ACBrNFe, a diferença que foi feito um componente, o que precisa fazer e passar a UF e a IE por parametro, pois neste exemplo você não passa o parametro na função ele pega via metodo de acesso, onde ele pega a UF que é o campo fsComplemento e a Inscrição Estadual que é o fsDocto.
Que já trabalhou com Delphi é moleza reescrever, ainda tem uma função que valida a se a UF existe e outra para formatar a IE conforme o Estado.
//************************** Valida Inscrição Estadual *****************************//
Procedure TACBrValidador.ValidarIE ;
Const
c0_9 : AnsiString = '0-9' ;
cPesos : array[1..13] of array[1..14] of Integer =
((0 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,2 ,3 ,4 ,5 ,6 ),
(0 ,0 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,2 ,3 ,4 ,5 ),
(2 ,0 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,2 ,3 ,4 ,5 ,6 ),
(0 ,2 ,3 ,4 ,5 ,6 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ),
(0 ,8 ,7 ,6 ,5 ,4 ,3 ,2 ,1 ,0 ,0 ,0 ,0 ,0 ),
(0 ,2 ,3 ,4 ,5 ,6 ,7 ,0 ,0 ,8 ,9 ,0 ,0 ,0 ),
(0 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,1 ,2 ,3 ,4 ,5 ),
(0 ,2 ,3 ,4 ,5 ,6 ,7 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ),
(0 ,0 ,2 ,3 ,4 ,5 ,6 ,7 ,2 ,3 ,4 ,5 ,6 ,7 ),
(0 ,0 ,2 ,1 ,2 ,1 ,2 ,1 ,2 ,1 ,1 ,2 ,1 ,0 ),
(0 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10,11,2 ,3 ,0 ),
(0 ,0 ,0 ,0 ,10,8 ,7 ,6 ,5 ,4 ,3 ,1 ,0 ,0 ),
(0 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10,2 ,3 ,0, 0 ) ) ;
Var
vDigitos : array of {$IFDEF FPC}Variant{$ELSE} AnsiString{$ENDIF} ;
xROT, yROT : AnsiString ;
Tamanho, FatorF, FatorG, I, xMD, xTP, yMD, yTP, DV, DVX, DVY : Integer ;
SOMA, SOMAq, nD, M : Integer ;
OK : Boolean ;
Passo, D : AnsiChar ;
begin
if UpperCase( Trim(fsDocto) ) = 'ISENTO' then
exit ;
if fsComplemento = '' then
begin
fsMsgErro := 'Informe a UF no campo Complemento' ;
exit ;
end ;
ValidarUF( fsComplemento ) ;
if fsMsgErro <> '' then
exit ;
{ Somente digitos ou letra P na primeira posicao }
{ P é usado pela Insc.Estadual de Produtor Rural de SP }
if ( not StrIsNumber( copy(fsDocto,2,length(fsDocto) ))) or
( not CharIsNum(fsDocto[1]) and (fsDocto[1] <> 'P')) then
begin
fsMsgErro := 'Caracteres inválidos na Inscrição Estadual' ;
exit
end ;
Tamanho := 0 ;
xROT := 'E';
xMD := 11 ;
xTP := 1 ;
yROT := '' ;
yMD := 0 ;
yTP := 0 ;
FatorF := 0 ;
FatorG := 0 ;
SetLength( vDigitos, 13);
vDigitos := VarArrayOf(['','','','','','','','','','','','','','']) ;
if fsComplemento = 'AC' then
begin
if Length(fsDocto) = 9 then
begin
Tamanho := 9 ;
vDigitos := VarArrayOf(
['DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'1','0','','','','',''] ) ;
end
else
if Length(fsDocto) = 13 then
begin
Tamanho := 13 ;
xTP := 2 ; yROT := 'E' ; yMD := 11 ; yTP := 1 ;
vDigitos := VarArrayOf(
['DVY','DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'1','0','']);
end ;
end ;
if fsComplemento = 'AL' then
begin
Tamanho := 9 ;
xROT := 'BD' ;
vDigitos := VarArrayOf(
['DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'4','2','','','','',''] ) ;
end ;
if fsComplemento = 'AP' then
begin
if Length(fsDocto) = 9 then
begin
Tamanho := 9 ;
xROT := 'CE' ;
vDigitos := VarArrayOf(
['DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'3','0','','','','',''] ) ;
if (fsDocto >= '030170010') and (fsDocto <= '030190229') then
FatorF := 1
else if fsDocto >= '030190230' then
xROT := 'E' ;
end ;
end ;
if fsComplemento = 'AM' then
begin
Tamanho := 9 ;
vDigitos := VarArrayOf(
[ 'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'','','','',''] ) ;
end ;
if fsComplemento = 'BA' then
begin
Tamanho := 8 ;
xTP := 2 ; yTP := 3 ; yROT := 'E' ;
vDigitos := VarArrayOf(
['DVX','DVY',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'','','','','',''] ) ;
if pos(fsDocto[1],'0123458') > 0 then
begin
xMD := 10 ; yMD := 10 ;
end
else
begin
xMD := 11 ; yMD := 11 ;
end ;
end ;
if fsComplemento = 'CE' then
begin
Tamanho := 9 ;
vDigitos := VarArrayOf(
[ 'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'0','','','','',''] ) ;
end ;
if fsComplemento = 'DF' then
begin
Tamanho := 13 ;
xTP := 2 ; yROT := 'E' ; yMD := 11 ; yTP := 1 ;
vDigitos := VarArrayOf(
['DVY','DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'3,4,5','7','0','']);
end ;
if fsComplemento = 'ES' then
begin
Tamanho := 9 ;
vDigitos := VarArrayOf(
[ 'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'0,8','0','','','','',''] ) ;
end ;
if fsComplemento = 'GO' then
begin
if Length(fsDocto) = 9 then
begin
Tamanho := 9 ;
vDigitos := VarArrayOf(
[ 'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'0,1,5','1','','','','',''] ) ;
if (fsDocto >= '101031050') and (fsDocto <= '101199979') then
FatorG := 1 ;
end ;
end ;
if fsComplemento = 'MA' then
begin
Tamanho := 9 ;
vDigitos := VarArrayOf(
['DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'2','1','','','','',''] ) ;
end ;
if fsComplemento = 'MT' then
begin
if Length(fsDocto) = 9 then
fsDocto := padR(fsDocto,11,'0') ;
Tamanho := 11 ;
vDigitos := VarArrayOf(
['DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'','',''] ) ;
end ;
if fsComplemento = 'MS' then
begin
Tamanho := 9 ;
vDigitos := VarArrayOf(
['DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'8','2','','','','',''] ) ;
end ;
if fsComplemento = 'MG' then
begin
Tamanho := 13 ;
xROT := 'AE' ; xMD := 10 ; xTP := 10 ;
yROT := 'E' ; yMD := 11 ; yTP := 11 ;
vDigitos := VarArrayOf(
['DVY','DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'']);
end ;
if fsComplemento = 'PA' then
begin
Tamanho := 9 ;
vDigitos := VarArrayOf(
[ 'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'5','1','','','','',''] ) ;
end ;
if fsComplemento = 'PB' then
begin
Tamanho := 9 ;
vDigitos := VarArrayOf(
[ 'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'6','1','','','','',''] ) ;
end ;
if fsComplemento = 'PR' then
begin
Tamanho := 10 ;
xTP := 9 ; yROT := 'E' ; yMD := 11 ; yTP := 8 ;
vDigitos := VarArrayOf(
[ 'DVY','DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'','','',''] ) ;
end ;
if fsComplemento = 'PE' then
begin
if Length(fsDocto) = 14 then
begin
Tamanho := 14;
xTP := 7 ; FatorF := 1;
vDigitos := VarArrayOf(
['DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'1-9','8','1']);
end
else
if Length(fsDocto) = 9 then
begin
Tamanho := 9;
xTP := 9 ; xMD := 11;
yROT := 'E' ; yMD := 11 ; yTP := 7;
vDigitos := VarArrayOf(
[ 'DVY','DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'','','','',''] );
end;
end;
if fsComplemento = 'PI' then
begin
Tamanho := 9 ;
vDigitos := VarArrayOf(
[ 'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'9','1','','','','',''] ) ;
end ;
if fsComplemento = 'RJ' then
begin
Tamanho := 8 ;
xTP := 8 ;
vDigitos := VarArrayOf(
['DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'1,7,8,9','','','','','',''] ) ;
end ;
if fsComplemento = 'RN' then
begin
if Length(fsDocto) = 9 then
begin
Tamanho := 9 ;
xROT := 'BD' ;
vDigitos := VarArrayOf(
[ 'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'0','2','','','','',''] ) ;
end
else
if Length(fsDocto) = 10 then
begin
Tamanho := 10 ;
xROT := 'BD' ;
xTP := 11 ;
vDigitos := VarArrayOf(
[ 'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'0','2','','','',''] ) ;
end;
end ;
if fsComplemento = 'RS' then
begin
Tamanho := 10 ;
vDigitos := VarArrayOf(
[ 'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'0-4','','','',''] ) ;
end ;
if fsComplemento = 'RO' then
begin
FatorF := 1 ;
if Length(fsDocto) = 9 then
begin
Tamanho := 9 ;
xTP := 4 ;
vDigitos := VarArrayOf(
[ 'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'1-9','','','','',''] ) ;
end ;
if Length(fsDocto) = 14 then
begin
Tamanho := 14 ;
vDigitos := VarArrayOf(
['DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9]);
end ;
end ;
if fsComplemento = 'RR' then
begin
Tamanho := 9 ;
xROT := 'D' ; xMD := 9 ; xTP := 5 ;
vDigitos := VarArrayOf(
[ 'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'4','2','','','','',''] ) ;
end ;
if (fsComplemento = 'SC') or (fsComplemento = 'SE') then
begin
Tamanho := 9 ;
vDigitos := VarArrayOf(
[ 'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'','','','',''] ) ;
end;
if fsComplemento = 'SP' then
begin
xROT := 'D' ; xTP := 12 ;
if fsDocto[1] = 'P' then
begin
Tamanho := 13 ;
vDigitos := VarArrayOf(
[c0_9,c0_9,c0_9,'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'P','']);
end
else
begin
Tamanho := 12 ;
yROT := 'D' ; yMD := 11 ; yTP := 13 ;
vDigitos := VarArrayOf(
['DVY',c0_9,c0_9,'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'','']);
end ;
end ;
if fsComplemento = 'TO' then
begin
if Length(fsDocto)=11 then
begin
Tamanho := 11 ;
xTP := 6 ;
vDigitos := VarArrayOf(
['DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'1,2,3,9','0,9','9','2','','','']);
end
else
begin
{ Tamanho := 10 ;
vDigitos := VarArrayOf(
[ 'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'0-4','','','',''] ) ; }
Tamanho := 9 ;
vDigitos := VarArrayOf(
[ 'DVX',c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,c0_9,'','','','',''] )
end;
end ;
{ Verificando se o tamanho Total está correto }
if fsAjustarTamanho then
fsDocto := padR( fsDocto, Tamanho, '0') ;
OK := (Tamanho > 0) and (Length(fsDocto) = Tamanho) ;
if not OK then
fsMsgErro := 'Tamanho Inválido' ;
{ Verificando os digitos nas posicoes são permitidos }
fsDocto := padR(fsDocto,14) ;
DVX := 0 ;
DVY := 0 ;
I := 13 ;
while OK and (I >= 0) do
begin
D := fsDocto[14-I] ;
if vDigitos[I] = '' then
OK := (D = ' ')
else if (vDigitos[I] = 'DVX') or (vDigitos[I] = 'DVY') or
(vDigitos[I] = c0_9) then
begin
OK := CharIsNum( D ) ;
if vDigitos[I] = 'DVX' then
DVX := StrToIntDef( D, 0 )
else
if vDigitos[I] = 'DVY' then
DVY := StrToIntDef( D, 0 ) ;
end
else if pos(',',vDigitos[I]) > 0 then { Ex: '2,5,7,8' Apenas os da lista}
OK := (pos( D, vDigitos[I] ) > 0)
else if pos('-',vDigitos[I]) > 0 then
OK := ( (D >= copy(vDigitos[I],1,1)) and (D <= copy(vDigitos[I],3,1)) )
else
OK := ( D = vDigitos[I] ) ;
if not OK then
fsMsgErro := Format('Digito %d deveria ser %s ',
[14-I-(14-Tamanho), vDigitos[I]]) ;
I := I - 1 ;
end ;
Passo := 'X' ;
while OK and (xTP > 0) do
begin
SOMA := 0 ;
SOMAq:= 0 ;
I := 14 ;
while OK and (I > 0) do
begin
D := fsDocto[15-I] ;
if CharIsNum(D) then
begin
nD := StrToIntDef(D,0) ;
M := nD * cPesos[xTP,I] ;
SOMA := SOMA + M ;
if pos('A',xROT) > 0 then
SOMAq := SOMAq + Trunc(M / 10) ;
end ;
I := I - 1 ;
end ;
if pos('A',xROT) > 0 then
SOMA := SOMA + SOMAq
else if pos('B',xROT) > 0 then
SOMA := SOMA * 10
else if pos('C',xROT) > 0 then
SOMA := SOMA + (5 + (4 * FatorF) ) ;
{ Calculando digito verificador }
DV := Trunc(SOMA mod xMD) ;
if pos('E',xROT) > 0 then
DV := Trunc(xMD - DV) ;
if DV = 10 then
DV := FatorG { Apenas GO modifica o FatorG para diferente de 0 }
else if DV = 11 then
DV := FatorF ;
if Passo = 'X' then
OK := (DVX = DV)
else
OK := (DVY = DV) ;
fsDigitoCalculado := IntToStr(DV) ;
if not OK then
begin
fsMsgErro := 'Digito verificador inválido.' ;
if fsExibeDigitoCorreto then
fsMsgErro := fsMsgErro + '.. Calculado: '+fsDigitoCalculado ;
end ;
if PASSO = 'X' then
begin
PASSO := 'Y' ;
xROT := yROT ;
xMD := yMD ;
xTP := yTP ;
end
else
break ;
end ;
fsDocto := Trim( fsDocto ) ;
if (fsMsgErro <> '') then
fsMsgErro := 'Insc.Estadual inválida para '+fsComplemento +' '+ fsMsgErro ;
end;
//************************** Valida UF *****************************//
Procedure TACBrValidador.ValidarUF(UF: AnsiString) ;
begin
if pos( ','+UF+',', ',AC,AL,AP,AM,BA,CE,DF,ES,GO,MA,MT,MS,MG,PA,PB,PR,PE,PI,'+
'RJ,RN,RS,RO,RR,SC,SP,SE,TO,') = 0 then
fsMsgErro := 'UF inválido: '+UF ;
end;
//************************** Formata Inscrição Estadual *****************************//
function TACBrValidador.FormatarIE(AString, UF: AnsiString): AnsiString;
Var
Mascara : AnsiString ;
C : AnsiChar ;
I, J, LenDoc, LenMas : Integer;
Begin
Result := AString ;
if UpperCase( Trim(AString) ) = 'ISENTO' then
exit ;
AString := LimpaDocto( AString ) ;
UF := UpperCase( UF ) ;
LenDoc := Length( AString ) ;
Mascara := StringOfChar('*', LenDoc) ;
IF UF = 'AC' Then Mascara := '**.***.***/***-**';
IF UF = 'AL' Then Mascara := '*********';
IF UF = 'AP' Then Mascara := '*********';
IF UF = 'AM' Then Mascara := '**.***.***-*';
IF UF = 'BA' Then Mascara := '******-**';
IF UF = 'CE' Then Mascara := '********-*';
IF UF = 'DF' Then Mascara := '***********-**';
IF UF = 'ES' Then Mascara := '*********';
IF UF = 'GO' Then Mascara := '**.***.***-*';
IF UF = 'MA' Then Mascara := '*********';
IF UF = 'MT' Then Mascara := '**********-*';
IF UF = 'MS' Then Mascara := '*********';
IF UF = 'MG' Then Mascara := '***.***.***/****';
IF UF = 'PA' Then Mascara := '**-******-*';
IF UF = 'PB' Then Mascara := '********-*';
IF UF = 'PR' Then Mascara := '********-**';
IF UF = 'PE' Then Mascara := IfThen((LenDoc>9),'**.*.***.*******-*','*******-**');
IF UF = 'PI' Then Mascara := '*********';
IF UF = 'RJ' Then Mascara := '**.***.**-*';
IF UF = 'RN' Then Mascara := IfThen((LenDoc>9),'**.*.***.***-*','**.***.***-*');
IF UF = 'RS' Then Mascara := '***/*******';
IF UF = 'RO' Then Mascara := '*************-*'; // Antiga = '***.*****-*';
IF UF = 'RR' Then Mascara := '********-*';
IF UF = 'SC' Then Mascara := '***.***.***';
IF UF = 'SP' Then Mascara := '***.***.***.***';
IF UF = 'SE' Then Mascara := '**.***.***-*';
IF UF = 'TO' Then Mascara := IfThen((LenDoc=11),'***********','**.***.***-*');
Result := '';
LenMas := Length( Mascara ) ;
J := LenMas ;
For I := LenMas downto 1 do
begin
C := Mascara[I] ;
if C = '*' then
begin
if J <= ( LenMas - LenDoc ) then
C := '0'
else
C := AString[( J - ( LenMas - LenDoc ) )] ;
Dec( J ) ;
end;
Result := C + Result;
End;
Result := Trim( Result );
end;
Qualquer dúvida entre em contato.
Att.
Carlos Fitl.