eu usava a dll pra validar os IEs, mas depois que encontrei essa função na net, arrumei o que precisava e uso ela sem problemas.
function ConfereIE(IE, UF: String; ApenasDigitos: Boolean = True): Boolean; const MASCARAS_: String = ' NNNNNNNNX- NNNNNNNNNNNXY- NNNNNNNNNNX-NNNNNNNNNNNNNX- NNNNNNYX-' + ' NNNNNNNNXY- NNNNNNNNNX- NNNNNNNNXNNY- NNNNNNNNXNNN- NNNNNNNXY'; PESOS_: String = 'GFEDCJIHGFEDCA-FEDCJIHGFEDCAA-GFEDCJIHGFEDAC-AAAAAAAAGFEDCA-AAAAABCDEFGHIA-' + 'AAAJIAAHGFEDCA-FEDCBJIHGFEDCA-IHGFEDCHGFEDCA-HGFEDCHGFEDCAA-ABCBBCBCBCBCAA-ADCLKJIHGFEDCA-' + 'AABDEFGHIKAAAA-AADCKJIHGFEDCA-AAAAAJIHGFEDCA-AAAAAIHGFEDCAA-AAAAAJIHGFEDCA-AAAAKJIHGFEDCA-'; PESO_: String = 'ABAAAAABBABAAAAAAJAAIGAHAADAEALLAFNOQ!A!!!!!CC!A!!!!!!K!!H!!!!!!!!!M!!!!P!'; ALFA_: String = 'ABCDEFGHIJKLMNOPQRS'; ROTINAS_: String = 'EE011EEEEEEEEEEEE2EEEEEE0EEEDEDDEEEE0!E!!!!!EE!E!!!!!!E!!E!!!!!!!!!D!!!!E!'; MODULOS_: String = '99999998999999999899999999997999999990900000890900000090090000000009000090'; INICIO_ : String = '0020000AB000111X2X11X11X2XXX2XXXX2XX2114333XXXX7XCC2X8X56X89X0XXX4XXXX9XX0'; MASCARA_: String = 'ABAAAAAEEABAAAACABAAFDAEAGADAAHIACAJG'; FATORES_: String = '0000100000001000000001000011000000000'; ESTADOS_: String = 'ACACALAPAPAPAMBABACEDFESGOGOMAMTMSMGPAPBPRPEPIRJRNRSRORORRSCSPSPSET0TOPERN'; var c1, c2, alternativa, inicio, posicao, erros, fator, modulo, soma1, soma2, valor, digito: Smallint; mascara, inscricao, a1, a2, peso, rotina: String; begin UF := trim(uppercase(UF)); IE := trim(uppercase(IE)); result := ((IE = 'ISENTO') or (IE = 'EM ANDAMENTO') or ((UF = 'EX') and ((IE = '') or (IE = '00000000000000')))); posicao := 0; while not result and (posicao < 37) and (IE <> '') do begin inc(posicao); if (copy(ESTADOS_, posicao * 2 - 1, 2)) <> UF then continue; inscricao := ''; for C1 := 1 to 30 do if pos(copy(IE, C1, 1), '0123456789') <> 0 then inscricao := inscricao + copy(IE, C1, 1); mascara := copy(MASCARAS_, pos(copy(MASCARA_, posicao, 1), ALFA_) * 15 - 14, 14); while length(inscricao) < length(trim(mascara)) do inscricao := '0' + inscricao; if length(inscricao) <> length(trim(mascara)) then continue; inscricao := copy('00000000000000' + inscricao, length(inscricao) + 1, 14); erros := 0; alternativa := 0; while alternativa < 2 do begin inc(alternativa); inicio := posicao + (alternativa * 37) - 37; peso := copy(PESO_, inicio, 1); if peso = '!' then continue; a1 := copy(INICIO_, inicio, 1); a2 := copy(copy(inscricao, 15 - length(trim(mascara)), length(trim(mascara))), alternativa, 1); if not ApenasDigitos and (((pos(a1, 'ABCX') = 0) and (a1 <> a2)) or ((pos(a1, 'ABCX') <> 0) and (pos(a2, copy('0123458888-6799999999-0155555555-0123456789', (pos(a1, 'ABCX') * 11 - 10), 10)) = 0))) then erros := 1; soma1 := 0; soma2 := 0; for C2 := 1 to 14 do begin valor := StrToInt(copy(inscricao, C2, 1)) * (pos(copy(copy(PESOS_, (pos(peso, ALFA_) * 15 - 14), 14), C2, 1), ALFA_) - 1); soma1 := soma1 + valor; if valor > 9 then valor := valor - 9; soma2 := soma2 + valor; end; rotina := copy(ROTINAS_, inicio, 1); modulo := StrToInt(copy(MODULOS_, inicio, 1)) + 2; fator := StrToInt(copy(FATORES_, posicao, 1)); if pos(rotina, 'A22') <> 0 then soma1 := soma2; if pos(rotina, 'B00') <> 0 then soma1 := soma1 * 10; if pos(rotina, 'C11') <> 0 then soma1 := soma1 + (5 + 4 * fator); if pos(rotina, 'D00') <> 0 then digito := soma1 mod modulo; if pos(rotina, 'E12') <> 0 then digito := modulo - (soma1 mod modulo); if digito = 10 then digito := 0; if digito = 11 then digito := fator; if (copy(inscricao, pos(copy('XY', alternativa, 1), mascara), 1) <> IntToStr(digito)) then erros := 1; end; result := erros = 0; end; end; Berdam escreveu: > Olá pessoal, venho solicitar ajuda principalmente do pessoal do RS. > > Tenho o seguinte IE 4800001926, que quando cadastro no sistema, acusa que o > mesmo é inválido > > Tenho o seguinte código para validação, reparem na linha em negrito ou aquela > q tem o nr 467. A validação testa se os primeiros 3 números são maior ou > igual a 1 e menor igual a 467. > > Porém o início do meu IE é 480, dai ele não entra no if. > > Verifiquei no próprios site do sefaz que existe mesmo essa validação, será > que meu código está desatualizado ?? > > Gostaria da ajuda de vcs para resolver isso > > function ChkIERS(const ie: string): Boolean; // 999.999999-9 > var > b, i, soma: Integer; > nro: array[1..10] of byte; > dig: SmallInt; > begin > Result :=false; > if (length(ie) <> 10) then > exit; > if not IsNumero(ie) then > exit; > i :=StrToInt(copy(ie, 1, 3)); > if (i >= 1) and (i <= 467) then //i = 480, > begin > for i :=1 to 10 do > nro[i] :=CharToInt(ie[i]); > b :=2; > soma :=0; > for i :=1 to 09 do > begin > inc(soma, nro[i] * b); > dec(b); > if b = 1 then > b :=9; > end; > dig :=11 - (soma mod 11); > if (dig >= 10) then > dig :=0; > Result :=(dig = nro[10]); > end; > end; > > > > > ____________________________________________________________________________________ > Veja quais são os assuntos do momento no Yahoo! +Buscados > http://br.maisbuscados.yahoo.com > > [As partes desta mensagem que não continham texto foram removidas] > > > > ------------------------------------ > >