Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

Olá pessoal, recentemente coloquei o AcbrECF no meu sistema. Tenho instalado em um cliente e estou tendo dores de cabeça.

Não sei se é por erro meu, do usuário, da maquina que é um processador onboard meio lenta.

O que sei é que não estou conseguindo resolver... Implementei o ecf no meu sistema a partir da base do exemplo do acbr...

Gostaria de postar a rotina pra vocês me dar uma força...

O Cliente diz que está lançando os itens, e de repente "1" item não sai no cupom, ou no termino cancela o cupom sozinho...

Ou O primeiro intem lançado sai por ultimo, ai o subtotal não bate e cancela o cupom sozinho, ou as vezes dá desconto sozinho, ele disse que a ultima vez ele vez uma venda de 1.000 e deu desconto de 200,00...

Ressaltando, que isso acontece apenas no cupom fiscal, o registro da venda no sistema, no banco de dados, no relatório, sai perfeitamente.. Tanto é que o cliente moustrou pra mim o cupom com erro, e no computador estava certo.

Eu tenho um form de Venda chamado FmVendPrinc, no evento OnShow do Form, eu coloquei a seguinte rotina


procedure TFmVendPrinc.FormShow(Sender: TObject);

begin

  Try

    FmVendPrinc.Enabled := False;

    // Tratar Erro de Cupom Fiscal Pendente

    if FmConfig.ModECF.Checked then

    Begin

      try

        FmFiscMenu.ACBrECF1.TestaPodeAbrirCupom;

      except

        Try

          FmFiscMenu.ACBrECF1.CancelaCupom;

          FmFiscMenu.ACBrECF1.TestaPodeAbrirCupom;

        Except

          ShowMessage('Erro ao Abrir Cupom Fiscal.');

          ModalResult := MrCancel;

          EXIT;

        end;

      end;

    end;

  finally

    FmVendPrinc.Enabled := True;

  end;

end;

// Obs: Primeiramente, ele testa se pode abrir o cupom, se der erro, ele cancela o cupom, e testa denovo...


No Botão de Adicionar Produto, eu carrego o produto escolhido em uma tabela temporaria TClientDataSet chamada

DataTemp.TbVenda, depois de carregado o produto eu executo a seguinte rotina

// Abrir o Cupom e Imprimir os Itens da Venda antes do Fechamento Qdo for

// selecionado Cupom Fiscal no meio da Operaçao da Venda

try

  // Checar se Cupom está livre, se der erro, abre cupom e inseri todos os itens

  FmFiscMenu.ACBrECF1.TestaPodeAbrirCupom;

  Try

    FmFiscMenu.AbreCupomFiscal;

    // Faz a Impressão de Todos os Itens no Cupom Fiscal

    DataTemp.TbVenda.First;

    While not DataTemp.TbVenda.Eof do

    begin

      if (DataTemp.TbVenda.FieldByName('Total').Value > 0) then

        if not ImprimirItemCupomParc then Break;

      DataTemp.TbVenda.Next;

    end;

  Except

    ShowMessage('Erro ao Abrir Cupom Fiscal.');

    Application.ProcessMessages;

  end;

except

  // Impressora estava ligada desde o primeiro item

  // Intao imprimi item por item

  Try

    ImprimirItemCupomParc;

  Except

    ShowMessage('Erro ao Abrir Cupom Parcial');

  end;

End;


// Rotina do ImprimirItemCupomParc

function TFmVendPrinc.ImprimirItemCupomParc: Boolean;

var

  Desc, AliqICMS, Str1, Str2: String;

  I: Integer;

begin

  Result   := False;

  Desc     := '%' ;

  AliqICMS := '';


  // Evita erro de Aliquota de ICMS

  AliqICMS := DataTemp.TbVenda.FieldByName('AliqICMS').AsString;

  if AliqICMS = 'ST' then AliqICMS := 'FF'; // Substituição Tributária


  // Checar se Produto não consta o caractere "\"

  Str1 := DataTemp.TbVenda.FieldByName('Produto').AsString;

  Str2 := '';

  For I := 1 to Length(Str1) do

    if Str1[I] = '\' then Str2 := Str2 + '/'

    else Str2 := Str2 + Str1[I];

  //-----------------------------------------------


  Try

    FmFiscMenu.ACBrECF1.VendeItem( StrZero(DataTemp.TbVenda.FieldByName('CodBar').AsString,13), // Codbar

      Str2, // Produto

      AliqICMS, // Aliquota de ICMS

      StrToFloatDef(DataTemp.TbVenda.FieldByName('Qde').Value, 0), // Qde

      StrToFloatDef(DataTemp.TbVenda.FieldByName('Preco').Value,0 ), // Preço

      StrToFloatDef(DataTemp.TbVenda.FieldByName('Desconto').AsString,0 ), // Desconto

      DataTemp.TbVenda.FieldByName('Unid').AsString, // Unidade

      Desc );

    Result := True;

  Except

    Result := False;

  end;

end;


Na hora de Fechar a venda, o cupom fiscal eu utilizo essa rotina

