Ir para conteúdo
  • Cadastre-se

dev botao

Erro SAT : Número de sessão já utilizado nas últimas 100 vezes


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

Recommended Posts

  • Membros Pro
Postado

Bom dia, pessoal estou usando o ACBrSAT na minha aplicação e ontem no final da tarde me deparei com uma situação inusitada..

Começou a dar um erro na emissão e consulta de status do sat :

Citar

NumeroSessao: 234184 - Resposta: 000001|08097|Número de sessão já utilizado nas últimas 100 vezes.||

ERRO: Sessao retornada pelo SAT[1], diferente da enviada [234184]

Não faço nem idéia do que seja, procurei e ví que este número de sessão é um número randômico que é gerado pelo próprio componente.

Como faço pra resolver o problema ?

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

  • Membros Pro
Postado
1 minuto atrás, Daniel Simoes disse:

Você usa um Número Aleatório de Sessão? ( seria o correto)

Se você tem um contador que reinicia com a carga da aplicação, pode ser esse o problema...

 

Muito Obrigado por responder...

Pra falar a verdade nem sabia deste número @Daniel Simoes com certeza não sou eu quem passa este número, pra falara verdade nem sei onde seria isso...

Acredito que o ACBrSAT faz isso de forma automatizada não ?

Como verifico isso ?

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

  • Consultores
Postado
16 minutos atrás, Edevair Viesa Junior disse:

Pra falar a verdade nem sabia deste número @Daniel Simoes com certeza não sou eu quem passa este número, pra falara verdade nem sei onde seria isso...

Acredito que o ACBrSAT faz isso de forma automatizada não ?

Como verifico isso ?

Júnior,

   Verifique se está implementando o evento OnGetNumeroSessao do ACBrSAT. Veja esse tópico:

 

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Membros Pro
Postado
7 minutos atrás, EMBarbosa disse:

Júnior,

   Verifique se está implementando o evento OnGetNumeroSessao do ACBrSAT. Veja esse tópico:

 

Não implemento não, deveria ???

Se sim, como proceder ?

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

  • Fundadores
Postado
16 minutos atrás, Edevair Viesa Junior disse:

Não implemento não, deveria ???

Tudo bem.. não é obrigatória a implementação...

Nesse caso o ACBrSAT usará um número randômico...

function TACBrSAT.GerarnumeroSessao : Integer ;
begin
  fsnumeroSessao := Random(999999);

  if Assigned( fsOnGetNumeroSessao ) then
     fsOnGetNumeroSessao( fsnumeroSessao ) ;

  Result := fsnumeroSessao;
end ;

O que pode estar ocorrendo, é que a "semente" do Random não está sendo redefinida, e com isso ele sortearia a mesma sequencia de números, a cada criação do componente...

Mas isso é feito com uma chamada a Randomize e ela está no ACBrSAT.Inicializar

procedure TACBrSAT.Inicializar ;
begin
  if fsInicializado then exit ;

  if fsModelo = satNenhum then
     raise EACBrSATErro.Create( cACBrSATModeloNaoDefinido );

  fsSATClass.Inicializar ;
  Randomize;                     // <== AQUI

  DoLog( 'ACBrSAT.Inicializado');

  fsInicializado := true ;
  fsAguardandoResposta := False;
  fsPrefixoCFe := CPREFIXO_CFe;

  if (fsConfig.infCFe_versaoDadosEnt <= 0) then
    fsConfig.infCFe_versaoDadosEnt := VerificarVersaoSAT;
end ;

 

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

  • Consultores
  • Solution
Postado
2 minutos atrás, Edevair Viesa Junior disse:

Não implemento não, deveria ???

Se sim, como proceder ?

A princípio, não precisaria de ser implementado não. Mas se você está recebendo esse erro, e não implementou o evento, pode ser que o número da sessão gerado aleatoriamente está "viciado". Isso pode ser gerado pelo hardware (em especial o processador).

A minha sugestão é você implementar esse evento da seguinte maneira:

procedure TForm1.ACBrSAT1GetNumeroSessao(var NumeroSessao: Integer);
Var
  FoiUsado: Boolean;
