Ir para conteúdo
  • Cadastre-se

dev botao

Cfe Duplicando. Controle De Sessão.


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

Recommended Posts

Postado

Prezados.
Por gentileza gostaria de um auxílio.
De uns tempos pra cá, meu emissor de Cfe passou a duplicar alguns cupons quando a aplicação não recebe retorno do equipamento Mfe.
Em contato com as fabricantes, fui orientado a realizar um controle de sessão na aplicação para sanar o problema.

Hoje eu envio da seguinte forma:


ACBrSAT1.ConsultarSAT;
    SATError := (ACBrSAT1.Resposta.codigoDeRetorno <> 8000);
    if (SATError) then
    begin
      Result.CodigoErro      := ACBrSAT1.Resposta.codigoDeRetorno;
      Result.MensagemRetorno := ACBrSAT1.Resposta.MensagemRetorno;
      exit;
    end;

    ACBrSAT1.EnviarDadosVenda;


Porém continua duplicando. Alguém pode me ajudar a identificar o que estou fazendo de errado?
Obrigado.

  • Moderadores
  • Solution
Postado

Boa tarde, o próprio componente ACBrSAT tem a propriedade "ValidarNumeroSessaoResposta" para realizar de forma automática uma consulta pelo numero de sessão quando não obtem o retorno do aparelho. Estáutilizando essa propriedade como True? Note que pode configurar também o número de tentativas para validar sessão.

  • Curtir 2
Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Postado

Sim, Já estou utilizando essa propriedade, ainda continuo com o mesmo problema de duplicidade. Queria saber se ao consulta o numero da sessão e a mesma já foi utilizada, eu ler o xml para que somente eu imprima essa cupom. 

Ou algum outro processo.

 

Grato.

 

  • Moderadores
Postado
8 horas atrás, ch4rl3s disse:

Queria saber se ao consulta o numero da sessão e a mesma já foi utilizada, eu ler o xml para que somente eu imprima essa cupom. 

Sim, isso seria a função do método "ConsultarNumeroSessao". O SAT permite consultar apenas o ultimo Numero Sessão enviado para o aparelho. Se o ultimo método foi de "EnviarDadosVenda" o numero de sessão deste método retornará o XML do CFe de venda... Se não estiver retornando é porque pode ter ocorrido algum erro de fato no aparelho, neste caso é necessário extrair um log do aparelho para verificar o motivo de não estar retornando o XML...

O normal seria sempre retornar o XML de venda como resposta do método EnviarDadosVenda. A consulta pelo ultimo numero de sessão deveriam ser exceções.

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Postado

Então após EnviarDadosVenda eu faço ConsultarNumeroSessao, se retornar o xml é que o CFe da venda foi transmitido corretamente, caso não venha eu tento enviar novamente, mesmo o retorno sendo 8000? Tenho um cliente que o modulo dele todo dia acontece duplicatas, e outros muito raro, mas acontece.

  • Moderadores
Postado

ConsultarNumeroSessao precisa fazer apenas quando não obter o retorno do aparelho depois de enviar a venda...

O procedimento ideal é esse:

ConsultarSAT - Se o retorno está ok "8000" pode enviar a venda, caso contrário precisa investigar o porque não está respondendo... Não adianta enviar a venda porque não vai respnder também.

EnviarDadosVenda - O normal é sempre receber um retorno, seja de sucesso "6000" ou com código de erro. Se não tiver nenhuma resposta ai sim precisa ConsultarNumeroSessao, para tentar obter a ultima resposta do aparelho. Mas se isso for recorrente precisa extrair o log do aparelho para análise... Não é normal a NÃO geração da resposta.

obs: Se mesmo sem obter a resposta, enviar a mesma venda pode duplicar mesmo... O aparelho está processando o CFe mas não está retornando. Extraia um log do aparelho quando isso ocorrer para poder analisar o que está ocorrendo.

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Postado
5 horas atrás, José M. S. Junior disse:

EnviarDadosVenda - O normal é sempre receber um retorno, seja de sucesso "6000" ou com código de erro. Se não tiver nenhuma resposta ai sim precisa ConsultarNumeroSessao, para tentar obter a ultima resposta do aparelho. Mas se isso for recorrente precisa extrair o log do aparelho para análise... Não é normal a NÃO geração da resposta.

