Ir para conteúdo
  • Cadastre-se

dev botao

Componente ACBrECFVirtualNaoFiscal


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

Recommended Posts

  • Membros Pro
Postado

Boa tarde. Gostaria de saber pra que serve o componente ACBrECFVirtual ?

Eu tentei seguir com o exemplo do ACBrECF porém ainda não ficou claro.

Eu estou com o seguinte problema, tenho 3 ou 4 relatórios que uso no sistema não fiscal, todos eles feitos em FortesReport, porém como pesquisei bastante e concluí que FortesReport está diretamente ligado ao uso do spool de impressão do windows, e por isso, fico dependente  do SO para o sistema "funcionar" bem (o cliente não entende que os problemas de não imprimir o cupom é do windows, já que não controle isso) e já perdemos 2 clientes por este motivo e estamos em vias de perder o terceiro, pois bem, preciso usar uma forma que não dependa do spool, pesquisei bastante e conclui que o melhor jeito é a impressão direta, usando EscPosPrinter, mas realmente não consegui usar, fica tudo desconfigurado e realmente vai demandar muito tempo de desenvolvimento para uma coisa tão simples e a empresa optou por não fazer. Lí em algumas mensagens aqui no site do acbr que usam este componente, mas tentei entender como funciona e não ficou nada claro, já que é necessário usar um componente ACBrECF ligado a ele, e isto não é que eu preciso, enfim, este componente pode ser usado para amissão não fiscal, de um cupom completo de venda ? Se não for, qual componente uso pra resolver o meu problema ??

Muito Obrigado !!

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

  • Fundadores
Postado

Acho que o componente que você está procurando é o ACBrPosPrinter...

Faça alguns testes com o Demo da pasta
\ACBr\Exemplos\ACBrSerial\ACBrPosPrinter

Esse componente é muito poderoso, para a criação de relatórios, em Impressoras de Bobinas não fiscais, que suportam o protocolo Esc/Pos ou Similares... No ACBr usamos esse componente para gerar o DANFCe e o Extrato do SAT (com suporte a QRCode).. Você pode baixar um Demo compilado, para testes, em:

 

Para conhecer mais sobre os ECFs Virtuais, veja essa palestra do @EMBarbosa, no último Dia do ACBr

 

 

  • Curtir 3
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

@Daniel Simoes obrigado por responder..

Imaginei que seria este o caminho e ter que refazer os relatórios em ESC POS

Porém usando o componente, não consigo sequer fazer um relatório simples funionar, estou testando em 3 impressoras diferente :

daruma DR800, Elgin I7 e Epson TMT20

As três instaladas com porta srial virtual, conectadas na USB

Dá erro de timeout, conforme imagem abaixo ..

Segue o código que estou usando :

	MD.ACBrPosPrinterNaoFiscal.Modelo := TACBrPosPrinterModelo(g_modelo_esc_pos_sat_nao_fiscal);
	MD.ACBrPosPrinterNaoFiscal.Porta := g_porta_esc_pos_sat_nao_fiscal;
	MD.ACBrPosPrinterNaoFiscal.PaginaDeCodigo := TACBrPosPaginaCodigo(g_pag_cod_esc_pos_nao_fiscal);
	MD.ACBrPosPrinterNaoFiscal.PularLinhas(4);
	MD.ACBrPosPrinterNaoFiscal.Ativar;

	with MD.ACBrPosPrinterNaoFiscal.Buffer do
	begin

		Add('</zera>');
		Add('</ce><a>Comprovante de Compra Cliente Fidelidade</a>');
		Add('</pular_linhas>');
		Add('</linha_simples>');
		Add('</pular_linhas>');
		Add('</fn></ae>Caixa : '+g_desc_caixa);
		Add('</pular_linhas>');
		Add('Operador : '+g_nome_operador);
		Add('</pular_linhas>');
		Add('Num. do Fechamento : '+l_num_fechamento);
		Add('</pular_linhas>');
		Add('</linha_simples>');
		Add('</pular_linhas>');
		Add('<n>Dados do Cliente</n>');
		Add('</pular_linhas>');
		Add('</pular_linhas>');
		Add('Nome : '+v_client_CC0100.FieldByName('C_NOME_CLIENTE').AsString);
		Add('</pular_linhas>');
		Add('RG / Inscr. Est. : '+v_client_CC0100.FieldByName('C_INS_RG_CLIENTE').AsString);
		Add('</pular_linhas>');
		Add('</linha_simples>');
		Add('</pular_linhas>');
		Add('<n>Dados da Venda</n>');
		Add('</pular_linhas>');
		Add('</pular_linhas>');
		Add('Valor da Venda   : R$  ' +
			FormatFloat(F_Formato_String_Valor, l_valor_venda));
		Add('</pular_linhas>');
		Add('Número da Venda : ' +l_cod_venda);
		Add('</pular_linhas>');
		Add('</linha_simples>');
		Add('</pular_linhas>');
		Add(v_mensagem);
		Add('</pular_linhas>');
		Add('</pular_linhas>');
		Add('</pular_linhas>');
		Add('</pular_linhas>');
		Add('</corte>');

	end;

	MD.ACBrPosPrinterNaoFiscal.Imprimir;
	MD.ACBrPosPrinterNaoFiscal.Desativar;

