Ir para conteúdo
  • Cadastre-se

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

Recommended Posts

Postado

Olá pessoal!

 

Primeiramente gostaria de agradecer a equipe ACBR pelo excelente componente que vocês desenvolvem.

 

Sou usuário do ACBR a 5 anos e possuo centenas de clientes rodando o sistema sem problemas, porém recentemente um cliente gerou uma NF-e muito grande com 380 itens e para minha surpresa o programa demorou muito, mais muito mesmo para gerar e transmitir a nfe. 

 

Inicialmente pensei que a lentidão era no meu código que calcula os impostos dos itens, debugando o código cheguei na seguinte linha que causa a demora:

 

ACBrNFe1.NotasFiscais.Valida; ( Cerca de 5 minutos )
 
ACBrNFe1.NotasFiscais.GerarNFe; ( Cerca de 5 minutos )
 
Debugando a função VALIDA encontrei o ponto do codigo do acbr onde ocorre a demora no processamento:
 
Arquivo : PcnNfeW.pas
 
Vou tentar colocar a pilha (call stack) para facilitar o entendimento:
 
ACBrNFeNotasFiscais.TNotasFiscais.Valida
ACBrNFeNotasFiscais.NotaFiscal.GetNFeXML
pcnNFeW.TNFeW.GerarXml
pcnNFeW.TNFeW.GerarInfNFe
pcnNFeW.TNFeW.GerarDet
 
 
A Função GerarDet leva cerca de 30 segundos para ser processada, até ai tudo bem um tempo aceitável para o tamanho da nota fiscal e a quantidade de itens, mas debugando percebi que a função  GerarInfNFe é chamada dezenas de vezes inclusive em algumas partes do código onde ela é chamada consta um (**) na frente do comando.
  (**)GerarInfNFe;

Creio que esta função GerarInfNFe > GeraDet deveria ser processada somente uma vez e setar um flag para indicar que os itens já foram processados.

 

 

 

Pensei até em alterar o componente mas achei melhor informar para alguém mais experiente para que faça a alteração caso seja necessário ou me informar oque estou fazendo de errado.

 

 
Aguardo ajuda dos colegas.
  • Moderadores
Postado

Bom dia

Após alterar como ficou o processamento? e a NF-e gerou corretamente ou teve algum problema?

o bom é efetuar diversos testes pra verificar senão ocasiona algum outro problema ! 

e caso obtenha sucesso favor anexar aqui a unit alterada para que possamos avaliar e subir ao svn!

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

Olá Juniomar!

 

Como eu disse não fiz a alteração, apesar de ter pesquisado bastante no fórum não encontrei nenhum post relacionado então resolvi postar aqui primeiro para ver se alguém passou por isso e já tem uma solução, creio que não sou o primeiro a emitir uma nota com muitos itens.

  • Moderadores
Postado

Só encontrei uma chamada para a função GerarInfNFe na unit pcnNFeW.pas na linha 269. Talvez passe mais de uma vez, pois qdo vc chama ACBrNFe1.NotasFiscais.Valida; ele já gera a nota(não tem como validar a nota sem antes gerar) e depois vc está chamando novamente a função para gerar as notas(ACBrNFe1.NotasFiscais.GerarNFe; ).

  • Curtir 1
djsystem-logo.png
 youtube.png facebook.png instagram.png linkedin.png
André Ferreira de Moraes | Analista de Sistemas
www.djsystem.com.br | www.djpdv.com.br
www.tefhouse.com.br | www.xpos.com.br
Postado

Boa tarde  André,

 

obrigado pela ajuda,

 

Bom depois de seu comentário revisei o  código melhor o caso e removi a chamada a função VALIDA, e deixei apenas duas chamadas no meu código:

 

 
Meu codigo:
 
ACBrNFe1.NotasFiscais.GerarNFe;
ACBrNFe1.Enviar(StrToInt(vNumLote));

 

 