Blz, entendi. Ai então quando eu ConsultaNumeroSessao, ele vai me retornar a última sessão que o módulo recebeu, 
ai o que eu faço? Reenvio a venda com o número de sessão que retornar do método?

  • Moderadores
Postado

Na verdade o ConsultaNumeroSessao retorna o proprio XML se o ultimo método foi o "EnviarDadosVenda", por isso ele só é usado quando você não tem a resposta do último método.

Não sei se chegou a ver esse vídeo, mas pode te auxiliar melhor a enterder os métodos do SAT

 

 

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Postado (editado)

Encontrei isso no log.

06/11/20 12:15:36:749 -   Gravando XML Venda enviado: C:\I9MOBILE\I9PDV\PDV_BIN\Enviado\29332082000153\202011\AD20201106121536-683293-env.xml
06/11/20 12:15:36:758 -   Inicio do Envio
06/11/20 12:15:46:784 -   Tempo de Processamento: 10,016 segundos
06/11/20 12:15:46:802 - NumeroSessao: 683293
06/11/20 12:15:46:818 - NumeroSessao: 346898 - Comando: ConsultarNumeroSessao( 683293 )
06/11/20 12:16:06:839 - NumeroSessao: 346898
06/11/20 12:16:06:859 -    ERRO: Sessao retornada pelo SAT [0], diferente da enviada [346898].

 

Isso acontece quando tem muitos itens para enviar, tem como configurar um tempo maior para esperar o retorno ?

Editado por ch4rl3s
  • Moderadores
Postado

Extraia um log do aparelho e anexe aqui para verificação... Se possível anexe também o xml de venda.

Mesmo ocorrendo essa demora a resposta deveria vir na ConsultaNumeroSessão... Tentou aumentar o "numeroTentativasValidarSessao"?

 

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Postado
3 horas atrás, José M. S. Junior disse:

Mesmo ocorrendo essa demora a resposta deveria vir na ConsultaNumeroSessão... Tentou aumentar o "numeroTentativasValidarSessao"?

Oi Bom Dia.

Eu não sabia que existia numeroTentativasValidarSessao. É no próprio componente ou em outro local?

Segue xml e 2 logs (um do módulo da gertech e outro gerado pela minha aplicação). Detalhe: O referido xml foi autorizado 4x. Existem 4 vendas

iguais a essa na sefaz, mas na minha aplicação só ficou 1, que é o anexo.

Outra dúvida. Eu notei no .ini de config do driver da sefaz:

[SESSOES]
CONSULTARNUMEROSESSAO = EQUIPAMENTO
;CONSULTARNUMEROSESSAO = DRIVERMFE
;Somente uma configuração de CONSULTARNUMEROSESSAO deve estar ativa

Há alguma diferença se utilizarmos o consultasessão do equipamento ou do driver?
 

Obrigado.

AD23201129332082000153592301025200024464826302.xml LOGS GERTECH.rar

  • Moderadores
Postado
55 minutos atrás, ch4rl3s disse:

É no próprio componente ou em outro local?

Sim tem essa propriedade no componente, experimente deixar como 2 ou 3 tentativas.

Pelo log o MFe está processando tudo corretamente a demora está nesse retorno da dll do MFe. Mas isso não é normal...

Está utilizando a dll atualizada? verifique se está direcionando para o path correto, além disso é importante que nenhuma outra instancia ou aplicação esteja fazendo uso da mesma dll...

 

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Moderadores
Postado

Aparentemente com essa configuração já está habilitado a consulta pelo EQUIPAMENTO, pois a outra linha está com ponto e virgula ; Acredito que esteja correto.

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • 4 semanas depois ...
  • Membros Pro
Postado

Boa tarde, estou tendo os mesmos problemas...

Esta ativado o parametro ValidarNumeroSessaoResposta, e o numerotentativasValidarSessao esta igual a 2. Esta anexado os logs do SAT e do Sistema e o trecho da programação para enviar a venda.

 

Att

 

João Victor

 

 

Duplicidade_cupom_sat.txt

  • 2 meses depois ...
  • Membros Pro
Postado
Em 05/11/2020 at 07:32, José M. S. Junior disse:

 

