Ir para conteúdo
  • Cadastre-se

dev botao

Erro Classe ACBrECFSwedaSTX Trunk2


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

Recommended Posts

Bom dia ,

Vinha utilizando uma classe ACBrECFSwedaSTX antiga no meu frente como relato tambem de outros colegas aqui no fórum utilizando a classe antiga , ou seja , a nova eu não conseguia trabalhar com ela onde a mesma em tempo aleatório gerava Acces Violation varias vezes no dia nos clientes e com debug tentei muito debug mas sem sucesso . Como migrei tudo para trunk2 e todos provavelmente vão fazer isso em breve estou passando o Log do Eureka na sequencia de comandos onde gera o Erro da Classe ACBrECFSwedaSTX .

Access_Violation_SwedaSTX.thumb.JPG.4ad2

 

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

De acordo com a sua imagem, o bug pode ser do Delphi... pois a função "PosEx" está na "StrUtils"

Eu estou usando essa classe a um bom tempo, e não notamos problemas de A.V. (uso Lazarus/FPC)

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.

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Analise os parâmetros de entrada em PosEx... pode ser que esteja algo que a função atual não esteja sendo capaz de tratar..

Na ACBrUtil há uma versão de PosEx, que é usada apenas para versões inferiores ao D7... experimente mudar a classe da Sweda e a ACBrUtil, para usar ela...

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.

Link para o comentário
Compartilhar em outros sites

Vamos la em algumas coisa que encontrei referente Classe SwedaSTX ,

1 - Na maioria da vezes , não sei ao certo se todas as vezes , sempre é quando se desliga o ECF ou retira o cabo e o componente fica tentado se conectar sem a resposta do ECF .

2 - Uma coisa que ja documento aqui e é um bug desta classe é que se em procedure TACBrECFSwedaSTX.AbreRelatorioGerencial(Indice: Integer = 2 );  o relatório gerencial não for encontrado pelo motivo de falta de comunicação com o ECF a perda de comunicação o componente entra em looping passando indice = 2 e retornando sempre nil na função AchaRGIndice  neste caso segue correção ;

 

procedure TACBrECFSwedaSTX.AbreRelatorioGerencial(Indice: Integer = 2 );
var
   sDescricao:String;
   RG:TACBrECFRelatorioGerencial;
begin
   { Não existe indice 0 nessa impressora usando esse protocolo}
   { O indice 1 é reservado }
   if ( Indice = 0 ) or ( Indice = 1 ) then
      Indice := 2;


   RG := AchaRGIndice(FormatFloat('00',Indice));
   if RG = nil then
      begin
      CarregaRelatoriosGerenciais ;  // Se não recarregar fica retornando sempre (RG = nil) (Indice := 2)
      raise EACBrECFERRO.create( ACBrStr('Relatório Gerencial: '+IntToStr(Indice)+
                                 ' não foi cadastrado.' ));
      end ;
   sDescricao := PadRight(RG.Descricao,15);
   AguardaImpressao := True;
   EnviaComando('43|'+sDescricao);
end;

 

 

 

Link para o comentário
Compartilhar em outros sites

Daniel , referente novamente a questão AV .

Pra mapear estes retornos coloquei um try  na linha 992 , que é onde esta o AV , assim :

 

     ///// meu teste     

     mylist := tstringlist.create ;
     try
     PosSTX := PosEx( STX , Result, PosETX);  // Acha inicio do proximo Bloco

     mylist.add( '----------------------' );
     mylist.add( 'PosETX     = ' + inttostr(PosETX) );
     mylist.add( 'Retorno    = ' + Retorno );
     mylist.add( 'Result     = ' + Result );
     mylist.add( 'STX        = ' + VartoStr(STX) );
     mylist.add( '----------------------' );
     mylist.SaveToFile( 'c:\TesteSwedaSTX\Normal-' + Formatdatetime('yyyymmdd hhnnss' , now) + '.txt' );

     except
       on e:exception do
          begin
          PosSTX := 100 ;
          mylist.add( '----------------------' );
          mylist.add( 'Exception  = ' + e.message );
          mylist.add( 'PosETX     = ' + inttostr(PosETX) );
          mylist.add( 'Retorno    = ' + Retorno );
          mylist.add( 'Result     = ' + Result );
          mylist.add( 'STX        = ' + VartoStr(STX) );
          mylist.add( '----------------------' );
          mylist.SaveToFile( 'c:\TesteSwedaSTX\Erro-' + Formatdatetime('yyyymmdd hhnnss' , now) + '.txt' );
          end;
     end;
     mylist.Free ;
     
     ///// meu teste

 

 

 

Erro.thumb.JPG.e08f7b94e1f1415c40ebad264

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Humm.. podemos ver que o A.V. ocorre quando o PosETX = 0...isso pode ser o problema.. mas se compararmos esse bloco do "trunk" com o "trunk2" eles estão identicos...

A falha definitivamente é no Delphi (PosEx)... que se perde quando recebe um índice fora da faixa... Veja como está no FPC (há uma verificação do Indice informado)

  Len := length(S);
  if (Offset < 1) or (Offset > SizeUInt(Length(S))) then exit(0);   

 

Podemos aplicar um workaround para a situação, usando:

 992    if PosETX > 0 then
 993       PosSTX := PosEx( STX , Result, PosETX);  // Acha inicio do proximo Bloco    

 

Editado por Daniel Simoes
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.

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Apliquei uma possível correção no SVN, (trunk2)
 

