Ir para conteúdo
  • Cadastre-se

NFCom - Problema Delphi Linux FastStringReplace


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

Recommended Posts

Postado

Bom dia,

Estou passando por um problema ao emitir NFCom utilizando Delphi + Linux.

Ao enviar a nota fiscal retorna exceção: Range check error. 

Mais exatamente na unit ACBrNFComWebServices.pas na função RemoverDeclaracaoXML.
Quando executa a função FastStringReplace ocorre a exceção.

Fiz a seguinte alteração de FastStringReplace para Result.Replace e funcionou.
 

function RemoverDeclaracaoXML(const AXML: String; aTodas: Boolean = False): String;
var
  DeclaracaoXML: String;
begin
  DeclaracaoXML := ObtemDeclaracaoXML(AXML);

  if DeclaracaoXML <> '' then
  begin
    if aTodas then
      Result:= Result.Replace(DeclaracaoXML, '', [rfReplaceAll])
      //Result := FastStringReplace(AXML, DeclaracaoXML, '', [rfReplaceAll])
    else
      Result:= Result.Replace(DeclaracaoXML, '', [])
      //Result := FastStringReplace(AXML, DeclaracaoXML, '', []);
  end
  else
    Result := AXML;
end;


Minhas perguntas:
- Trocar FastStringReplace por Result.Replace é seguro?
- Seria um problema a ser avaliado?

IDE: Delphi 13 + September Path + October Patch
Linux: Debian 12

 

Erros.png

  • Consultores
Postado

é que se lembrar essa função não funciona em outros delphi

creio que só no 13 ou alguns do 10 pra cima

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Fundadores
Postado
2 horas atrás, daniloacr disse:

Trocar FastStringReplace por Result.Replace é seguro?

É seguro, mas pode perder performance e ser difícil de manter do seu lado a cada Update do repositório 

Qual a exata linha que ocorre 

De bate pronto, voce pode desativar a verificação de Range por Diretiva de Compilação 

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Postado

Complementando...

Esse mesmo problema ocorreu ao alimentar o componente, ao definir as observações da NFCom.
Percebi que isso acontece quando há alguns tipos de caracteres especiais.

infAdic.infCpl:= 'TESTE n° ABC';

o caracter º está causando o problema.

 

Caracter.png

Postado
1 hora atrás, Daniel Simoes disse:

NativeStringToANSI

Tentei NativeStringToANSI porem o erro persiste.
Achei a explicação do chatGPT interessante.


 

chat1.png

chat2.png

chat3.png

Postado

A solução que encontrei para resolver o meu problema, foi criar uma unit como o mesmo nome StrUtilsEx, sendo assim sempre irá olhar para a unit local.
Dessa forma não terei preocupação com as atualizações do Trunk
 

unit StrUtilsEx;

interface

uses
  SysUtils;

function FastStringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;

implementation

function FastStringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;
begin
  Result:= S.Replace(OldPattern, NewPattern, Flags);
end;

end.

 

  • Fundadores
Postado

Por favor teste com a Unit em anexo...

Eu apenas adicionei uma Zona livre da verificação de Range Check

{$IFOPT R+}
  {$DEFINE RANGEON}
  {$R-}
{$ELSE}
  {$UNDEF RANGEON}
{$ENDIF}
  lenSub := PLongInt(PByte(pSub) - 4)^ - 1; // <- Modified
  len := PLongInt(PByte(p) - 4)^; // <- Modified
{$IFDEF RANGEON}
  {$R+}
  {$UNDEF RANGEON}
{$ENDIF}

 

@EMBarbosa, tem alguma outra sugestão ?

 

StrUtilsEx.pas

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

  • Consultores
Postado
12 minutos atrás, Daniel Simoes disse:

Por favor teste com a Unit em anexo...

Eu apenas adicionei uma Zona livre da verificação de Range Check

{$IFOPT R+}
  {$DEFINE RANGEON}
  {$R-}
{$ELSE}
  {$UNDEF RANGEON}
{$ENDIF}
  lenSub := PLongInt(PByte(pSub) - 4)^ - 1; // <- Modified
  len := PLongInt(PByte(p) - 4)^; // <- Modified
{$IFDEF RANGEON}
  {$R+}
  {$UNDEF RANGEON}
{$ENDIF}

 

@EMBarbosa, tem alguma outra sugestão ?

Me parece fazer sentido a correção. Na verdade o FastStringReplace foi implementado pelo Alexandre Machado e tem vários testes unitários e de performance.

Seria interessante verificar novamente se temos alterações locais e, em caso positivo, os motivos.

https://bitbucket.org/alex7691/delphi/src/master/FastStringReplace/

Não consegui reproduzir no momento, posso tentar verificar depois.

[]'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.
  • Fundadores
  • Solution
Postado

Pelo que comparei com os fontes atuais do Alexandre... temos alguns ajustes, para compilações em várias plataformas e IDEs, que ainda não constam no fonte original dele...  

Commit [r42973]

 

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

  • Este tópico foi criado há 197 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.