Ir para conteúdo
  • Cadastre-se

dev botao

Problema com a função UpdateCrc32 - Range check error


Ver Solução Respondido por Daniel Simoes,
  • Este tópico foi criado há 1757 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado

Boa tarde pessoal, 

    Estou recebendo o erro de Range check error, ao executar o método:

ACBrNFe1.DistribuicaoDFePorChaveNFe(0,'65212607000180', '31171110705501000470550010003151641421771140');

    Retornando a seguinte mensagem:

Não foi possivel importar o XML, tente novamente em alguns segundos!
WebService Distribuição de DFe:
- Inativo ou Inoperante tente novamente.
Range check error

    Efetuando o debug da função, cheguei que o problema ocorre na função:

function UpdateCrc32 (function crc32(thecrc: cardinal; S: TStream; len: Cardinal): Cardinal;

    Que está implementada na unit GZIPUtils na linha 395 que contêm o comando:

Result := UpdateCrc32(b, Result);

    Debugando passo-a-passo para um melhor entendimento teremos:

ACBrNFe            -> function TACBrNFe.DistribuicaoDFePorChaveNFe(AcUFAutor: integer; ACNPJCPF, AchNFe: String): Boolean;
ACBrNFe            -> function TACBrNFe.Distribuicao(AcUFAutor: integer; ACNPJCPF, AultNSU, ANSU,  chNFe: String): Boolean; (Linha 909)
ACBrDFeWebService  -> function TDFeWebService.Executar: Boolean; (Linha 187)
ACBrNFeWebServices -> function TNFeEnvEvento.TratarResposta: Boolean; (Linha 2989)
pcnRetDistDFeInt   -> function TRetEventoNFe.LerXml: Boolean; (Linha 435)
ACBrCompress       -> function DeCompress(const ABinaryString: AnsiString): AnsiString; (Linha 141)
ACBrCompress       -> function DeCompress(AStream: TStream): AnsiString; (Linha 154)
ACBrCompress       -> function DeCompress(inStream, outStream: TStream): Boolean; (Linha 169)
GZIPUtils          -> function unzipStream(inStream, outStream: TStream): boolean; (Linha 271) 
GZIPUtils          -> function crc32(thecrc: cardinal; S: TStream; len: Cardinal): Cardinal; (Linha 395) => Erro na função UpdateCrc32(b, Result);

    Retornando:

Valor de "b"      = 60
Valor de "Result" = 4294967295
Msg de erro:      "Range check error"

    Efetuei o teste com outras chaves,  utilizando outros CNPJ, mas o erro persiste.

    Atualizei o source da ACBr pelo SVN hoje, mas o problema persiste.

    Gostaria da opinião de vocês sobre este assunto. Houve alguma alteração de propriedade ou atualização de DLL que impactaria neste erro?

    Desde já agradeço a opinião de vocês.

  • Membros Pro
Postado

Estranho que é uma implementação que não foi alterada.

O componente ACBrNFe teria algum timeout que teríamos que setar para este caso?

Nos clientes funciona normal. Estamos fazendo uma bateria de testes no sistema e fomos validar esta função e recebemos o erro acima em todos os computadores que testamos.

  • Membros Pro
Postado

Fizemos um teste aqui, da seguinte maneira, acrescentamos na unit ACBRNFeWebServices, na function TDistribuicaoDFe.TratarResposta, comando para salvar em arquivo a variável FPRetWS antes de executar FretDistDFeInt.LerXml, foi retornado o arquivo em anexo(teste2.xml).

A princípio o arquivo está completo.

teste2.xml

  • Membros Pro
Postado (editado)

Delphi XE2 Update 4

A princípio, efetuando um debug aqui, parece problema do tipo de encoding que está sendo utilizado, ANSI e UTF8.

 

Editado por Intelliware
  • Membros Pro
Postado

Juliomar, boa tarde.

No demo da ACBr, funciona normal. Com as mesmas configurações, no nosso projeto não está funcionando. Estamos tentando verificar o que pode estar de diferente em ambos os projetos. Já validamos os pacotes instalados e aparentemente está tudo normal. Mas no projeto nosso continua não funcionando. Bem estranho.

  • Moderadores
Postado
7 minutos atrás, Intelliware disse:

Juliomar, boa tarde.

No demo da ACBr, funciona normal. Com as mesmas configurações, no nosso projeto não está funcionando. Estamos tentando verificar o que pode estar de diferente em ambos os projetos. Já validamos os pacotes instalados e aparentemente está tudo normal. Mas no projeto nosso continua não funcionando. Bem estranho.

Opa agora a noticia foi boa!

então basta ter a mesma situação que irá funcionar. 

Obrigado pelo retorno.

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

  • Membros Pro
Postado

Bom dia Juliomar,

Ontem, após vários testes e comparações, descobrimos o seguinte:

Se na propriedade do projeto estiver marcada a opção:

Delphi Compiler -> Compiling -> Runtime errors -> Range checking -> True

configuracao-projeto.thumb.jpg.f00eb63aff80668156698efbbde80e6b.jpg

Na unit GZIPUtils.pas, na função:

function crc32(thecrc: cardinal; S: TStream; len: Cardinal): Cardinal;

Na linha 395:

Result := UpdateCrc32(b, Result);

Começamos a receber o erro de Range check error.

Pelo que verificamos em debug, o escopo do Cardinal é de 0..4294967295, enquanto que a função UpdateCrc32 retorna um tipo Integer que pode ser de -2147483648..2147483647. Logo, ao retornar um valor negativo ou um valor além do escopo do tipo da variável, vai ocasionar a exceção descrita.

O demo da ACBr e o outro projeto nosso que não deu erro estava False na propriedade acima. No projeto que apresentava o problema setamos para False, efetuamos um Clean e um Build e voltou a ter o mesmo comportamento dos outros projetos. 

Com isto, resolvemos o problema. Estamos te passando o que concluímos para uma avaliação.

Desde já agradeço.

 

  • Curtir 2
  • 2 anos depois...
  • Consultores
Postado
Em 07/01/2020 at 17:03, LUCAS CARDOSO DA SILVA disse:

Dessa forma todas as vezes que o ACBR for atualizado tem que refazer esta alteração na unit do gZip?

Acho que você não notou que o tópico é de mais de 2 anos atrás. Não temos ciência dessa situação hoje.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Consultores
Postado
2 horas atrás, LUCAS CARDOSO DA SILVA disse:

Notei, porém o problema continua.

Se tiver alguma sugestão de correção, fique a vontade para anexar o arquivo alterado para análise.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Postado
Em 13/01/2020 at 10:38, LUCAS CARDOSO DA SILVA disse:

Notei, porém o problema continua.

Lucas, ainda hoje em 2020 deparei com esse erro, isso porque quis enfeitar pavão e carregar xml de nf de compra do cliente...

O que vc fez para resolver?

Detalhe: Tem retorno da chamada do webservice.

Postado

Olá Antonio, tem de promover esta alteração

No nosso projeto optamos por modificar a unit do GZIPUtils com o seguinte trecho de código:

 

    {$R-} // disable range checking
      Result := UpdateCrc32(b, Result);
    {$R+} // enable range checking

 

aqui funcionou, porém sempre que atualiza o acbr tem que refezar

  • Curtir 1
Postado
3 horas atrás, LUCAS CARDOSO DA SILVA disse:

Olá Antonio, tem de promover esta alteração

No nosso projeto optamos por modificar a unit do GZIPUtils com o seguinte trecho de código:

 

    {$R-} // disable range checking
      Result := UpdateCrc32(b, Result);
    {$R+} // enable range checking

 

aqui funcionou, porém sempre que atualiza o acbr tem que refezar

Crendeuspai.. não tem alternativa... bora lá..

 

Postado (editado)
Em 29/01/2020 at 10:03, Daniel Simoes disse:

Commit [r18943]

tem uma coisa ainda nessa unit "synautil": que dá um hint: não sei se é descuido de quem fez, ou a primeira atribuição estava ali antes para algo e não mais precisa. O primeiro x é inutil.

No build all que detecta esse hint...

veja a imagem:

image.thumb.png.0c7dc859aca19f83a86ecb319c73854d.png

Editado por Antonio Gomes
asynautil
Postado
22 horas atrás, Daniel Simoes disse:

A atribuição é necessária...veja o IF logo abaixo...

o if sim, linha 1848 desnecessário mesmo... pois o x vai receber novamente valor na linha 1853... mas ok... não entendi. fecha o topico.

  • Este tópico foi criado há 1757 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.