//--------------------------------------------------------

//######## CUPOM FISCAL - ECF-IF #########################

//--------------------------------------------------------

// Checar se Impressora Fiscal está desativada

if FmConfig.ModECF.Checked and (GetKeyState(vk_scroll) = 0) then

Begin

  if not (UpperCase(FmFiscMenu.bAtivar.Caption) = 'ATIVAR') then

  Begin

    // Abrir o Cupom e Imprimir os Itens da Venda antes do Fechamento Qdo for

    // selecionado Cupom Fiscal no meio da Operaçao da Venda

    try

      FmFiscMenu.ACBrECF1.TestaPodeAbrirCupom;

      Try

        FmFiscMenu.IdentificaConsumidor1Click(self);

        FmFiscMenu.AbreCupomFiscal;

        // Faz a Impressão de Todos os Itens no Cupom Fiscal

        DataTemp.TbVenda.First;

        While not DataTemp.TbVenda.Eof do

        begin

          if (DataTemp.TbVenda.FieldByName('Total').Value > 0) then

            if not FmVendPrinc.ImprimirItemCupomParc then Break;

          DataTemp.TbVenda.Next;

        end;

      Except

        ShowMessage('Erro ao Abrir Cupom Fiscal.');

        Application.ProcessMessages;

      end;

    except

    End;

    // -----------------------------------------------------

    // SubTotaliza Cupom Fiscal

    // -----------------------------------------------------

    Try

      FmAviso.Mensagem(0,1,'>>>>> IMPRESSORA FISCAL <<<<<');

      FmAviso.Mensagem(1,1,'AGUARDE... SUBTOTALIZANDO CUPOM FISCAL.');

      FmAviso.Show;

      Application.ProcessMessages;

      Try

        FiscDesc := (EdSubTotal.Value * (EdDesconto.Value/100)) * -1;

        FiscDesc := FiscDesc - EdBonus.Value;

        FmFiscMenu.ACBrECF1.SubtotalizaCupom(FiscDesc, FiscObs);

      Except

        ShowMessage('Erro ao SubTotalizar Cupom Fiscal.');

        EXIT;

      end;

    finally

      FmAviso.Close;

    end;

    // -----------------------------------------------------

    // Forma Pagto: 01 -> Dinheiro  Permite Vinculado: N

    // Forma Pagto: 02 -> A VISTA  Permite Vinculado: S

    // Forma Pagto: 03 -> CHEQUE  Permite Vinculado: S

    // Forma Pagto: 04 -> CARTAO CREDITO  Permite Vinculado: S

    // Forma Pagto: 05 -> CARTAO DEBITO  Permite Vinculado: S

    // Forma Pagto: 06 -> CHEQUE PRE  Permite Vinculado: S

    // Forma Pagto: 07 -> BOLETO  Permite Vinculado: S

    // Forma Pagto: 08 -> Cheque-Pre  Permite Vinculado: S

    // Forma Pagto: 09 -> Cartao  Permite Vinculado: S

    // Forma Pagto: 10 -> A-Prazo  Permite Vinculado: S

    // Forma Pagto: 11 -> Crediario  Permite Vinculado: S

    // Forma Pagto: 12 -> Ticket  Permite Vinculado: S

    // Forma Pagto: 13 -> Vale  Permite Vinculado: S

    // Forma Pagto: 14 -> Convenio  Permite Vinculado: S

    if not ( FmFiscMenu.ACBrECF1.Modelo in [ecfDataRegis, ecfFiscNET]) then

    Begin

      Try

        FmAviso.Mensagem(0,1,'>>>>> IMPRESSORA FISCAL <<<<<');

        FmAviso.Mensagem(1,1,'AGUARDE... EFETUANDO PAGAMENTO FISCAL.');

        FmAviso.Show;

        Application.ProcessMessages;

        Try

          FiscPgto := UpperCase(DataTemp.TbFormaPgto.FieldByName('Operacao').AsString);

          if (FiscPgto <> 'DINHEIRO') and (FiscPgto <> 'CHEQUE') and

          (FiscPgto <> 'CARTAODEB') and (FiscPgto <> 'CARTAOCRED') then FiscPgto := '10';

          if FiscPgto = 'DINHEIRO'   then FiscPgto := '01';

          if FiscPgto = 'CHEQUE'     then FiscPgto := '03';

          if FiscPgto = 'CARTAOCRED' then FiscPgto := '04';

          if FiscPgto = 'CARTAODEB'  then FiscPgto := '05';

          FmFiscMenu.ACBrECF1.EfetuaPagamento( FiscPgto, EdValorPago.Value, // Cod Pgto, Total

                                               '' ,False ); // Obs, Cupom Vinculado

        Except

          ShowMessage('Erro ao Efetuar Pagamento.');

          EXIT;

        end;

      finally

        FmAviso.Close;

      end;

    end;


    // -----------------------------------------------------

    // Fecha Cupom Fiscal ##################################

    // -----------------------------------------------------

    Try

      FmAviso.Mensagem(0,1,'>>>>> IMPRESSORA FISCAL <<<<<');

      FmAviso.Mensagem(1,1,'AGUARDE... EFETUANDO PAGAMENTO FISCAL.');

      FmAviso.Show;

      Application.ProcessMessages;

      Try

        FmFiscMenu.ACBrECF1.FechaCupom( '', 0 ); //Obs, Indice de BMP

      Except

        ShowMessage('Erro ao Fechar Cupom Fiscal.');

        EXIT;

      end;

    Finally

      FmAviso.Close;

    end;

  end;

