Ir para conteúdo
  • Cadastre-se

dev botao

Performance Na Rotina De Importar Xml De Entrada


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

Recommended Posts

Estou tentar importar XML de entrada para o sistema, ler os XML de uma pasta e alimentar no componente AcbrNfe utilizando loadFromFile, mas esta muito lento  uma pasta com 100 arquivos XML fico muito lento e ate trava a rotina que utilizo :

//rotina pega nome dos XML e coloca nesta variável separando por "|" 
ListaArquivos:= '';
 ListaArquivos:= ProcurarArquivo(edtPastaImportarXML.Text, 'XML');

//Aqui faz loop ate a variável ficar vazia
 While LerArquivo do
 begin
 
  if ListaArquivos = '' then
  begin
   LerArquivo:= false;
   Break;
  end;
  //Separa o conteudo 
  PosBarra:=Pos('|',ListaArquivos);
  CaminhoXML:= Copy(ListaArquivos,1,PosBarra-1);
  Delete(ListaArquivos,1,PosBarra);

  //Aqui eu valido o XML
  try
   XMLValido:= true;
   fmMenu.ACBrNFe2.NotasFiscais.Clear;
   fmMenu.ACBrNFe2.NotasFiscais.LoadFromFile(edtPastaImportarXML.Text + '\' + CaminhoXML);
   fmMenu.ACBrNFe2.NotasFiscais.Valida;
  except
   begin
     PastaDestinoRecusado:= edtPastaImportarXML.Text + '\' + 'XML Recusado';
     if not DirectoryExists(PastaDestinoRecusado) then
      ForceDirectories(PastaDestinoRecusado);
     //Move o XML recusado para a Pasta recusada
     MoveFile(Pchar(edtPastaImportarXML.Text + '\' + CaminhoXML), Pchar(PastaDestinoRecusado + '\' + ExtractFileName          (edtPastaImportarXML.Text + '\' + CaminhoXML)) );
   end;
   end
  end;
 
  if XMLValido then
  begin
   fmMenu.ACBrNFe1.NotasFiscais.LoadFromFile(edtPastaImportarXML.Text + '\' + CaminhoXML);
   Contador:= Contador + 1;
  end;
  
 end;
 if Contador > 0 then
 begin
  cdsXML.First;
  cdsXML.DisableControls;
  pnpImportar.Visible:= true;
  pnpImportar.Caption:= 'Aguarde... Carregando Informações da Nota Fiscal !!!';
  Application.ProcessMessages;
  Sleep(500);
  //Rotina para ler dados XML
  for n:=0 to fmMenu.ACBrNFe1.NotasFiscais.Count-1 do
  begin
   with fmMenu.ACBrNFe1.NotasFiscais.Items[n].NFe do
   begin
     cdsXML.Append;
     cdsXMLID.AsInteger:= n;
     cdsXMLImportar.AsInteger:= 0;
     cdsXMLDataEmissao.AsDateTime:= Ide.dEmi;
     cdsXMLNumeroNF.AsInteger:= Ide.nNF;
     cdsXMLProtocolo.AsString:= procNFe.nProt;
     cdsXMLChave.AsString:= procNFe.chNFe;
     //Emitente e endereco /Telefone
     cdsXMLEmitente.AsString:= UpperCase(Emit.xNome);
     cdsXMLCNPJEmitente.AsString:= Emit.CNPJCPF;
     cdsXMLIERem.AsString:= Emit.IE;
     cdsXMLEnderecoRem.AsString:= UpperCase(Emit.EnderEmit.xLgr + ', ' + Emit.EnderEmit.nro);
     cdsXMLBairroRem.AsString:= UpperCase(Emit.EnderEmit.xBairro);
     cdsXMLCidadeRem.AsString:= UpperCase(Emit.EnderEmit.xMun + '/' + Emit.EnderEmit.UF);
     cdsXMLIbgeRem.AsInteger:= Emit.EnderEmit.cMun;
     //Destinatario e endereco /Telefone
     cdsXMLDestinatario.AsString:= UpperCase(Dest.xNome);
     cdsXMLCNPJDestinatario.AsString:= Dest.CNPJCPF;
     cdsXMLIEDest.AsString:= Dest.IE;
     cdsXMLEnderecoDest.AsString:= UpperCase(Dest.EnderDest.xLgr + ', ' + Dest.EnderDest.nro);
     cdsXMLBairroDest.AsString:= UpperCase(Dest.EnderDest.xBairro);
     cdsXMLCidadeDest.AsString:= UpperCase(Dest.EnderDest.xMun + '/' + Dest.EnderDest.UF);
     cdsXMLIbgeDest.AsInteger:= Dest.EnderDest.cMun;
     //Dados da NF
     cdsXMLValorNF.AsFloat:= Total.ICMSTot.vNF;
     for I:=0 to Transp.Vol.Count-1 do
     begin
      with Transp.Vol.Items[I] do
      begin
       cdsXMLQuantidade.AsFloat:= cdsXMLQuantidade.AsFloat + Transp.Vol.Items[i].qVol;
       cdsXMLPeso.AsFloat:= cdsXMLPeso.AsFloat + Transp.Vol.Items[i].pesoB;
      end;
     end;
     cdsXML.Post;
   end; //end count
  end; //end carregar NF
  butImportarXML.Enabled:= true;
  btnFiltrar.Enabled:= true;
 end;
 edtContadorXML.Text:= FormatFloat('00000', Contador);
 pnpImportar.Visible:= false;
 butLerPastaXML.Enabled:= true;
 cdsXML.First;
 cdsXML.EnableControls;
 GrdLista.SetFocus;
 GrdLista.SelectedIndex:= 1;
Editado por Rafael Dias
Link para o comentário
Compartilhar em outros sites

Experimente retirar o fmMenu.ACBrNFe2.NotasFiscais.Valida;

Acredito que possa tirar para verificar o desempenho, mas se ele tirar este comando não terá como confirmar se os xml são válidos.

- Sou desenvolvedor.

- De que linguagem, delphi? .NET? Java?

- Qualquer uma, sou desenvolvedor.

Link para o comentário
Compartilhar em outros sites

Boa noite, obrigado pelas resposta.

 

Bom retirei o comando : Experimente retirar o fmMenu.ACBrNFe2.NotasFiscais.Valida;

mas não adiantou pra ter ideia deixei uma pasta com 150 XML ficou +/- 10 minutos para carregar o grid com as informações dos XML.

teriam mas alguma ideia ?

 

Obrigado .

Link para o comentário
Compartilhar em outros sites

Bom dia. Voce chegou a testar qual parte da rotina que está lenta? Experimente carregar esses mesmos 150 xml somente para o componente (comente todo o bloco "For" que está jogando os dados para o cdsXML). Poste aqui quanto tempo levará somente fazendo isso.

E a propósito, a sua variável XMLValido sempre estará com o valor true - em nenhum momento ela recebe false. Por isso ele irá dar o LoadfromFile em todos os XMLS, mesmo os inválidos.

Link para o comentário
Compartilhar em outros sites

Boa noite, fiz teste e acabei deixando passar esta variável sempre true, mas eu separei toda a rotina a parte que fica lenta é :

 

fmMenu.ACBrNFe1.NotasFiscais.LoadFromFile(edtPastaImportarXML.Text + '\' + CaminhoXML);

 

após ao 80 arquivos que ele carrega no componente ele carrega a performance da rotina !!!

Tem algum limite de leitura para o componente ?

 

Alguem tem alguma rotina para ler XML sem utilizar o componente ? utilizando o TXMLDocument

 

  NodeRec := vXMLDoc.DocumentElement.ChildNodes.FindNode('infNFe');

  NodeRec2:= NodeRec.ChildNodes.FindNode('ide');   /// DA ERRO NESTA LINHA ACCESS VIOLATION

  cEmissao := NodeRec2.ChildNodes['dEmi'].text;   

  cNumero := NodeRec2.ChildNodes['nNF'].text;

Link para o comentário
Compartilhar em outros sites

  • Solution

Uma ideia: porque não carregar e importar 1 arquivo por vez??

 

tipo: carrega, importa, limpa da memória, carrega outro, importa, limpa da memória, etc..

 

experimente assim, talvez fica melhor.

- Sou desenvolvedor.

- De que linguagem, delphi? .NET? Java?

- Qualquer uma, sou desenvolvedor.

Link para o comentário
Compartilhar em outros sites

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