Ir para conteúdo
  • Cadastre-se

dev botao

Espaço Duplo não tratado pela função function ReverterFiltroTextoXML


  • Este tópico foi criado há 3293 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Moderadores

Ao fazer uma importação dos dados de produtos para  uma tabela de banco de dados.

Num devido item na descrição do produto, segue :

Texto.thumb.png.cc706fa3964972d5efd76b0e

me causando erro  no tamanho da informação ( 62 caracteres )

SalvarExemplo.thumb.png.71e4e427b93d0e13

No xml
RPFX 0100 0 FLEXIVEL FREIO HIDR DIANT DIR 93248636 (FH02310)
No banco
RPFX 0100 0 FLEXIVEL FREIO HIDR  DIANT DIR  93248636 (FH02310)

Conclusão no texto do xml existe um espaço duplo  que não foi tratado pela função

Na Figura  Exemplo para voltar para 60 caracteres removendo os espaços duplos

  aTexto := StringReplace(aTexto, '  '    , ' ' , [rfReplaceAll]);

 

Alguma dica para solucionar  e ser implantada na função ? 

 

 

 

 

Equipe ACBr Henrique Leonardo
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Tecnólogo em processamento de dados

E-mail [email protected] - Skype : hleorj

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Não compreendi muito bem o problema... você diz, que mesmo após a conversão, a Descrição ainda mantém um espaço duplo ?

Se SIM... essa linha poderia ser substituída por:

aTexto := RemoverEspacosDuplos(aTexto);

 

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.

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Ficar isto padrão ????

function ReverterFiltroTextoXML(aTexto: AnsiString): AnsiString;
var p1,p2:Integer;
    vHex,vStr:String;
begin
  aTexto := StringReplace(aTexto, '&' , '&' , [rfReplaceAll]);
  aTexto := StringReplace(aTexto, '&lt;'  , '<' , [rfReplaceAll]);
  aTexto := StringReplace(aTexto, '&gt;'  , '>' , [rfReplaceAll]);
  aTexto := StringReplace(aTexto, '&quot;', '"' , [rfReplaceAll]);
  aTexto := StringReplace(aTexto, '&#39;' , #39 , [rfReplaceAll]);
  aTexto := RemoverEspacosDuplos(aTexto);
 <<<==== nova linha ++
  p1     := Pos('&#x',aTexto);
  while p1>0 do
  begin
    for p2:=p1 to Length(aTexto) do
      if aTexto[p2]=';' then
        break;
    vHex:=Copy(aTexto,p1,p2-p1+1);
    vStr:=StringReplace(vHex,'&#x','',[rfReplaceAll]);
    vStr:=StringReplace(vStr,';','',[rfReplaceAll]);
    vStr:=HexToAscii(vStr);
    aTexto:=StringReplace(aTexto,vHex,vStr,[rfReplaceAll]);
    p1:=Pos('&#x',aTexto);
  end;
  result := Trim(aTexto);
end;

daria problema em algum momento, pois qualquer string com Espaço duplo seria removida.

Equipe ACBr Henrique Leonardo
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Tecnólogo em processamento de dados

E-mail [email protected] - Skype : hleorj

Link para o comentário
Compartilhar em outros sites

  • Fundadores

A ideia não é transformar todos os espaços duplos em simples ??

De uma olhada nos fontes do método indicado, na ACBrUtil.pas

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.

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Sim ela faz isto. Mas o problema é o espaço duplo existente que não aparece no XML. Se conta 60 caracteres e ao  chegar no ponto parado apresentar 62 caracteres.  Diferente da descrição original. 

Farei um debug mas detalhado.  De cada passo do ler XML.

Equipe ACBr Henrique Leonardo
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Tecnólogo em processamento de dados

E-mail [email protected] - Skype : hleorj

Link para o comentário
Compartilhar em outros sites

  • Moderadores

A ideia não é transformar todos os espaços duplos em simples ??

De uma olhada nos fontes do método indicado, na ACBrUtil.pas

Daniel , o problema começa aqui

function TNotasFiscais.LoadFromFile(CaminhoArquivo: String;
  AGerarNFe: Boolean = True): Boolean;

 

Equipe ACBr Henrique Leonardo
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Tecnólogo em processamento de dados

E-mail [email protected] - Skype : hleorj

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Usando o Demo Acbr.                                                    demoAcbr.thumb.png.75db260bd42600a259798

Usando Demo Modificado no laboratório móvel :          LaboratorioHenrique.thumb.png.f8ccc86768

 

A ideia não é transformar todos os espaços duplos em simples ??

De uma olhada nos fontes do método indicado, na ACBrUtil.pas

Checando alguns outros xml's...:(

Editado por hleorj
Equipe ACBr Henrique Leonardo
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Tecnólogo em processamento de dados

E-mail [email protected] - Skype : hleorj

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Tive que criar uma função para  remove espaços duplos para o meu caso, pois os dados que estão no xml.

Os dados que estão no banco foram adicionados  através de importação  , onde pode haver :

Tab -> chr( 9 )  ou

Line Feed -> chr( 10 ) ou

Carriage return-> chr( 12 ) ou

Espaços duplos -> chr( 32 )+chr( 32 ).

const

  NativeLineFeed       = Char(#10);
  NativeCarriageReturn = Char(#13);

Function RemoveDuplos( Const s : AnsiString ) : AnsiString;
  procedure SkipBlanks(var S: AnsiString; StringLength: Cardinal; var ReadIndex: Cardinal);
  begin
    while ReadIndex < StringLength do
    begin
      if S[ReadIndex] = NativeCarriageReturn then
        S[ReadIndex] := NativeLineFeed
      else
      if S[ReadIndex + 1] = NativeCarriageReturn then
        S[ReadIndex + 1] := NativeLineFeed;
      if (S[ReadIndex] < #33) and (S[ReadIndex] = S[ReadIndex + 1]) then
      Begin
        Inc(ReadIndex)
      End
      else
        exit;
    end;
  end;
var
  StringLength, ReadIndex, WriteIndex: Cardinal;
begin
  Result        := S;
  ReadIndex     := 1;
  WriteIndex    := 1;
  StringLength  := Length(Result);
  while ReadIndex <= StringLength do
  begin
    SkipBlanks( Result , StringLength, ReadIndex);
    Result[WriteIndex] := Result[ReadIndex];
    Inc(WriteIndex);
    Inc(ReadIndex);
  end;
  SetLength(Result, WriteIndex - 1);
end;

Caso tenham este problema na importação, segue trecho de minha implementação :

        with Det.Items[I] do
        begin
          Nota_it_ent.Chave         := 0;
          Nota_it_ent.situacao      := '';
          Fornecedor.codforn        := Prod.cProd;
          Fornecedor.descricao      := copy( RemoveDuplos( Prod.xProd) ,1,60);
          if Fornecedor.ManterTrans then
            Estoque.ObterProduto( Fornecedor.codigo )
          else
            Estoque.ObterProduto( Prod.cProd);

Ps : Implementar a função RemoveDuplos no componente requer mas testes.

                           ( AVISADOS ? )

 

 

 

 

Equipe ACBr Henrique Leonardo
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Tecnólogo em processamento de dados

E-mail [email protected] - Skype : hleorj

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3293 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.

The popup will be closed in 10 segundos...