Integração com Impressoras Bematech MP 4200 TH

Olá pessoal, pesquisando um pouco descobri que a impressora bematech 4200 tem uma dll própria pra integração com aplicações web, ou seja, você pode ter uma aplicação rodando na Web e via JSON enviar os comandos para a dll, que automaticamente já manda a impressão. Muito fácil a integração.

[size=14pt][font=arial]Testes realizado no ambiente Windows (Ainda não tem pra Linux).[/font][/size]
Link do vídeo:
https://www.youtube.com/watch?v=NMBfrudWmZk&feature=youtu.be

Resultado:

Links para estudos:

http://blog.unifick.com.br/tutoriais/imprimindo-com-php-na-impressora-nao-fiscal-bematech-mp-20-mi/
http://www.youtube.com/watch?v=dAwWSrcnH2k
http://www.linhadecodigo.com.br/artigo/1296/utilizando-impressora-nao-fiscal-bematech-em-aplicacoes-web-php.aspx
http://partners.bematech.com.br/bemacast/Paginas/post.aspx?idPost=6051
http://partners.bematech.com.br/bemacast/Lists/Postagens/Post.aspx?List=2c0df13e-37e0-46e6-b83f-d836ca771575&ID=6051&Web=5719eb34-5d5c-4bfc-8486-6c37f5e21dd7

Todos os links aqui foi o suficiente para que pudesse fazer essa integração.

Excelente dica. Obrigado por compartilhar.

Valeu, Fred!!

Chic Fred.
Tem a Daruma também que está fazendo um ótimo trabalho.
http://www.desenvolvedoresdaruma.com.br/

Temos também:
http://www.neodynamic.com/products/printing/raw-data/php/

Parabéns Fred…

Somente uma correção.
Pacotes para Linux:
http://partners.bematech.com.br/bemacast/Paginas/post.aspx?idPost=5772

Boa Alexandre, não tinha achado isso! Vou testar! O foco foi em Windows devido a 100% dos clientes usarem windows. Mas preciso esta preparado pra ambos. Muito obrigado!

Abraço.

Obrigado pela dica Celso R. Vou dar uma estudada e ver se consigo implementar em um emulador.

Muito bom Fred!

Ola Amigos,

Estou com formulario mestre X detalhe

Estou implementando essa solução. Ja consegui imprimir o master, e agora como faço para imprimir o detalhe?? (Itens do Pedido)

Grato

Paulo
Garanhuns - PE
Click Informatica

Crie um foreach ou while pra percorrer os nós dos itens do pedido e em seguida monte a estrutura para impressão.

FredKeyster, não entendi,

Atualmente fiz assim:
Criei um botão e coloquei o codigo conforme tem no forum.
fiz um select para pegar as informações da tabela (pedidos).
No caso devo fazer um select ligando para e filhos e colocar no foreach.

Grato
Paulo

Com o número do pedido (id) leia os itens e descarregue na impressora.

Acho que o que o Fred quis dizer com nó, é loop.

Creio que sua dúvida é referente ao o que este tópico esta abordando. Você já consegue imprimir os dados do pedido na impressora bematech ? Ta faltando apenas os itens do pedido correto?

Isso mesmo, FredKeyster
Esta faltando apenas os itens do pedido.

Vou testar assim:
Fazer outro select ligando os itens com o mestre.
E colocar no loop para vê se monta corretamente os registros (itens).

Paulo J.

Faça isso que da certo. É simples. Qualquer coisa posta o código ai e vamos ver em que podemos ajudar.
Abraço.

FredKeyster
Segue codigo utilizado.
O unico problema e que ele não esta fazendo o loop, esta mostrando apenas um registro

// Check for record
$check_sql = “SELECT empresa.id_empresa,empresa.desc_empresa,empresa.endereco,empresa.bairro,empresa.cidade, empresa.uf,empresa.cep,empresa.telefone, empresa.celular,empresa.email, entrada.clientefone, cliente.cli_nome, entrada.pedidoid,entrada.datapedido, entrada.dataprevista, entrada.valorpedido,entrada.pago
FROM empresa,cliente INNER JOIN entrada ON cliente.cli_fone = entrada.clientefone
WHERE (entrada.pedidoid = ‘[pedidoid]’)”;
sc_lookup(rs, $check_sql);

if (isset({rs[0][0]})) // Row found
{
{idempresa} = {rs[0][0]};
{empresa} = {rs[0][1]};
{endereco} = {rs[0][2]};
{bairro} = {rs[0][3]};
{cidade} = {rs[0][4]};
{uf} = {rs[0][5]};
{cep} = {rs[0][6]};
{telefone} = {rs[0][7]};
{celular} = {rs[0][8]};
{email} = {rs[0][9]};
{clifone} = {rs[0][10]};
{cliente} = {rs[0][11]};
{pedido} = {rs[0][12]};
{datapedido} = {rs[0][13]};
{entrega} = {rs[0][14]};
{valor} = {rs[0][15]};
{pago} = {rs[0][16]};

}