begin
  Repeat
    FoiUsado := NumeroSessaoJaFoiUsadoNasUltimas100Vezes(NumeroSessao);
    If FoiUsado then
    begin
      NumeroSessao := Random(999999);
    end;
  Until (not FoiUsado);
  
  SalvaNumeroSessaoUsado(NumeroSessao);
end;

function NumeroSessaoJaFoiUsadoNasUltimas100Vezes(const NumeroSessao: Integer): Boolean;
begin
  // Percorre uma lista dos últimos 100 NumeroSessao (arquivo INI, TXT, ou BD) procurando o NumeroSessao.
  // Retorna True se encontrar
end;

Procedure SalvaNumeroSessaoUsado(const NumeroSessao: Integer);
begin
  // Apaga o número mais antigo da lista dos últimos 100 NumeroSessao
  // Salva o atual como mais recente.
end;

 

  • Curtir 1
  • Obrigado 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Membros Pro
Postado
6 horas atrás, EMBarbosa disse:

A princípio, não precisaria de ser implementado não. Mas se você está recebendo esse erro, e não implementou o evento, pode ser que o número da sessão gerado aleatoriamente está "viciado". Isso pode ser gerado pelo hardware (em especial o processador).

A minha sugestão é você implementar esse evento da seguinte maneira:


procedure TForm1.ACBrSAT1GetNumeroSessao(var NumeroSessao: Integer);
Var
  FoiUsado: Boolean;
begin
  Repeat
    FoiUsado := NumeroSessaoJaFoiUsadoNasUltimas100Vezes(NumeroSessao);
    If FoiUsado then
    begin
      NumeroSessao := Random(999999);
    end;
  Until (not FoiUsado);
  
  SalvaNumeroSessaoUsado(NumeroSessao);
end;

function NumeroSessaoJaFoiUsadoNasUltimas100Vezes(const NumeroSessao: Integer): Boolean;
begin
  // Percorre uma lista dos últimos 100 NumeroSessao (arquivo INI, TXT, ou BD) procurando o NumeroSessao.
  // Retorna True se encontrar
end;

Procedure SalvaNumeroSessaoUsado(const NumeroSessao: Integer);
begin
  // Apaga o número mais antigo da lista dos últimos 100 NumeroSessao
  // Salva o atual como mais recente.
end;

 

Show. Funcionou perfeitamente.....

6 horas atrás, Daniel Simoes disse:

Pode ter sido apenas coincidência... isso acontece com frequência ?

@Daniel Simoes realmente acredito ser coincidência sim, somente em 1 cliente e uma única vez ocorreu...

Após a alteração sugerida pelo @EMBarbosa fluiu bem..

Só uma última dúvida, por qual motivo é necessário este número de sessão, já que ele é randômico e pode se repetir, desde que não tenha ocorrido nas últimas 100 sessões ?

  • Curtir 1

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

  • Fundadores
Postado
4 minutos atrás, Edevair Viesa Junior disse:

Só uma última dúvida, por qual motivo é necessário este número de sessão, já que ele é randômico e pode se repetir, desde que não tenha ocorrido nas últimas 100 sessões ?

Ele serve para que você possa identificar que a resposta do SAT, é realmente para a solicitação que você fez...

Isso é particularmente útil, em ambiente multi-thread

no ACBrSAT, existe uma propriedade boleana, chamada, "ValidarNumeroSessaoResposta", que quando ligada, já faz essa verificação e chama "ConsultarNumeroSessao", caso o componente identifique que a Resposta não bate com a esperada...

  • Curtir 1
  • Obrigado 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

  • Membros Pro
Postado
14 minutos atrás, Daniel Simoes disse:

Ele serve para que você possa identificar que a resposta do SAT, é realmente para a solicitação que você fez...

Isso é particularmente útil, em ambiente multi-thread

no ACBrSAT, existe uma propriedade boleana, chamada, "ValidarNumeroSessaoResposta", que quando ligada, já faz essa verificação e chama "ConsultarNumeroSessao", caso o componente identifique que a Resposta não bate com a esperada...

Entendi, agradeço a explicação..

Muito Obrigado a ambos, por favor moderador pode finalizar o tópico...

  • Curtir 1

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

  • Este tópico foi criado há 1743 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.