O pior de tudo é que no exemplo do POS Printer funciona...

Não sei o que está errado !

Sem título.png

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

  • Fundadores
Postado

O erro indica que você atribuiu uma Porta inexistente ou ocupada por outra aplicação...

Por favor faça testes com o Demo antes...projeto PosPrinterTeste da pasta Exemplos\Serial 

  • 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.

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

O erro indica que você atribuiu uma Porta inexistente ou ocupada por outra aplicação...

Por favor faça testes com o Demo antes...projeto PosPrinterTeste da pasta Exemplos\Serial 

A porta é existente (COM6 conforme imagem abaixo), pois é a mesma que uso pra emitir o ExtratoSatEscPos, é também a mesma que usei no teste PosPrinterTeste e este funciona perfeitamente, porém coloquei no meu projeto exatamente como está no código acima e não funciona dá erro !

Sem título.png

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

  • Membros Pro
Postado

Acho que descobri o problema, só não sei como resolver..

Eu tentei unir as duas coisas, pra ver onde está o meu problema. Então eu peguei o conteúdo v_teste := MD.ACBrPosPrinterNaoFiscal.Buffer.Text; para ver o que estava sendo enviado a impressora e o resultado foi

'</zera>'#$D#$A'</ce><a>Comprovante de Compra Cliente Fidelidade</a>'#$D#$A'</pular_linhas>'#$D#$A'</linha_simples>'#$D#$A'</pular_linhas>'#$D#$A'</fn></ae>Caixa : Caixa 1'#$D#$A'</pular_linhas>'#$D#$A'Operador : Programador'#$D#$A'</pular_linhas>'#$D#$A'Num. do Fechamento : 000000000000074'#$D#$A'</pular_linhas>'#$D#$A'</linha_simples>'#$D#$A'</pular_linhas>'#$D#$A'<n>Dados do Cliente</n>'#$D#$A'</pular_linhas>'#$D#$A'</pular_linhas>'#$D#$A'Nome : Rhovanion Comercio e Servicos de Informatica Ltda'#$D#$A'</pular_linhas>'#$D#$A'RG / Inscr. Est. : 636.352.640.116'#$D#$A'</pular_linhas>'#$D#$A'</linha_simples>'#$D#$A'</pular_linhas>'#$D#$A'<n>Dados da Venda</n>'#$D#$A'</pular_linhas>'#$D#$A'</pular_linhas>'#$D#$A'Valor da Venda   : R$  25.00'#$D#$A'</pular_linhas>'#$D#$A'Número da Venda : 000000000001901'#$D#$A'</pular_linhas>'#$D#$A'</linha_simples>'#$D#$A'</pular_linhas>'#$D#$A#$D#$A'</pular_linhas>'#$D#$A'</pular_linhas>'#$D#$A'</pular_linhas>'#$D#$A'</pular_linhas>'#$D#$A'</corte>'#$D#$A

Peguei exatamente esta string e usei no PosPrinterTeste no TMemo e deu o mesmo erro...

O que eu fiz, eu alterei #$D#$A para branco e tamém ' para branco, ficando assim :

</zera></ce><a>Comprovante de Compra Cliente Fidelidade</a></pular_linhas></linha_simples></pular_linhas></fn></ae>Caixa : Caixa 1</pular_linhas>Operador : Programador</pular_linhas>Num. do Fechamento : 000000000000074</pular_linhas></linha_simples></pular_linhas><n>Dados do Cliente</n></pular_linhas></pular_linhas>Nome : Rhovanion Comercio e Servicos de Informatica Ltda</pular_linhas>RG / Inscr. Est. : 636.352.640.116</pular_linhas></linha_simples></pular_linhas><n>Dados da Venda</n></pular_linhas></pular_linhas>Valor da Venda   : R$  25.00</pular_linhas>Número da Venda : 000000000001901</pular_linhas></linha_simples></pular_linhas></pular_linhas></pular_linhas></pular_linhas></pular_linhas></corte>

Funcionou perfeitamente....

Então na verdade era so dar um string replace e voilá.. Mas não... Mesmo com o string replace fica assim :