EnviarDadosVenda - Se não tiver nenhuma resposta ai sim precisa ConsultarNumeroSessao, para tentar obter a ultima resposta do aparelho. Mas se isso for recorrente precisa extrair o log do aparelho para análise... Não é normal a NÃO geração da resposta.

 

 

 

Amigos, ótimo tópico,  mas para ficar 100% claro,  José, quando você diz 'se não tiver resposta' , isso significaria exatamente o que?  Que o Retorno viriam vazios, nulos ou a string inteira de retorno seria vazia?  Dependendo da resposta, a forma de identificar o problema muda e se não fizer certo pode gerar problema.

 

Pergunto porque não tenho como simular isso  já que o problema aparentemente não é simulável facilmente.... pelo menos que eu saiba...

 

 

 

A título de exemplo, um simples IF Seria o suficiente pra atender a sua afirmação?

                    IF Vazio ( retIni["ENVIO"]["CodigoDeRetorno"])) // não obteve resposta....
 

Ps. Estou usando a DLL.

  • Moderadores
Postado
38 minutos atrás, OFF-DEV disse:

Amigos, ótimo tópico,  mas para ficar 100% claro,  José, quando você diz 'se não tiver resposta' , isso significaria exatamente o que?  Que o Retorno viriam vazios, nulos ou a string inteira de retorno seria vazia?  Dependendo da resposta, a forma de identificar o problema muda e se não fizer certo pode gerar problema.

Correto a validação é realizada pela classe "Resposta" do componente neste caso o CodigoRetorno retornará 0. O ideal é sempre validar pelo código 6000 para êxito do retorno

ex:

 if ACBrSAT1.Resposta.codigoDeRetorno = 6000 then 

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Membros Pro
Postado

 

Obrigado José!  

É um certo desafio criar um fluxo que realmente traga segurança ao tratamento do retorno, evitando assim duplicações ou a perda do XML mesmo quando algo no hardware acontece de errado.

No caso que eu expliquei, é necessário a verificação do CodigoRetorno == 0 pois na sequência eu quero usar ConsultarNumeroSessao(s) para obter o XML, caso mesmo assim eu não obtê-lo, eu descarto tudo e volto a mensagem para o operador que algo falhou e ele precisa tentar novamente.

Mas isso me levou a outra dúvida,  estou usando ValidarNumeroSessaoResposta=1 sempre.  Mesmo se falhar a obtenção do XML com CodigoRetorno == 0  e usando ValidarNumeroSessaoResposta=1, você acha necessário ainda usar ConsultarNumeroSessao(s) para tentar obter o XML mais uma vez ou é desnecessário?

 

 

 

Mais uma dúvida, tem como simular o CodigoRetorno voltando '0' ?

  • Moderadores
Postado

Se utiliza a property ValidarNumeroSessaoResposta como True, creio que não adianta utilizar o método ConsultarNumeroSessao, a não ser que sua aplicação espere um tempo maior para tentar consultar o NumeroSessao novamente.

Mas ressalto que não é comum o aparelho falhar para devolução de retorno, se isso acontece com frequencia pode ser problema com o aparelho ou falta de atualização... O recomendado é extrair o log do aparelho e contatar o fabricante.

5 horas atrás, OFF-DEV disse:

Mais uma dúvida, tem como simular o CodigoRetorno voltando '0' ?

Para simular, só alterando os fontes mesmo na classe SAT.Resposta mesmo... Pois se o SAT está comunicando com a aplicação o provável é que sempre obtenha o retorno com alguma informacao no campo CodigoRetorno.

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Membros Pro
Postado

Entendi, mas creio que alterando o meu próprio fonte pra 0 consigo fazer os tratamentos necessários. minha maior dúvida era mesmo se voltaria 0 ou vazio....

 

Quanto à consulta do número de sessão, vou deixar então lá por enquanto para ver como se comporta.

 

Valeu José!

  • Moderadores
Postado
59 minutos atrás, OFF-DEV disse:

Entendi, mas creio que alterando o meu próprio fonte pra 0 consigo fazer os tratamentos necessários. minha maior dúvida era mesmo se voltaria 0 ou vazio....

Como a classe é instanciada com valor 0 para esse campo, vai retornar o mesmo se não obter a resposta da dll do SAT.

  • Curtir 1
Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

×
×
  • 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.