Ir para conteúdo
  • Cadastre-se

dev botao

Ajudem-me a entender Teventos


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

Recommended Posts

Postado

estudando os fontes, eu simplesmente não consigo entender as funções derivadas de TEventos.LoadFromString(AXMLString: String): Boolean; (linha 224 de acbrreinfeventos.pas e seguintes)
explico:
qual a função das variáveis N e P já que ambos procuram pela mesma posição com a função "pos('</Reinf>', AXMLString)" ?
cada evento não deveria estar entre as posições de <Reinf> e </Reinf>?
Eu já possuo um gerador de XML, caso eu gere os eventos por essa rotina que não faz parte do tAcbrReinf, seria essa função (TEventos.LoadFromString) que eu devo usar para enviá-los?

  • Consultores
Postado

Bom dia,

Primeiramente, não entendo essa historia de usar o componente pela metade.

Estou pensando sinceramente de quando eu for escrever o próximo componente não inclui as rotinas para gerar o XML e deixar a cargo de cada desenvolvedor.

Gastamos um baita tempo e fazer um componente completo para depois... só quero carregar o XML que a minha aplicação gera e usar o componente para assinar e enviar.

  • Curtir 1
  • Obrigado 1
  • Confuso 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Oi Italo, na verdade eu ainda estou estudando os componentes, não exatamente usando-os ainda.
E eu sou muito fã do ACBr, mas também sou muito fã de projetos OpenSource porque permitem à você adaptar, melhorar, personalizar. Acho que nada não possa ser melhorado e a rigidez de um componente pode não ser a melhor forma de evoluir.

Acho importante ter todos os recursos, mas nem sempre eu preciso de um caminhão para ir à panificadora para trazer apenas um pãozinho...

Minha dificuldade está em entender o que a função LoadFromString deveria fazer. pelo nome parece-me que deveria ler um evento baseado num XML já gerado anteriormente, mas a rotina, ao estudá-la me pareceu sem sentido, só isso!

A falta de documentação ou de comentários nos fontes dificulta muito esse tipo de estudo.

Peço ajuda para entender porque quero evitar suposições erradas, não gostaria de presumir que essa função era pra fazer algo que na verdade faz outra e, ao final, chegar a conclusão de que o componente era ruim ou bugado se na verdade ele é ótimo e eu apenas não soubia como  usá-lo durante minha avaliação.

Peço desculpas se não consegui me expressar de forma adequada da primeira vez. e agradeço desde já a sua pronta atenção.

Sei que não é fácil responder a todos, mas eu ainda estou confuso com a rotina:  Ela serve para carregar os XML já gerados anteriormente? as variáveis N e P na função realmente estão corretas?

Postado

O método de leitura do Xml atualmente lê apenas o evento e salva em uma lista para enviar, o xml já tem que estar assinado e pronto para o envio.
Este método não preenche a lista de eventos e não adiciona eventos na lista, ou seja não é possível carregar o seu xml e assinar.
Mas se você quiser ajudar a fazer os 40 métodos de leitura de Xml ficaremos muito grato, lembrando que o mesmo tem que ser compatível com o Delphi(D7+) e o Lazaurs.

  • Confuso 1

 

Postado

Oi Rafael, não vou poder ajudar enquanto não entender a metodologia. Como você pode ver, a falta de documentação e os fontes pouco comentados me impedem de saber o que vocês já têm pronto.
Minha dúvida específica era em relação à função LoadFromString presente em Teventos e TloteEventos, que ainda não foi solucionada: não sei qual o objetivo dessa função. só isso! ela me parece confusa: veja os fontes, as variáveis N e P não fazem sentido. meu objetivo não é usar o reinf, e sim estudar os fontes.

Escolhi o Reinf justamente por ser uma tecnologia que precisa ser implantada agora e estou avaliando como ocorre todo o processo de divulgação dos fontes, correção dos eventuais bugs, mas a dúvida permanece: o que é essa função? Ela é usada em TLoteEventos.CarregaXMLEventos, mas a função por si só não faz sentido, especialmente em relação à busca da posição por '</Reinf> ' nas variáveis N e P. e um IF que, se considerarmos que N e P sempre terão o mesmo valor.
veja N é atribuido antes do loop while e no seu final, e P é atribuído dentro do loop while já no seu início.

Achou confuso? pois é!... eu também, por isso que pergunto!

  • Moderadores
Postado
14 minutos atrás, bylaardt disse:

Como você pode ver, a falta de documentação e os fontes pouco comentados me impedem de saber o que vocês já têm pronto.

