Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

  • Membros Pro
Postado

Pessoal,

 

Acabei de implementar a NF-e no meu código, e estou muito satisfeito. Está rodando 100%.

 

Tenho uma dúvida em relação ao processamento de mais de um lote de NF-e, que é o seguinte:

 

Imagine que quero enviar 200 notas, e que o número máximo de NF-e por lote é 50, logo tenho que enviar 4 lotes.

 

De acordo com o processo que implementei (aí onde está a dúvida), a cada lote enviado, temos que aguardar 20 segundos (por exemplo).

 

Ao final do processamento, eu tenho esperado 20 segundos 4 vezes, uma para cada lote, ou seja, 80 segundos, ou ainda, 1 minuto e 20 segundos.

 

Eu queria saber se é possível enviar os 4 lotes em sequência, e só após o envio do quarto lote, dá um sleep de 20 segundos, e receber o retorno das 200 notas envidas, pois dessa forma eu economizaria 60 segundos de sleep, que é um tempo considerável.

 

É possível fazer isso? Como seria a sequencia de comandos a utilizar?

E se não for possível ainda, seria de interesse de vocês implementar essa sugestão?

  • Membros Pro
Postado

Régys,

 

A princípio implementei diretamente no meu código, e faço da seguinte forma:

 

Criei uma função que recebe um array com as notas a transmitir, antes de chamar essa função já divido o array em lotes de 30 notas pra garantir o tamanho menor que 500KB.

 

// Implemento as notas no ACBrNFe1

for i := 0 to Length(aNotas) - 1 do

begin

   ACBrNFe1.NotasFiscais.Add.NFe

   ...

end;

 

// Gero, assino e valido

ACBrNFe1.NotasFiscais.GerarNFe;

ACBrNFe1.NotasFiscais.Assinar;

ACBrNFe1.NotasFiscais.Valida;

 

// Crio o lote e envio.

nNumLote := fnc_CriaLote('LOT', 'NFe');

ACBrNFe1.WebServices.Envia(nNumLote);

 

// E Então leio o resultado do lote

With ACBrNFe1.WebServices.Retorno.NFeRetorno.ProtNFe do

begin

   ...

end;

Obs.: Assim vou enviando até concluir todos os lotes, só que para cada lote, aguardo 20 segundos, e queria fazer de uma forma que aguardasse apenas no último lote para receber as respostas. Sei que vou ter que alterar a estrutura da função pra isso. Acredito que tenho que enviar o lote como "Síncrono" e somente depois fazer a consulta do lote, porém não encontrei essa função.

  • Moderadores
Postado

O método enviar do componente já dispara em sequência a consulta ao lote via número do recibo, então usando o modo normal não há forma de separar a consulta do envio.

 

Já no modo síncrono a consulta ao lote não é feita, pois como é síncrono ele retornaria no mesmo pedido os dados de autorização, você pode tentar usar dessa forma para enviar, guardar o número do recibo e no fim consultar o recibo por conta própria usando:

 

  ACBrNFe1.WebServices.Recibo.Recibo := <numero recibo>;
  ACBrNFe1.WebServices.Recibo.Executar;
 
Tente desta forma e verifique se funciona como você deseja.

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
×
×
  • 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...