Ir para conteúdo
  • Cadastre-se

dev botao

Erro Ao Cancelar Cupom Daruma Mach2


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

Recommended Posts

Bom Dia a Todos !

Ontem 04/06/13 estive instalando o sistema de pdv em um cliente que usa a impressora daruma mach2.

a mesma apresentava erros na emissao de comproventes nao fiscais para suprimento e sangria, que consegui corrigir dando um intervalo via Sleep(); apos o comando.

No entanto, a mesma apresentou erros no cancelamento do cupom sendo este erro o seguinte:

-- 11:00:45:239 CancelaCupom
                TX -> [FS]R[200]046[180]
   11:00:45:488 RX <- :[200]0461[CR][252]
-- 11:00:45:488
                TX -> [FS]R[200]050[179]
   11:00:45:535 RX <- :[200]050000137[CR][207]
-- 11:00:45:535
                TX -> [FS]R[200]026[178]
   11:00:45:597 RX <- :[200]026000137[CR][206]
-- 11:00:45:597
                TX -> [FS]F[211][137]
   11:00:45:785 RX <- :0000041[211]000137000000000000000010[CR][213]
-- 11:00:45:800
                TX -> [FS]R[200]056[181]
Daruma: Falha no Envio do CMD. Tentativa: 1 - Erro: 0 - Estendido: 0 -> Erro não documentado Cod.Aviso: 0
   11:00:46:923 RX <-
----------------- ERRO -----------------
Impressora Daruma não está respondendo
----------------------------------------

 

com isso, fiz a depuracao do codigo fonte do componente e descobri que erro ocorria no seguinte trecho:

 

procedure TACBrECFDaruma.CancelaCupom;
var
  RetCmd : String ;
  NumUltimoCupom : String ;
  NumCupomCancelavel: String;
  iNumUltimoCupom, iNumCupomCancelavel: integer;
begin
  fsNumCupom := '';
  AguardaImpressao := True ;

  if fpMFD then
  begin
    RetCmd := EnviaComando( FS + 'R' + #200 + '046');  // Verifica se precisa cancelar CCD;
    if copy(RetCmd, 6, 1) <> '0' then
    begin
      try
        RetCmd := EnviaComando( FS + 'R' + #200 + '050'); // retorna numero do cupom cancelavel
        NumCupomCancelavel  := copy(RetCmd, 6, 6);
        NumUltimoCupom := GetNumCupom;
        iNumUltimoCupom := StrToInt(NumUltimoCupom);
        iNumCupomCancelavel := StrToInt(NumCupomCancelavel);

        while iNumCupomCancelavel < iNumUltimoCupom do
        begin
          NumUltimoCupom := FormatFloat('000000',iNumUltimoCupom);
          EnviaComando(FS + 'F' + #214 , 15); // Fecho o CCD caso ainda não esteja fechado
          EnviaComando(FS + 'F' + #218 + NumUltimoCupom +#255+#255+#255, 15); // Cancela Conprovante Não Fiscal
          EnviaComando(FS + 'F' + #214 , 15); // Fecha Comprovante de estorno Cancela Conprovante Não Fiscal
          dec(iNumUltimoCupom);
        end;

      except
      end;

      EnviaComando(FS + 'F' + #211, 15) ;  // Cancela Cupom

      RespostasComando.Clear;
      RespostasComando.AddField('COO', Copy(fpRespostaComando, 10, 6));
      RespostasComando.AddField('CCF', Copy(fpRespostaComando, 16, 6));
      RespostasComando.AddField('ValorCancelado', Copy(fpRespostaComando, 22, 12));

      // Cancelamento retorna dados do Cupom Fiscal Cancelado e nao do Cancelamento
      fsNumCupom := '' ; // RespostasComando['COO'].AsString;
      fsNumCCF   := '' ; // RespostasComando['CCF'].AsString;
    end
    else
      raise EACBrECFCMDInvalido.Create( ACBrStr('Não existe documento para cancelar.') );
  end

  else if fsNumVersao = '2000' then
     EnviaComando(ESC + #211, 15)
  else
     EnviaComando(ESC + #206, 15) ;

  ZeraTotalApagar;

  FechaRelatorio ;   { Fecha relatorio se ficou algum aberto (só por garantia)}
end;

 

O erro ocorre apos o EnviaComando(FS + 'F' + #211, 15) ;  // Cancela Cupom

depois que é enviado o codigo passa para o retorno dos campos:

      RespostasComando.Clear;
      RespostasComando.AddField('COO', Copy(fpRespostaComando, 10, 6));
      RespostasComando.AddField('CCF', Copy(fpRespostaComando, 16, 6));
      RespostasComando.AddField('ValorCancelado', Copy(fpRespostaComando, 22, 12));

 

que é onde ocorre o erro, dai alterei o codigo colocando um Sleep(); apos o EnviaComando(FS + 'F' + #211, 15) ;  // Cancela Cupom

porem fazendo o teste pelo AcbrEcfTeste o erro nao ocorre, dai pergunto o que pode ser?

Configuracao do componente AcbrECF talvez?

desde ja grato !

 

Link para o comentário
Compartilhar em outros sites

Oi Regys ! Bom Dia !

estou usando a seguinte configuracao:

 

evento onActivate Form Principal:

 

  Memo1.Clear;

  Memo1.Lines.Add('Iniciando Sistema...');

  // configurando os parametros...

  // geral..

  dm.ECF.Device.Baud          := 9600;

  dm.ECF.IntervaloAposComando := 1;

  dm.ECF.LinhasEntreCupons    := 7;

  dm.ECF.MaxLinhasBuffer      := 1;

  dm.ECF.TempoInicioMsg       := 1;

  dm.ECF.TimeOut              := 1;

  dm.ECF.DecimaisPreco        := 2;

  dm.ECF.DecimaisQtd          := 3;

  dm.ECF.ExibeMensagem        := False;

  dm.ECF.ReTentar             := False;

  dm.ECF.IgnorarTagsFormatacao:= False;

  iSleepImp                   := 0;

  // especificos

  // impressora que nao seja bematech

  if (Modelo>2) then

  begin

   dm.ECF.IgnorarTagsFormatacao := True;

   iSleepImp := 1000;

  end;

 

Mesmo alterando para 100 ou 1000, o erro continua ocorrendo pois se da ao executar o comando de envio no codigo do componente.

Fiz o teste alterando a propriedade para esses valores e acontece do mesmo jeito...

Como fiz a alteracao no codigo fonte do componente deu certo, porem no AcbrEcfTeste nao ocorreu, e isso somente ocorre na Daruma na Bematech mesmo estando o valor do "IntervaloAposComando" em zero(0) ele funciona sem problemas.

 

desde ja grato !

Link para o comentário
Compartilhar em outros sites

Pois é, pois utilizando o exemplo acbrecfteste ele cancela normal..

no meu codigo nao tem nada a mais que interfira no evento passado ao componente, dai utilizando o temporizador sleep(1000); apos o envio do comando e antes de receber o retorno, ele funciona normalmente...

o mesmo ocorre com o suprimento/sangria porem nestes nao tem retorno para obtencao de valores, porem no meu codigo é necessario capturar os dados para gerar os registros R da PAF, dai ocorria o mesmo erro, onde tive que colocar o sleep(1000) tambem, porem sendo apenas no codigo da aplicacao e nao do componente.

Grato !

Link para o comentário
Compartilhar em outros sites

  • Consultores

dm.ECF.TimeOut              := 1;

 

Não é muito baixo um TimeOut de apenas 1? Veja esse tópico aqui

[]'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.
Link para o comentário
Compartilhar em outros sites

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