$idempresa = {idempresa};
$empresa = {empresa};
$endereco = {endereco};
$bairro = {bairro};
$cidade = {cidade};
$uf = {uf};
$cep = {cep};
$telefone = {telefone};
$celular = {celular};
$email = {email};
$clifone = {clifone};
$cliente = {cliente};
$pedido = {pedido};
$datapedido = {datapedido};
$entrega = {entrega};
$valor = {valor};
$pago = {pago};
$mensagem = " COMPROVANTE DE ENTREGA";

// O Loop Começa aqui

sc_select(resultado,“SELECT produtos.nomeproduto, lava_itens.tipo,lava_itens.precounit,lava_itens.quantidade,lava_itens.total
FROM entrada
INNER JOIN lava_itens ON entrada.pedidoid = lava_itens.pedidoid
INNER JOIN produtos ON lava_itens.produtoid = produtos.produtoid
WHERE (entrada.pedidoid = ‘[pedidoid]’)”);

if (false == {resultado}) // Error while accessing database
{
sc_error_message(‘Erro ao Acesso o Banco de Dados.’);
} else {
while(!$resultado->EOF) {
$prod = $resultado->fields[0];
$tipo = $resultado->fields[1];
$preco = $resultado->fields[2];
$qtde = $resultado->fields[3];
$total = $resultado->fields[4];

  $resultado->MoveNext();

}
$resultado->Close();
}

//carrega o componente pelo GUID (pelo nome não funcionou)
$bema = new COM("{310DBDAC-85FF-4008-82A8-E22A09F9460B}");
//abre porta
$init = $bema->IniciaPorta(“USB”);
//verifica erro
if ($init <= 0) {
echo “erro!”;
exit;
}

//imprime texto com formatação em cada linha
//o espaçamento deve ser ajustado a depender da impressora
$bema->FormataTX

("------------------------------------- \n", 2, 0, 0, 0, 0);
$bema->FormataTX("$empresa \n", 3, 1 , 0, 0, 0);
$bema->FormataTX("$endereco \n", 2, 0 , 0, 0, 0);
$bema->FormataTX("$bairro “.” $cidade"." $uf \n", 2, 0 , 0, 0, 0);
$bema->FormataTX("$telefone “.” $celular \n", 2, 0 , 0, 0, 0);
$bema->FormataTX("$email \n", 2, 0 , 0, 0, 0);
$bema->FormataTX("---------------------------------------- \n", 2, 0, 0, 0, 0);
$bema->FormataTX("$mensagem \n", 2, 0, 0, 0, 0);
$bema->FormataTX("---------------------------------------- \n", 2, 0, 0, 0, 0);
$bema->FormataTX(“Cliente: “.”$clifone - “.”$cliente \n”, 2, 0 , 0, 0, 0);
$bema->FormataTX(“Numero Pedido.:”."$pedido- “.“Data.:”.”$datapedido \n", 2, 0 , 0, 0, 0);
$bema->FormataTX(“PREVISAO ENTREGA .:”."$entrega \n", 2, 0 , 0, 0, 0);
$bema->FormataTX("---------------------------------------- \n", 2, 0, 0, 0, 0);
$bema->FormataTX(“Produto “.” Qtde”." Valor"." Total \n", 2,0 , 0, 0, 0);
$bema->FormataTX("---------------------------------------- \n", 2, 0, 0, 0, 0);
$bema->FormataTX("$prod “.”$qtde"." $preco"." $total \n", 2, 0 , 0, 0, 0);
$bema->FormataTX(" --------------------------------------- \n", 2, 0 ,0, 0, 0);
$bema->FormataTX(" Total da Nota “.” $valor “.“Pago:”.”$pago \n", 2, 0 , 0, 0, 0);
$bema->FormataTX("---------------------------------------- \n", 2, 0, 0, 0, 0);
$bema->FormataTX(“ZigLavanderia v1.0 03/08/2015 \n”, 1, 0 , 1, 0, 0);
$bema->FormataTX("---------------------------------------- \n", 2, 0, 0, 0, 0);

//fecha a porta de impressao
$bema->FechaPorta();

Alterei o codigo assim:
Segue pedaço alterado.