Mesmo assim estas funções chamam 6 Vezes a função que recalcula os itens da nota, como você disse a função GeraNfe chama apenas uma vez, porém a função Enviar chama 5 vezes.

ACBrNFe1.NotasFiscais.GerarNFe; 


 1) 
pcnNFeW.TNFeW.GerarInfNFe
pcnNFeW.TNFeW.GerarXml
ACBrNFeNotasFiscais.TNotasFiscais.GerarNFe


ACBrNFe1.Enviar(StrToInt(vNumLote));


 2)
pcnNFeW.TNFeW.GerarInfNFe
pcnNFeW.TNFeW.GerarXml
ACBrNFeNotasFiscais.TNotasFiscais.Assinar
ACBrNFe.TACBrNFe.Enviar('218',True,False)
ACBrNFe.TACBrNFe.Enviar(218,True,False)




 3)


pcnNFeW.TNFeW.GerarInfNFe
pcnNFeW.TNFeW.GerarXml
ACBrNFeNotasFiscais.NotaFiscal.GetNFeXML
ACBrNFeNotasFiscais.TNotasFiscais.Valida
ACBrNFe.TACBrNFe.Enviar('218',True,False)
ACBrNFe.TACBrNFe.Enviar(218,True,False)


 4)


pcnNFeW.TNFeW.GerarInfNFe
pcnNFeW.TNFeW.GerarXml
ACBrNFeNotasFiscais.NotaFiscal.GetNFeXML
ACBrNFeNotasFiscais.TNotasFiscais.Valida
ACBrNFe.TACBrNFe.Enviar('218',True,False)
ACBrNFe.TACBrNFe.Enviar(218,True,False)


 5)
pcnNFeW.TNFeW.GerarInfNFe
pcnNFeW.TNFeW.GerarXml
ACBrNFeNotasFiscais.NotaFiscal.GetNFeXML
ACBrNFeWebServices.TWebServicesBase.DoNFeRecepcao
ACBrNFeWebServices.TWebServicesBase.LoadMsgEntrada
ACBrNFeWebServices.TWebServicesBase.Executar
ACBrNFeWebServices.TNFeRecepcao.Executar
ACBrNFeWebServices.TWebServices.Envia('218',False)
ACBrNFe.TACBrNFe.Enviar('218',True,False)
ACBrNFe.TACBrNFe.Enviar(218,True,False)


 6) 
pcnNFeW.TNFeW.GerarInfNFe
pcnNFeW.TNFeW.GerarXml
ACBrNFeNotasFiscais.NotaFiscal.SaveToFile('C:\RegraEmpresarial\NotasFiscais2\\NFE\201405\NFe\52140508674453000105550010000002181000002181-nfe.xml',False)
ACBrNFeWebServices.TNFeRetRecepcao.Confirma($841F9D0)
ACBrNFeWebServices.TNFeRetRecepcao.Executar
ACBrNFeWebServices.TWebServices.Envia('218',???)
ACBrNFe.TACBrNFe.Enviar('218',True,False)
ACBrNFe.TACBrNFe.Enviar(218,True,False)
  • Moderadores
Postado

Desculpe, mas não consigo entender seu log. 

 

O que posso te afirmar é que o método ACBrNFe.Enviar chama o método de assinar que por sua vez acaba gerando novamente o XML. As demais chamadas vc deve debugar o componente e ver pq está ocorrendo e qual seria a possível solução(algum flag q indique q a NFe já foi gerada).

djsystem-logo.png
 youtube.png facebook.png instagram.png linkedin.png
André Ferreira de Moraes | Analista de Sistemas
www.djsystem.com.br | www.djpdv.com.br
www.tefhouse.com.br | www.xpos.com.br
Postado

Ola André,

 

É justamente isso que estou tentando provar no LOG se você fizer apenas uma chamada ao método Enviar , ele chama 5 vezes a função GerarInfNFe que por sua vez recalcula todos os itens da nota.  

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