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]
>
>
>
> ------------------------------------
>
>   

Responder a