//carrega o componente pelo GUID (pelo nome não funcionou)
$bema = new COM("{310DBDAC-85FF-4008-82A8-E22A09F9460B}");
//abre porta
$init = $bema->IniciaPorta(“USB”);
//verifica erro
if ($init <= 0) {
echo “erro!”;
exit;
}

//imprime texto com formatação em cada linha
//o espaçamento deve ser ajustado a depender da impressora
$bema->FormataTX

("------------------------------------- \n", 2, 0, 0, 0, 0);
$bema->FormataTX("$empresa \n", 3, 1 , 0, 0, 0);
$bema->FormataTX("$endereco \n", 2, 0 , 0, 0, 0);
$bema->FormataTX("$bairro “.” $cidade"." $uf \n", 2, 0 , 0, 0, 0);
$bema->FormataTX("$telefone “.” $celular \n", 2, 0 , 0, 0, 0);
$bema->FormataTX("$email \n", 2, 0 , 0, 0, 0);
$bema->FormataTX("---------------------------------------- \n", 2, 0, 0, 0, 0);
$bema->FormataTX("$mensagem \n", 2, 0, 0, 0, 0);
$bema->FormataTX("---------------------------------------- \n", 2, 0, 0, 0, 0);
$bema->FormataTX(“Cliente: “.”$clifone - “.”$cliente \n”, 2, 0 , 0, 0, 0);
$bema->FormataTX(“Numero Pedido.:”."$pedido- “.“Data.:”.”$datapedido \n", 2, 0 , 0, 0, 0);
$bema->FormataTX(“PREVISAO ENTREGA .:”."$entrega \n", 2, 0 , 0, 0, 0);
$bema->FormataTX("---------------------------------------- \n", 2, 0, 0, 0, 0);
$bema->FormataTX(“Produto “.” Qtde”." Valor"." Total \n", 2,0 , 0, 0, 0);
$bema->FormataTX("---------------------------------------- \n", 2, 0, 0, 0, 0);

sc_select(resultado,“SELECT produtos.nomeproduto, lava_itens.tipo,lava_itens.precounit,lava_itens.quantidade,lava_itens.total
FROM entrada
INNER JOIN lava_itens ON entrada.pedidoid = lava_itens.pedidoid
INNER JOIN produtos ON lava_itens.produtoid = produtos.produtoid
WHERE (entrada.pedidoid = ‘[pedidoid]’)”);

if (false == {resultado}) // Error while accessing database
{
sc_error_message(‘Erro ao Acesso o Banco de Dados.’);
} else {
while(!$resultado->EOF) {
$prod = $resultado->fields[0];
$tipo = $resultado->fields[1];
$preco = $resultado->fields[2];
$qtde = $resultado->fields[3];
$total = $resultado->fields[4];

$bema->FormataTX("$prod “.”$qtde"." $preco"." $total \n", 2, 0 , 0, 0, 0);

  $resultado->MoveNext();

}
$resultado->Close();
}
$bema->FormataTX(" --------------------------------------- \n", 2, 0 ,0, 0, 0);
$bema->FormataTX(" Total da Nota “.” $valor “.“Pago:”.”$pago \n", 2, 0 , 0, 0, 0);
$bema->FormataTX("---------------------------------------- \n", 2, 0, 0, 0, 0);
$bema->FormataTX(“ZigLavanderia v1.0 03/08/2015 \n”, 1, 0 , 1, 0, 0);
$bema->FormataTX("---------------------------------------- \n", 2, 0, 0, 0, 0);

//fecha a porta de impressao
$bema->FechaPorta();

Agora esta fazendo o loop.
O problema esta no alinhamento…
esta fazendo assim
Produto Qtde Valor Total
CALCA JEANS 10 7.00 70.00
CAMISA SOCIAL 3 5.00 15.00

Será que tem haver com a descrição do produto ( maior e menor caracteres ?)
Se for, como posso corrigir ?

Grato

Paulo J.

Na parte “$bema->FormataTX("$prod "."$qtde"." $preco"." $total \n", 2, 0 , 0, 0, 0);

tenta separar por variável, exemplo:

$bema->FormataTX("$prod", 2, 0 , 0, 0, 0); $bema->FormataTX("$qtde", 2, 0 , 0, 0, 0); $bema->FormataTX("$preco", 2, 0 , 0, 0, 0); $bema->FormataTX("$total \n", 2, 0 , 0, 0, 0);

Salvo me engano, os espaços de cada um, o controle esta nessas opções “2, 0 , 0, 0, 0”, no caso teria que sair testando, mudando 0 por 1, ou por 2, etc. Ainda existe mais configurações que essas, teria que pesquisar mais profundamente. Não testei essa dica, faça o teste e nos diga o que evoluiu.

Abraço.

Não chama
erro na pagina