Discordo. quer melhor documentação que os fontes?

fontes que tem comentários é por serem mal feitos.

Como diria os outros esvazie a mente e abre os fontes novamente no bloco de notas e leia parte por parte.

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Postado

Oi Juliomar, pronto, esvaziei a mente e me deparo com um código assim:

Abaixo o do arquivo ACBrReinf.pas

function TEventos.LoadFromString(AXMLString: String): Boolean;
var
  AXML: AnsiString;
  P, N: integer;

  function PosReinf: integer;
  begin
    Result := pos('</Reinf>', AXMLString);
  end;

begin
  Result := False;
  N := PosReinf;

  while N > 0 do
  begin
    P := pos('</Reinf>', AXMLString);

    if P > 0 then
    begin
      AXML := copy(AXMLString, 1, P + 9);
      AXMLString := Trim(copy(AXMLString, P + 10, length(AXMLString)));
    end
    else
    begin
      AXML := copy(AXMLString, 1, N + 6);
      AXMLString := Trim(copy(AXMLString, N + 6, length(AXMLString)));
    end;

    Result := Self.ReinfEventos.LoadFromString(AXML);

    N := PosReinf;
  end;
end;

o mesmo código se replica em TLoteEventos, em  ACBrReinfLoteEventos.pas.

E eu fiquei me perguntando se havia alguma explicação pra essas variáveis N e P, ou eu simplesmente poderia reescrever o código assim (já comentado para usar com o pasdoc):

{Alimentação de XML em TItemLoteEventos com o conteúdo de evento XML já assinado para posterior envio.
IMPORTANTE: o conteúdo de AXMLString já deverá estar assinado e desprovido de cabeçalhos}
function TLoteEventos.LoadFromString(AXMLString: String): Boolean;
Const
  ReinfSearchTag = '</Reinf>';
var
  AXML: AnsiString;
  P: integer;
begin
  P := pos(ReinfSearchTag, AXMLString);
  while N > 0 do
  begin
    AXML := copy(AXMLString, 1, ifthen(p>0,p+9,6) );
    AXMLString := Trim(copy(AXMLString, ifthen(p>0,P + 10,6) length(AXMLString)));
    Add.FXML := AXML;
    P := pos(ReinfSearchTag, AXMLString);
  end;
  Result := Self.Count > 0;
end;

O projeto já é muito grande, e cheio de copia-e-cola, sinal claro que a documentação era necessária e não foi usada. O Código é confuso, no exemplo que citei, é inclusive deselegante, salvo se o código acima não puder ser reduzido e N e P realmente tinham alguma razão de ser que eu desconhecia. E sem os devidos comentários, é mais confuso ainda, porque temos que recorrer ao fórum para entender a intenção do desenvolvedor, porque o código pode ainda não estár concluído, certo?

PS: Redigir a documentação base para o pasdoc pode ser um bom exercício para a criatividade literária, veja isso como algo positivo!

Quanto à  citação " quer melhor documentação que os fontes? " minha resposta seria:
Quero fontes passiveis de serem documentadas, por exemplo, pelo pasdoc, portanto sim: a documentação ideal estaria nos fontes ?. Logo, se você discorda, é porque eu me expressei mal, desculpe-me mais uma vez.

Voltando ao assunto original: note que eu ainda estou no campo da opinião, o comentário (cabeçalho para pasdoc) que eu fiz na reescrita da função é meramente especulativa, pode não ser isso, por isso estou pedindo ajuda para entender o que são essas funções, e o que a variável N e P representam.

Já tive retorno de 3 moderadores e ainda não consegui me expressar ? de modo a conseguir me fazer entender. Mas fica o agradecimento pelo pronto atendimento, é raro encontrar uma equipe tão dedicada!

  • Curtir 2
Postado
13 horas atrás, Italo Jurisato Junior disse:

Estou pensando sinceramente de quando eu for escrever o próximo componente não inclui as rotinas para gerar o XML e deixar a cargo de cada desenvolvedor.

Faz isso não...  os componentes são ótimos e quem precisar pode muito bem alterar seus fontes locais para atender alguma necessidade específica. Basta estudar os fontes.

 

Conheço o projeto há um bom tempo, mas sem ir a fundo. Implementei geração boletos há uns anos e agora estou trabalhando com o EFD Reinf. Não tinha fuçado tanto nos fontes como estou fazendo agora... o que posso dizer é que natural que ao iniciar o trabalho com qualquer componente novo existam entraves e dúvidas, mas é preciso explorar, testar, fuçar. E a possibilidade que o ACBr dá nesse sentido é sensacional.