Data: 28/06/2015
-- ACBrECFSwedaStx --  (por: DSA)
[-] Tentativa de correção de A.V. em algumas versões do Delphi
    http://www.projetoacbr.com.br/forum/topic/22492-erro-classe-acbrecfswedastx-trunk2/
[-] Correção para captura de informações pela Serial     

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.

Link para o comentário
Compartilhar em outros sites

Daniel ,

Atualizei agora e efetuei alguns testes e de momento esta bala , não retornou erros estranhos , desliguei o ECF e religuei varias vezes e mandando diversos comandos e maravilha .

Somente a questão do indice de relatório gerencial que não da erro mas ele entra em looping infinito como mencionei acima .

Segue a unit atualizada com a correção do Relatório Gerencial .

Obrigado e vlw .

 ACBrECFSwedaSTX.zip

Editado por marcelo_sp
Link para o comentário
Compartilhar em outros sites

  • Fundadores

Não consegui reproduzir o problema do Relatório Gerencial... Favor informar um passo a passo...

Não compreendi a necessidade da solução proposta...

Observe que a "CarregaRelatoriosGerenciais" já é chamada, quando o código passa por: "AchaRGIndice"

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.

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Notei que o código que você copiou acima estava diferente dos fontes originais... talvez isso explique o problema nos seus fontes...

Achei um pequeno problema, com o "encoding".. Relatórios com acentuação no título na funcionariam.. apliquei uma correção

-- ACBrECFSwedaStx --  (por: DSA)
[-] Ajustes para decodificar Página de Código em AbreRelatorioGerencial

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.

Link para o comentário
Compartilhar em outros sites

Daniel , sim eu realmente alterei o fonte pra recarregar os Relatorios Ger. antes de RG := AchaRGIndice(FormatFloat('00',Indice)); , propositalmente pra não entrar no Raise .

Se eu desligar o ECF antes de ...AbreRelatorioGerencial() ;

RG := AchaRGIndice(FormatFloat('00',Indice));  // Se não recarregar novamente antes os Relatorios Gerenciais fica retornando sempre (RG = nil) (Indice := 2) looping infinito mesmo religando o ECF .

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Repare bem... o seu problema de loop infinito é devido uma outra customização nos seus fontes...

if RG = nil then
      begin
      CarregaRelatoriosGerenciais ;  // Se não recarregar fica retornando sempre (RG = nil) (Indice := 2)
      raise EACBrECFERRO.create( ACBrStr('Relatório Gerencial: '+IntToStr(Indice)+
                                 ' não foi cadastrado.' ));

Você está chamando o CarregaRelatoriosGerenciais dentro do "if RG = nil then"... Isso nunca existiu nos fontes originais

 

Por favor use os fontes originais para testar e reportar Bugs

 

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.

Link para o comentário
Compartilhar em outros sites

Isso foi eu que coloquei propositalmente no fonte que baixei ontem que vc disponibilizou .

procedure TACBrECFSwedaSTX.AbreRelatorioGerencial(Indice: Integer = 2 );
var
   sDescricao:String;
   RG:TACBrECFRelatorioGerencial;
begin
   { Não existe indice 0 nessa impressora usando esse protocolo}
   { O indice 1 é reservado }
   if ( Indice = 0 ) or ( Indice = 1 ) then
      begin
      Indice := 2;
      CarregaRelatoriosGerenciais ; // Eu tinha colocado dentro de (if RG = nil then) mas cai a primeira vez no raise quando desligando o ECF antes , ai eu mudei para ca .
      end;  

   RG := AchaRGIndice(FormatFloat('00',Indice));
   if RG = nil then
      raise EACBrECFERRO.create( ACBrStr('Relatório Gerencial: '+IntToStr(Indice)+
                                 ' não foi cadastrado.' ));
   sDescricao := PadRight(RG.Descricao,15);
   AguardaImpressao := True;
   EnviaComando('43|'+sDescricao);
end;

Testado na Sweda St120 .

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Como disse antes... não consigo reproduzir o problema reportado...

Favor fornecer um passo a passo, porem usando os fontes originais...

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.

Link para o comentário
Compartilhar em outros sites

Atualizei agora e o Looping persiste , vou tentar explicar melhor , vamos la :

1 - Coma a AC ja em execução Desligo o ECF .

2 - Mando o comando AbreRelatorioGerencial... mas ainda não liguei o ECF (Com o ECF Desligado) .

3 - A AC vai me retornando mensagens de falta de comunicação até eu ligar o ECF e estabelecer comunicação , blz isso .

4 - Só que quando estiver comunicando AC x ECF após esta perda de comunicação o Status de RG := AchaRGIndice(FormatFloat('00',Indice)); vai ser sempre = Nil caindo no Raise , ou seja , a função AchaRGIndice vai me retornar sempre Nil e isso acontece porque fpRelatoriosGerenciais de GetRelatoriosGerenciais de ACBrECFClass não é mais Assigned então ele não consegue mais recuperar a lista do objeto fpRelatoriosGerenciais .

 

Considerações ; 

1 - Primeiro ele da os retornos normais de comunicação .

2 - Após eu ligar o ECF e a conexão estabelecer ai os Retornos em looping são o da imagem abaixo :

Retorno_ECF.thumb.JPG.a1df8410f203caec78

 

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Isso provavelmente também ocorrerá em outros modelos...

O correto não seria você tentar carregar os relatórios gerências no início de sua aplicação ?

Editado por Daniel Simoes
  • 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.

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Não aconteceria se você tivesse chamado CarregarRelatorioGerenciais no inicio da sua aplicação... pois nesse caso as informações já estão na lista do componente

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.

Link para o comentário
Compartilhar em outros sites

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