'</zera></ce><a>Comprovante de Compra Cliente Fidelidade</a></pular_linhas></linha_simples></pular_linhas></fn></ae>Caixa : Caixa 1</pular_linhas>Operador : Programador</pular_linhas>Num. do Fechamento : 000000000000074</pular_linhas></linha_simples></pular_linhas><n>Dados do Cliente</n></pular_linhas></pular_linhas>Nome : Rhovanion Comercio e Servicos de Informatica Ltda</pular_linhas>RG / Inscr. Est. : 636.352.640.116</pular_linhas></linha_simples></pular_linhas><n>Dados da Venda</n></pular_linhas></pular_linhas>Valor da Venda   : R$  25.00</pular_linhas>Número da Venda : 000000000001901</pular_linhas></linha_simples></pular_linhas></pular_linhas></pular_linhas></pular_linhas></pular_linhas></corte>'

Com as duas aspas simples, no início e no fim e isso também deu erro no PosPrinterTeste

Como faço pra tirar este raio de aspas simples e enviar como no TMemo do PosPrinterTeste

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

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

Com as duas aspas simples, no início e no fim e isso também deu erro no PosPrinterTeste

Como faço pra tirar este raio de aspas simples e enviar como no TMemo do PosPrinterTeste

Acho que precisamos um pouco mais de informações. Dependendo de onde você está visualizando ou copiando não tem como tirar essas aspas no início e no fim.

Elas estão indicando que o conteúdo é string. Se for isso, não tem como remover.

Talvez seja melhor você verificar os logs do ACBrPosPrinter, tanto do demo como de sua aplicação para comparar.

  • 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
2 horas atrás, EMBarbosa disse:

Acho que precisamos um pouco mais de informações. Dependendo de onde você está visualizando ou copiando não tem como tirar essas aspas no início e no fim.

Elas estão indicando que o conteúdo é string. Se for isso, não tem como remover.

Talvez seja melhor você verificar os logs do ACBrPosPrinter, tanto do demo como de sua aplicação para comparar.

Perfeito @EMBarbosa usando o log descobri que o problema não eram as aspas simples... Foi coincidência..

O que ocorre é que conforme o meu código, o ativar, envio do buffer e impressão estavam ocorrendo muito próximos um do outro.. Bastou colocar 2 sleeps conforme código abaixo entre as operações para funcionar..

	MD.ACBrPosPrinterNaoFiscal.Ativar;
	sleep(500);
	MD.ACBrPosPrinterNaoFiscal.Buffer.Add(l_texto);
	sleep(500);
	MD.ACBrPosPrinterNaoFiscal.Imprimir;

Como no PosPrinterTeste você clica no botão ativar, este tempo não é necessário..

Foi simplesmente incluir o sleep para funcionar, e só percebí isso pq no log os comandos paravam no maio :

Citar

-- 05/04 14:55:22:279 - PularLinhas(4)
-- 05/04 14:55:22:280 - Ativando a porta: COM6
-- 05/04 14:55:22:280 - EnviarStringDevice - Inicializando: [ESC][198]XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXXXXXXX[ESC]2
-- 05/04 14:55:22:280 - EnviarStringDevice( [ESC][198]XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXXXXXXX[ESC]2 [LF] [LF] [LF] [LF])

--------------------------------------------------------------------------------
ATIVAR - 05/04/19 14:55:22:280
  - Modelo.: EscDaruma
  - TimeOut: 3
  - Serial.: COM6 - BAUD=115200 DATA=8 PARITY=N STOP=1 HANDSHAKE= MAXBANDWIDTH=0 SENDBYTESCOUNT=0 SENDBYTESINTERVAL=0
--------------------------------------------------------------------------------

-- 05/04 14:55:22:281 - TX -> [ESC][199]
Aqui para o log e gera o erro

Muito obrigado a todos pela ajuda...

Abs

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

  • Fundadores
  • Solution
Postado

Você pode usar a Tag </lf> para Pulo de Linha

Crio que o problema seja Buffer Overflow, na Serial... Por favor veja explicações sobre isso.. nesse tópico:

 

Experimente definir 8K e intervalo de 100m

  •  ACBrPosPrinter.Device.SendBytesCount := 8192
  • ACBrPosPrinter.Device.SendBytesInterval := 100

 

  • Curtir 2
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
7 minutos atrás, Edevair Viesa Junior disse:

--------------------------------------------------------------------------------
ATIVAR - 05/04/19 14:55:22:280
  - Modelo.: EscDaruma
  - TimeOut: 3
  - Serial.: COM6 - BAUD=115200 DATA=8 PARITY=N STOP=1 HANDSHAKE= MAXBANDWIDTH=0 SENDBYTESCOUNT=0 SENDBYTESINTERVAL=0
-------------------------------------------------------------------------------- 

Sugiro você aumentar esse TimeOut para pelo menos 10. É o padrão que usamos atualmente para comunicação serial.