Posso garantir que a comunidade e os recursos do framework agilizaram muito meu trabalho por aqui.

 

 

  • Curtir 4
  • Consultores
Postado

Bom dia a todos,

Primeiramente, peço desculpas se fui grosso.

Com relação a função LoadFromString é preciso ser checada, pois realmente ela esta estranha, não só por conta das variáveis N e P, existe mais uma coisa que esta errada nela.

Que só será notado caso tentarmos ler um XML que contem dois ou mais eventos Reinf.

O código aberto nos da essa chance de mais pessoas poderem estudar e apontar erros e sugerir soluções.

A finalidade de TEventos.LoadFromString é extrair de uma String o conteúdo do grupo <Reinf>, esse conteúdo é passado para a função: TReinfEventos.LoadFromString que por sua vez procura detectar o tipo de evento se trata.

Detectado o evento, o conteúdo é ADD a lista do tipo de evento em questão.

O conteúdo que estou me referindo é o XML de um evento Reinf que tem que estar assinado, pois na lista que mencionei acima só ficam os eventos assinados, portanto prontos para serem enviados.

No fórum existem pessoas dispostas a colaborar financeiramente assinando o SAC, outras testando o componente, detectando falhas e disponibilizando as devidas correções.

Sei muito bem que existem pessoas que tem mais dificuldades e outras menos em compreender o código, isso é normal.

O que nós do ACBr, em particular eu quero, é que todos cresçam, evoluem no conhecimento, pois eu também estou aqui para aprender. 

 

  • Curtir 4
  • Obrigado 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Com certeza! eu apenas tive  dificuldades em entender o que LoadFromString deveria fazer, e a rotina não fazia sentido (aliás, ainda não faz) para mim.
Eu ainda não me sinto apto a ajudar por enquanto já que, como eu disse, ainda estou estudando os fontes e entendendo a dinâmica dos desenvolvedores.

Quando digo que sou muito fã do ACBr, não o digo porque os componentes são bons ou fáceis de usar. Digo isso pela filosofia de trabalho compartilhado. Pessoalmente ainda não usei os componentes, e nem vejo necessidade imediata de fazê-lo, mas isso não significa que eu não possa contribuir num futuro próximo.

Também percebo que alguns os códigos são bem confusos e outros bem limpos. isso demonstra claramente a pluralidade dos desenvolvedores, e isso é o que mais me encanta no projeto. Não há excesso de conservadorismo ou privação de idéias.

Para ajudáa-los, talvez a minha maior dificuldade seja a de adptar os fontes para serem compatíveis com o Delphi (preferência por {$mode objfpc} ), já que não o uso mais desde a versão 5 porém, pelo que vejo, é bastante comum os fontes serem adaptados para ficarem compatíveis.

  • Consultores
Postado

Bom dia,

Lembre-se que os componentes ACBr são 100% compatíveis com o Delphi 7 em diante e com o Lazarus (Free Pascal).

Entendo a sua dificuldade no entendimento, uma vez que você foi escolher justamente um componente novo que esta passando por melhorias e correções.

Talvez se tivesse pegado o ACBrNFe que esta mais consolidado não teria tanta dificuldade.

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

  • Consultores
  • Solution
Postado

Boa tarde a todos,

Foi realizada modificações visando a leitura de XML de terceiros.

Ao carregar um XML de terceiros através do método LoadFromFile, o componente checa para saber se o XML esta assinado, caso não esteja, será realizado a assinatura e a validação do mesmo e por fim deixa-lo na fila de eventos para ser enviado através do método Enviar.

Essas modificações já estão do repositório.

  • Obrigado 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Quanto ao estudo da ACBrNFe, a minha intenção é realmente verificar como ocorre a evolução do componente, os remendos, as gambiarras, os processos de revisão: o desenvolvimento em si, não apenas o estudo do código fonte.
Ainda vejo deficiência na documentação: acharia muito mais interessante comentar o código para poder gerar a documentação por aplicativos como o pasdoc, mas isso é opinião. Imagino que possa haver muito mais contribuições quando o material está documentado, mas ao mesmo tempo, sei que isso demanda recursos.
A documentação ajudaria muito no processo de revisão.

Quanto à modificação:

Agora faz todo o sentido do mundo!
Reitero: "... fica o agradecimento pelo pronto atendimento, é raro encontrar uma equipe tão dedicada! "

Grato à todos os  Moderadores, em especial ao Sr. Italo.

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