Ir para conteúdo
  • Cadastre-se

dev botao

ACBrOFX - Erro ao ler arquivo OFX exportado do Santander: "Invalid argument to date enconde"


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

Recommended Posts

Olá pessoal, tudo bem com vocês?

Estou utilizando o componente ACBrOFX para ler um arquivo OFX do Santander e estou recebendo este erro: "Invalid argument to date encode."

O arquivo realmente contém datas em um formato estranho. Por exemplo:

<DTSTART>202310593339[-3:GMT]

Alguém reconhece esse formato de data?

O erro acontece também no exemplo do ACBr para o componente ACBrOFX ao clicar em "Ler Arquivo" depois de selecionar o arquivo OFX que deixo em anexo.

image.thumb.png.a86827b2147ce61649e5f13570e03917.png

Qualquer informação que ajude a solucionar o problema será bem vinda :)

Santander.ofx

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • Membros Pro

Oi Jhoni !

Eu disse UTF mas queria dizer UTC.  Me parece que a data vem com AAAAMMxxxxxx onde xxxxxx são minutos

divide por 3600 e depois por 24 subtrai a diferença do uso e voce tem o dia.

Alterei o ACBROfx.pas e testei com o seu arquivo. Parece que funcionou bem voltou a data do de 03/10/2023

inclui a função abaixo no metodo Import para converter as datas

Não subi a unit porque não tenho certeza da minha análise sobre xxxxxx serem minutos.

========================

function TACBrOFX.Import: Boolean;
var

  ..............
  function GetData(Texto:string): string;
  var Ano,Mes,Dia: word;
      UTCDia,Fuso:extended;
      umDia: TdateTime;
     function IsUTC(var Fuso:extended): boolean;
     var inicio,fim: integer;
     begin
       result := Pos('GMT',InfLine(sLine)) > 0;
       if result then
       begin
         inicio := Pos('[',InfLine(sLine));
         fim := Pos(':',InfLine(sLine));
         Fuso := StrToInt(Copy(InfLine(sLine), inicio + 1, length(InfLine(sLine)) - (fim +1) -1 ));
       end
       else
        Fuso := 0;
     end;

  begin     Ano := StrToInt(Copy(InfLine(sLine), 1, 4));
     Mes := StrToInt(Copy(InfLine(sLine), 5, 2));
     if IsUTC(Fuso) then
       Dia := Trunc(((StrToInt(Copy(InfLine(sLine), 7, 6)) div 3600) div 24 ) + Fuso)
     else
       Dia := StrToInt(Copy(InfLine(sLine), 7, 2));
     UmDia := EncodeDate(Ano,Mes,Dia);
     result := DateToStr(UmDia);
  end;

begin; 
   .............
   .............
  
     // Date Start
        if FindString('<DTSTART>', sLine) then
        begin
          if Trim(sLine) <> '' then
            DateStart := GetData(sLine);
        end;


        // Date End
        if FindString('<DTEND>', sLine) then
        begin
          if Trim(sLine) <> '' then
            DateEnd := GetData(sLine);
        end;

ACBrOFX.pas

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...

Boa tarde @softwareamigo

Não estou seguro que seja esse formato que você mencionou, pois se não me engano esse valor "202310593339" era para ser o dia 10/10/2023 no extrato e não o dia 3/10/2023.

Vou ver se consigo um arquivo OFX do extrato com mais algumas datas, bem como o extrato em um formato que pode ser facilmente lido por humanos para comparação (vou ver se consigo um PDF).

Também li as especificações e os Schemas no site oficial da Financial Data Exchange (About-FDX - OFX Work Group (financialdataexchange.org)), mas não encontrei um formato de data e hora que fosse correspondente.

Estou achando que o Santander está com alguma falha ou está usando algum padrão próprio muito específico para as datas nesse arquivo.

Sobre o seu algoritmo, percebi que você divide xxxxxx por 3600 e por 24 o que teoricamente lhe dá um número de dias e depois subtrai por um número de horas. Nesse caso, acho que é inconsistente subtrair as três horas de UTC do numero de dias obtido, pois são unidades de medida diferentes (horas e dias).

Talvez o mais correto seria dividir xxxxxx por 3600 para obter um numero de horas (hhhh = xxxxxx div 3600), subtrair de hhhh as 3 horas do UTC (uuuu = hhhhh - 3) e por fim dividir esse valor por 24 (dd = uuuu div 24) obtendo em dd o número de dias.

No entanto, mesmo assim, a data obtida seria 6/10/2023, que acho que não é a data esperada, se não me engano, a data esperada deveria ser 10/10/2023 (vou confirmar quando possível para ter certeza).

Muito obrigado :)

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Bom dia!

Estava com problemas com a importação de arquivos do Santander, com o ajuste proposto acima.

Após analisar muitos arquivos, acabei percebendo que os arquivos que meus clientes estavam baixando do Santander não estava com um fator que indicaria o dia, mas sim, o dia e a hora.
 

Assim, fiz um ajuste para verificar se os dígitos após o ano/mês possui mais que 6 caracteres, considero que o campo não seja uma data UTC.

 

Segue o ajuste para validação.

ACBrOFX.pas

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Consultores
55 minutos atrás, Innovae Brasil Engenharia disse:

Segue o ajuste para validação.

Bom dia,

Criada a TK-4712 para avaliação.

Obrigado pela contribuição.

Consultor SAC ACBr

Alexandre de Paula
Ajude o Projeto ACBr crescer - Assine o SAC                    

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  ícone Discórdia Discord   

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

 

 

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • Consultores
  • Solution

Por favor atualize seus fontes, pelo SVN do ACBr... 

Já subimos para o nosso repositório de fontes, modificações que podem corrigir algum dos itens referentes a esse tópico...

Por favor atualize seus fontes, faça testes, e se possível comente em uma nova resposta, se o problema foi resolvido...

Dúvidas, sobre o uso do SVN ?  Clique aqui e veja um vídeo

Consultor SAC ACBr

Victor H Gonzales - Pandaaa
Ajude o Projeto ACBr crescer - Assine o SAC

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

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 !!

"Aprender é a única coisa que a mente nunca se cansa, nunca tem medo e nunca se arrepende” - Leonardo da Vinci

"Ter sucesso é falhar repetidamente, mas sem perder o entusiasmo"

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
  • Consultores

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

Consultor SAC ACBr

Diego Folieni
Ajude o Projeto ACBr crescer - Assine o SAC

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

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 !!

Link para o comentário
Compartilhar em outros sites

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