Além disso, se a informação que o Daniel postou não resolver, ao invés de colocar vários sleeps a cada comando, você pode alterar a propriedade SendBytesInterval para um valor maior que zero.

  • Curtir 2

[]'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
15 minutos atrás, Daniel Simoes disse:

Você pode usar a Tag </lf> para Pulo de Linha

Crio que o problema seja Buffer Overflow, na Serial... Por favor veja explicações sobre isso.. nesse tópico:

 

Experimente definir 8K e intervalo de 100m

  •  ACBrPosPrinter.Device.SendBytesCount := 8192
  • ACBrPosPrinter.Device.SendBytesInterval := 100

 

Na mosca... Rsssss

Exatamente isso,muito Obrigado @Daniel Simoes !! Funcionou perfeito..

 

12 minutos atrás, EMBarbosa disse:

Sugiro você aumentar esse TimeOut para pelo menos 10. É o padrão que usamos atualmente para comunicação serial.

Além disso, se a informação que o Daniel postou não resolver, ao invés de colocar vários sleeps a cada comando, você pode alterar a propriedade SendBytesInterval para um valor maior que zero.

@EMBarbosa onde mudo a configuração do timeout ???

  • Curtir 1

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

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

@EMBarbosa onde mudo a configuração do timeout ???

O componente ACBrPosPrinter que estiver usando tem uma propriedade Device igual ao ACBrECF. Na verdade todos componentes que se comunicam pela porta Serial tem esse objeto device (do tipo TACBrDevice) como uma propriedade. Nele você faz essas configurações.

  • 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

OK. Deu certo a impressão, agora funcionando muito bem, porém é aleatório o erro :

Citar

communication error 9997 timeout during operation

Mesmo alterando o timeout, e é aleatório, o problema é que ficar dando estes erros no cliente é complicado, os caras são brasileiros, já reclamam de tudo, mesmo com tudo tinindo, se ficar dando erro então, aí é dureza..

Segue o trecho do log quando gera o erro :

Citar

Log ACBr

--------------------------------------------------------------------------------
ATIVAR - 06/04/19 15:00:06:819
  - Modelo.: EscDaruma
  - TimeOut: 10
  - Serial.: COM6 - BAUD=9600 DATA=8 PARITY=N STOP=1 HANDSHAKE= MAXBANDWIDTH=0 SENDBYTESCOUNT=8192 SENDBYTESINTERVAL=100
--------------------------------------------------------------------------------

-- 06/04 15:00:06:819 - TX -> [ESC][199]

--------------------------------------------------------------------------------
DESATIVAR - 06/04/19 15:00:10:107
--------------------------------------------------------------------------------
 

Meu Log

06/04/2019 15:00:10.105     - Login : PROGRAMADOR - ***********************

Erro ao IMPRMIR ESC POS !

Erro : Communication error 9997: Timeout during operation

*****Texto Esc Pos Enviado******
</zera>
</fn></ae>Controle Interno
Rhovanion Comércio e Serviços de Informática Ltd
CNPJ: 08.934.603/0001-72     IE: 636352640116
 06 de abril de 2019           Hora :15:00
Op.:PROGRAMADOR/001           <n>Loja: 001</n>
Sem Valor Fiscal   Pedido Num.:000000000002974
</pular_linhas>
</linha_simples>
</ce>#|COD|DESC|QTD|UN| VL UN R$| VL ITEM R$
</linha_simples>
</fn></ae>001 04327 019-CULOTE 6PCS  FEROZ 1.000 UN X R$ 25.00 </ad>R$ 25.00
</pular_linhas>
</linha_simples>
</pular_linhas>
</pular_linhas>
</pular_linhas>
</pular_linhas>
</pular_linhas>
</corte>


***********************

O erro ocorre também usando o componente ACBrExtratoSatEscPos, também aleatório...

O que eu estou fazendo errado pra gerar este erro ??

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

  • Fundadores
Postado

O problema provavelmente é no Driver USB <-> Serial do Fabricante...

Se a impressora tiver uma Porta Serial física, prefira esse tipo de porta...

O ACBr apenas acusa o erro de que a Porta não está acessível 

  • 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
56 minutos atrás, Daniel Simoes disse:

O problema provavelmente é no Driver USB <-> Serial do Fabricante...

Se a impressora tiver uma Porta Serial física, prefira esse tipo de porta...

O ACBr apenas acusa o erro de que a Porta não está acessível 

Ok @Daniel Simoes, muito obrigado por responder. Porém, uma última dúvida, antes de enviar o comando de imprimir tenho como verificar se a porta está acessível ou não ?? Se sim, como faço isso ?

Pois aí posso colocar uma rotina para verificação da porta antes do envio e ficar tentando acessar durante um tempo e retornar o erro se não conseguir !!

Muito Obrigado !!

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

×
×
  • 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.