Ir para conteúdo
  • Cadastre-se

Balança SM100 performance surpreendente

Tecnologia Japonesa   Teclado e Visor resistentes a água
Consumo inteligente de etiquetas   Baixo custo de manutenção
Comunicação Ethernet e WIFI independentes

Comprar

Impressora de Etiquetas L42

Fabricada no Brasil. Benefícios exclusivos
Garantia de 18 meses   Visor na Tampa   Protocolos PPLA e PPLB
Portas USB e Serial   Baixo Custo de Manutenção   Financiamento através do BNDES

Comprar

Igor Grava

RESPONDIDO BlocoX Estoque - Lentidão ao GerarXML

Recommended Posts

Estou gerando o BlocoX de Estoque e ReduçãoZ, seguindo os exemplos do ACBr versão Lazarus sem problemas em minha máquina de desenvolvimento, porém ao testar nas máquinas de PDV do Cliente a geração do XML de Estoque está demorando cerca de 30 minutos, me parece que o problema está na função GerarXML, justamente quando são criados os nós baseados em como os objetos de produto são informados, pelo que verifiquei na base de dados do cliente existem cerca de 10mil produtos, mas ainda não me parece ser justificável essa demora apenas pelo volume de dados, pode ser até performance nas máquinas do cliente.

Buscando solucionar isso, pensei na alternativa de gerar o XML por outras rotinas, como vi neste Tópico, porém não encontrei como informaria o XML externo para o ACBrBlocoX assinar e enviar, existe algum exemplo deste cenário? A propriedade ACBrBlocoX.Estoque.XMLOriginal é protected.

 

Tentei da seguinte forma sem sucesso:

DM_BlocoX.QXMLEstoque.Close;
DM_BlocoX.QXMLEstoque.ParamByName('inscricao_estadual').Value    := DM_PDV.QParametrosINSCRICAO_ESTADUAL.Value;
DM_BlocoX.QXMLEstoque.ParamByName('numero_credenciamento').Value := '123456789';
DM_BlocoX.QXMLEstoque.Open;

ACBrBlocoX.WebServices.EnviarBlocoX.XML := DM_BlocoX.QXMLEstoqueXML_ESTOQUE.Value;      

Gerando o XML diretamente pelo SQL, porém neste caso o XML não seria assinado, certo?

Editado por Igor Grava

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Igor Grava disse:

geração do XML de Estoque está demorando cerca de 30 minutos, me parece que o problema está na função GerarXML

Você consegue me passar um passo a passo pra reproduzir no Demo do ACBrBlocoX?

Por exemplo, quais comandos você chama e quantos produtos são necessários para observar a lentidão?

 

1 hora atrás, Igor Grava disse:

Gerando o XML diretamente pelo SQL, porém neste caso o XML não seria assinado, certo? 

Acho que não, mas talvez você possa assinar usando o próprio componente. O TACBrBlocoX_Estoque.GerarXML usa algo assim:

    FXMLAssinado := ACBrBlocoX1.SSL.Assinar(FXMLOriginal, 'Estoque', 'Mensagem');

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, EMBarbosa disse:

Você consegue me passar um passo a passo pra reproduzir no Demo do ACBrBlocoX?

Por exemplo, quais comandos você chama e quantos produtos são necessários para observar a lentidão?

 

Acho que não, mas talvez você possa assinar usando o próprio componente. O TACBrBlocoX_Estoque.GerarXML usa algo assim:


    FXMLAssinado := ACBrBlocoX1.SSL.Assinar(FXMLOriginal, 'Estoque', 'Mensagem');

 

Elton, boa tarde

Tentei desta forma que enviou, explorando dentro da função GerarXML vi essa chamada e fiz desta forma:

 

DM_BlocoX.QXMLEstoque.Close;
DM_BlocoX.QXMLEstoque.ParamByName('inscricao_estadual').Value    := DM_PDV.ParametrosINSCRICAO_ESTADUAL.Value;
DM_BlocoX.QXMLEstoque.Open;

oBlocoX.WebServices.EnviarBlocoX.XML := oBlocoX.SSL.Assinar(DM_BlocoX.QXMLEstoqueXML_CONTEUDO.Value, 'Estoque', 'Mensagem');

Após alguns problemas com a formatação dos valores numéricos, alguns com 3 casas decimais e todos utilizando vírgula como separadores decimais, consegui o envio sem problemas de minha máquina, porém em teste no cliente justamente a linha do Assinar que está demorando cerca de 10 minutos agora e ainda não finalizou, ainda aguardando para ver se fica na casa dos 30 minutos como pelo GerarXML ou se terá alguma diferença mesmo.

Como essa função do Assinar é chamada dentro da GerarXML estou achando que é justamente ela que causa a lentidão, embora cheguei a testar a GerarXML enviando o parâmetro Assinar = False e demorou da mesma forma.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

14 horas atrás, Igor Grava disse:

