Jump to content

LANÇAMENTO
Curso Completo - Dominando o ACBrMonitor

Conheça o Curso

Balança SM100 performance surpreendente

Tecnologia Japonesa   Teclado e Visor resistentes a água
Consumo inteligente de etiquetas   Baixo custo de manutenção
Comunicação Ethernet e WIFI independentes

Saiba mais

Impressora de Etiquetas ELGIN - L42 PRO

Protocolos PPLA, PPLB, ZPL, EPL (automático)
Porta USB padrão Opcionais: Ethernet, Serial, Paralela
Sensor de Etiquetas Móvel Garantia de 18 meses

Saiba mais

Intelliware

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

Recommended Posts

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Delphi XE2 Update 4

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

 

Edited by Intelliware

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
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
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

skype: juliomar
telegram: juliomar
http://www.juliomarmarchetti.com.br
Embarcadero MVP

Share this post


Link to post
Share on other sites

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.

 

  • Like 2

Share this post


Link to post
Share on other sites
Em 14/11/2017 at 08:23, Intelliware disse:

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.

 

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

Pois desabilitar o range checking para nós não é a melhor opção, em virtude de alguns problemas passarem despercebidos.

Fonte: https://stackoverflow.com/questions/4997911/switch-off-delphi-range-checking-for-a-small-portion-of-code-only

 

  • Thanks 1

Share this post


Link to post
Share on other sites
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
Ajude o Projeto ACBr crescer - Assine o SAC

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.

Share this post


Link to post
Share on other sites
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
Ajude o Projeto ACBr crescer - Assine o SAC

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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...