Ir para conteúdo
  • Cadastre-se

dev botao

Falha ao carregar o número da versão do XML - CF-e


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

Recommended Posts

Postado

Olá pessoal, 
Eu realizei o download de um XML do SAT,/CF-e no site da receita, ao vincular esse documento no meu sistema percebi que o numero da versão não estava correto.
O problema acontece pelo seguinte motivo, antes os XML's vinham com os atributos da tag nessa ordem versaoversaoSBversaoDadosEnt, Id, exemplo:
 

<infCFe versao="0.07" versaoSB="010200" versaoDadosEnt="0.07" Id="CFe00000000000000000000000000000000000000000000">


Já esse ultimo documento que fiz o download, veio com essa estrutura diferente,  na ordem versaoSBversaoDadosEnt, versao, Id, exemplo:
 

<infCFe versaoSB="010200" versaoDadosEnt="0.07" versao="0.07" Id="CFe00000000000000000000000000000000000000000000">


Percebi que no método rAtributo da unit pcnLeitor,.pas é feito um pos nessa linha procurando pela palavra 'versao', para o primeiro exemplo mostrado funciona, mas para o segundo exemplo não funciona. (Ao invés de retornar o número "0.07" está retornando "010200").
Para corrigir esse problema realizei algumas alterações.

Aqui está o método original sem alterações:

function TLeitor.rAtributo(Atributo: string; Tag: String): variant;
var
  ConteudoTag ,
  Aspas       : String;

  inicio      ,
  inicioTag   ,
  fim         ,
  iPos1       ,
  iPos2       : Integer;

begin
  Result := '';
  Atributo := Trim(Atributo);
  Tag := Trim(Tag);
  inicioTag := pos(Tag, FGrupo);
  inicio := pos(Atributo, FGrupo);

  // se inicioTag > 0 significa que o parâmetro Tag foi informado.
  // se inicioTag > inicio significa que o atributo encontrado não é da Tag informada
  // logo devemos bustar a proxima ocorrecia a partir da posição da Tag.
  if (inicioTag > 0) and (inicioTag > inicio)  then
    inicio := PosEx(Atributo, FGrupo, inicioTag);

  if inicio > 0 then
  begin
    inicio := inicio + Length(Atributo);
    ConteudoTag := trim(copy(FGrupo, inicio, maxInt));

    iPos1 := Pos('"' , ConteudoTag);
    iPos2 := Pos('''', ConteudoTag);

    if iPos1 <> 0 then
      Aspas := '"';

    if (iPos2 <> 0) and ((iPos1 = 0) or (iPos2 < iPos1)) then
      Aspas := '''';

    inicio := pos(Aspas, ConteudoTag) + 1;
    if inicio > 0 then
    begin
      ConteudoTag := trim(copy(ConteudoTag, inicio, maxInt));
      fim := pos(Aspas, ConteudoTag) - 1;
      if fim > 0 then
      begin
        ConteudoTag := copy(ConteudoTag, 1, fim);
        result := ReverterFiltroTextoXML(ConteudoTag)
      end
    end ;
  end ;
end;


E esse é o método com as alterações que eu fiz:

function TLeitor.rAtributo(Atributo: string; Tag: String): variant;
var
  ConteudoTag ,
  Aspas       : String;

  i           ,
  inicio      ,
  inicioTag   ,
  fim         ,
  iPos1       ,
  iPos2       : Integer;

const
  CharValiidacao: Array[0 .. 1] of String = (' ', '=');
  
begin
  Result := '';
  Atributo := Trim(Atributo);
  Tag := Trim(Tag);
  inicioTag := pos(Tag, FGrupo);

  for i := 0 to High(CharValiidacao) do
  begin
    inicio := pos(Atributo+CharValiidacao[i], FGrupo);

    if(inicio > 0)then
      Break;
  end;

  if(inicio = 0)then
    inicio := pos(Atributo, FGrupo);
                                                               
  // se inicioTag > 0 significa que o parâmetro Tag foi informado.
  // se inicioTag > inicio significa que o atributo encontrado não é da Tag informada
  // logo devemos bustar a proxima ocorrecia a partir da posição da Tag.
  if (inicioTag > 0) and (inicioTag > inicio)  then
    inicio := PosEx(Atributo, FGrupo, inicioTag);

  if inicio > 0 then
  begin
    inicio := inicio + Length(Atributo);
    ConteudoTag := trim(copy(FGrupo, inicio, maxInt));

    iPos1 := Pos('"' , ConteudoTag);
    iPos2 := Pos('''', ConteudoTag);

    if iPos1 <> 0 then
      Aspas := '"';

    if (iPos2 <> 0) and ((iPos1 = 0) or (iPos2 < iPos1)) then
      Aspas := '''';

    inicio := pos(Aspas, ConteudoTag) + 1;
    if inicio > 0 then
    begin
      ConteudoTag := trim(copy(ConteudoTag, inicio, maxInt));
      fim := pos(Aspas, ConteudoTag) - 1;
      if fim > 0 then
      begin
        ConteudoTag := copy(ConteudoTag, 1, fim);
        result := ReverterFiltroTextoXML(ConteudoTag)
      end
    end ;
  end ;
end;


Não sei se essa é a melhor forma de corrigir tratar essa situação descrita. 

  • Curtir 1
Postado

Essa alteração está causando falha na leitura do XML da NF-e.

Justamente na função rAtributo (pcnLeitor.pas), o mesmo está retornando zerado e apresentando a exceção: Não encontrei o atributo: Id.

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