consegui o envio sem problemas de minha máquina, porém em teste no cliente justamente a linha do Assinar que está demorando cerca de 10 minutos agora e ainda não finalizou, ainda aguardando para ver se fica na casa dos 30 minutos como pelo GerarXML ou se terá alguma diferença mesmo.

Como essa função do Assinar é chamada dentro da GerarXML estou achando que é justamente ela que causa a lentidão, embora cheguei a testar a GerarXML enviando o parâmetro Assinar = False e demorou da mesma forma. 

Nesse caso, vou voltar a pedir as informações que você ainda não me passou, veja:

16 horas atrás, EMBarbosa disse:

Você consegue me passar um passo a passo pra reproduzir no Demo do ACBrBlocoX?

Por exemplo, quais comandos você chama e quantos produtos são necessários para observar a lentidão?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
11 minutos atrás, EMBarbosa disse:

 

Nesse caso, vou voltar a pedir as informações que você ainda não me passou, veja:

 

No cliente o estoque tem cerca de 10mil produtos,

Segue o código:
 

     if DecimalSeparator = '.' then
     begin
         DecimalSeparator := ',';
         ThousandSeparator:= '.';
     end;

     with AACBrBlocoX do
     begin
          with Estoque do
          begin
               DataReferencia := DATE;
               //Abrindo Query EstoqueAtual
               DM_BlocoX.QEstoqueAtual.Close;
               DM_BlocoX.QEstoqueAtual.Open;
               DM_BlocoX.QEstoqueAtual.First;
               //Abriu Query EstoqueAtual
               Produtos.Clear;
              
               while not DM_BlocoX.QEstoqueAtual.EoF do
               begin
                    with Produtos.Add do
                    begin
                         Codigo.Tipo             := tpcEAN;
                         Codigo.CodigoProprio    := DM_BlocoX.QEstoqueAtualPRODUTO.AsString;
                         Codigo.CodigoCEST       := DM_BlocoX.QEstoqueAtualCODIGO_CEST.Value;
                         Codigo.CodigoGTIN       := DM_BlocoX.QEstoqueAtualEAN.Value;
                         Codigo.CodigoNCMSH      := DM_BlocoX.QEstoqueAtualNCM.Value;
                         Descricao               := DM_BlocoX.QEstoqueAtualDESCRICAO.Value;
                         ValorUnitario           := DM_BlocoX.QEstoqueAtualPRECO.Value;

                         if DM_BlocoX.QEstoqueAtualIPPT.Value = 'T' then
                            Ippt                 := ipptTerceiros
                         else
                            Ippt                 := ipptProprio;

                         SituacaoTributaria      := stTributado;
                         Aliquota                := DM_BlocoX.QEstoqueAtualALIQUOTA_ICMS.Value;
                         Unidade                 := DM_BlocoX.QEstoqueAtualUNIDADE_MEDIDA.Value;
                         Quantidade              := DM_BlocoX.QEstoqueAtualSALDO.Value;
                         IndicadorArredondamento := False;
                    end;
                    DM_BlocoX.QEstoqueAtual.Next;
               end;
               //Fim da Query - Salvar XML
               GerarXML(True);
          end;
     end;

     if DecimalSeparator = '.' then
     begin
         DecimalSeparator := ',';
         ThousandSeparator:= '.';
     end;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estamos analisando o problema, em breve teremos uma posição para o caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites
29 minutos atrás, Celso disse:

Estamos analisando o problema, em breve teremos uma posição para o caso.

Certo, estou buscando alternativas pois pelo que verificamos o problema está justamente dentro da procedure Assinar da Procedure ACBrDFeXsLibXml2, me parece ser justamente nestas linhas:

if URI = '' then
      Canon := AnsiString(CanonC14n(aDoc, docElement))
    else
      Canon := AnsiString(CanonC14n(aDoc, infElement));

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Igor Grava

Foi feita uma alteração no método de formatação do XML, derrubando o tempo de formatação do XML, o tempo de geração aqui nos testes caiu de 36 minutos para ~2 minutos. Estou anexando o .pas para que você possa fazer os testes, se possível faça testes de geração de outros DFe´s, como NFe por exemplo, e poste o resultado. Assim que concluirmos a etapa de testes, devemos disponibilizar no SVN a correção.

 

ACBrDFeXsLibXml2.pas

  • Curtir 7

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 07/12/2018 at 16:07, Celso disse:

@Igor Grava

Foi feita uma alteração no método de formatação do XML, derrubando o tempo de formatação do XML, o tempo de geração aqui nos testes caiu de 36 minutos para ~2 minutos. Estou anexando o .pas para que você possa fazer os testes, se possível faça testes de geração de outros DFe´s, como NFe por exemplo, e poste o resultado. Assim que concluirmos a etapa de testes, devemos disponibilizar no SVN a correção.

 

ACBrDFeXsLibXml2.pas

Apenas como informação: Essa modificação foi enviada ao SVN na revisão 16125.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está agora fechado para novas respostas

×