end;

//--------------------------------------------------------

Espero o retorno de vocês, muito Obrigado!

  • Fundadores
Postado

Não analisei o código por ser muito extenso... mas não há como o ACBrECF fazer algo sem o mesmo ter sido comandado...

Ative o LOG do ACBrECF e veja os comandos enviados para a impressora...

Uma diferença básica do ACBrECF e as DLLs é que o ACBrECF não irá "travar" a sua interface quando a impressora estiver efetuando algo... isso ocorre poque o ACBrECF roda na mesma Thread que o seu aplicativo, e as DLLs rodam em um processo separado do EXE...

Experimente desativar as chamadas de ProcessMessages do ACBrECF

ACBrECF1.Device.ProcessMessages := False;

O ideal é implementar um mecanismo de fila... Vc pode ler mais sobre isso nesse post (do forum antigo)

http://www.forumweb.com.br/foruns/topic ... -com-acbr/

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

Não analisei o código por ser muito extenso... mas não há como o ACBrECF fazer algo sem o mesmo ter sido comandado...

Ative o LOG do ACBrECF e veja os comandos enviados para a impressora...

Uma diferença básica do ACBrECF e as DLLs é que o ACBrECF não irá "travar" a sua interface quando a impressora estiver efetuando algo... isso ocorre poque o ACBrECF roda na mesma Thread que o seu aplicativo, e as DLLs rodam em um processo separado do EXE...

Experimente desativar as chamadas de ProcessMessages do ACBrECF

ACBrECF1.Device.ProcessMessages := False;

O ideal é implementar um mecanismo de fila... Vc pode ler mais sobre isso nesse post (do forum antigo)

http://www.forumweb.com.br/foruns/topic ... -com-acbr/

Isso que você falou, foi o que eu fiquei pensando hoje a tarde, eu fiz algumas rotinas para esperar um item processar de cada vez...

É bem possivel que seja isso, ainda não instalei no meu cliente... mais eu vou instalar pra ver...

Muito Obrigado pela resposta, e pelo link do forum, vou dar uma estudada...

=DDDDDDDDDDD

Postado

Não analisei o código por ser muito extenso... mas não há como o ACBrECF fazer algo sem o mesmo ter sido comandado...

Ative o LOG do ACBrECF e veja os comandos enviados para a impressora...

Uma diferença básica do ACBrECF e as DLLs é que o ACBrECF não irá "travar" a sua interface quando a impressora estiver efetuando algo... isso ocorre poque o ACBrECF roda na mesma Thread que o seu aplicativo, e as DLLs rodam em um processo separado do EXE...

Experimente desativar as chamadas de ProcessMessages do ACBrECF

ACBrECF1.Device.ProcessMessages := False;

O ideal é implementar um mecanismo de fila... Vc pode ler mais sobre isso nesse post (do forum antigo)

http://www.forumweb.com.br/foruns/topic ... -com-acbr/

Realmente é isso, fiz os testes com o emulador da bematech e constatei o erro. Quando se insere muito rapido os itens. Ele come alguns produtos, ai o total acaba ficando maior que os produtos, ai aparece o desconto do nada...

Vou pegar a dica do link que você me passou... Vamos ver se consigo resolver...

Muito obrigado mesmo

Postado

Usar o comando:

ACBrECF1.Device.ProcessMessages := False;

pode resolver o seu problema...

O mecanismo da Fila, é recomendado para caixas com vendas muito rápidas

Parceiro, esse comando deixa mais rápido o ECF?, o que ele faz mais o menos...

Eu fiz um esquema aqui, de antes de executar qualquer ação no ecf, abrir, fechar, subtotalizar, cancelar...

Para ele aguardar 2 segundos.. e depois fazer a operação, fiz os testes aqui e parece que resolveu...

Eu acho que vou deixar esses 2 segundos, pq eu peguei trauma do problema, e so com isso resolveu, ehsaOheaSOUhesaUOo

vou desativar o que vc falou... Muito Obrigado... =DDDDDDDDDDDD

  • Fundadores
Postado

Acho sua abordagem uma péssima ideia... Seu programa ficará muito muito lento dessa maneira...

Desabilitar o ACBrECF.Device.ProcessMessages impede que o ACBrECF chame esse método do objeto Application internamente

Ou seja, a sua aplicação pode "congelar" a interface, quando o ACBrECF estiver ocupado lendo algo do ECF, mas por causa disso mesmo o teclado tb não será lido... Seria o mesmo efeito que você já observou quando usando as DLLs dos fabricantes

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
Postado

[]'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.
  • Este tópico foi criado há 4852 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.