Ir para conteúdo
  • Cadastre-se

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

Recommended Posts

Postado

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

 

 

  • Fundadores
Postado

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.

Postado

Daniel bom dia ,

Este bug vem de alguns meses , como disse eu estava utilizando a classe antiga , mas estou investigando ainda , ta dando uma trabalheira danada , o interessante é que compilando com a Classe antiga não ocorre estes erros , no mesmo Delphi .

  • Fundadores
Postado

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.

Postado

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;

 

 

 

Postado

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

 

  • Fundadores
Postado (editado)

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.

  • Fundadores
Postado

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.

Postado (editado)

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
  • Fundadores
Postado

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.

  • Fundadores
Postado

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.

Postado

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 .

 

  • Fundadores
Postado

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.

Postado

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 .

Postado

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

 

 

  • Fundadores
Postado (editado)

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.

Postado

Acho que agora estou entendendo oque vc está entendendo !!

Veja , eu abro a aplicação e o ECF esta funcionando perfeitamente trabalhando normal , ai  por algum motivo , o cabo desconecta , a energia acaba etc etc... ai acontece o problema , depois da aplicação já aberta !

  • Fundadores
Postado

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.

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