Página 1 de 2
Codigo de barras em impressora termica
Enviado: 16 Jul 2007 15:09
por rbonotto
Olas,
Tenho uma rotina que imprime codigos de barra em impressoras matricias, mas ai um cliente comprou uma termica...os comandos não casam mesmo...
A impressora é a IM433T da Diebold - no site (
www.mecaf.com.br) eles não falam nada, e também não dão retorno dos emails que eu envio...
Alguém poderia me dar um help ??
Re: Codigo de barras em impressora termica
Enviado: 16 Jul 2007 15:50
por Maligno
rbonotto escreveu:A impressora é a IM433T da Diebold - no site (
www.mecaf.com.br) eles não falam nada, e também não dão retorno dos emails que eu envio...
Informações acerca da programação, manutenção, etc dessa impressora você poderá encontrar num FAQ disponível em PDF no meu site (pub), seção "manuals". Acho que ele tem tudo o que é necessário.
Enviado: 16 Jul 2007 18:44
por rbonotto
Legal !
Só que quando dou o comando direto ele sai o código de barras:
@ prow()+1,01 say chr(27) + chr(124) + chr(48) + chr(120) + chr(2) + chr(2) + chr(48) + ch(49) e ai por diante ok.
Mas quando jogo para dentro de uma variavel ele dá codigo invalido. Ai segue a rotina que fiz:
Código: Selecionar todos
WHILE .T.
clear
mYvar := SPACE(20)
@ 01,01 GET mYvar
READ
if lastkey() == 27; exit; end
mYvar := alltrim(mYvar)
nVez := LEN(mYvar)
fmaVar := ''
cOntar := 1
vArcod := ''
WHILE nVez > 0
iNaVar := LEFT(mYvar,cOntar)
fmaVar := RIGHT(iNaVar,1)
IF ALLTRIM(fmaVar) == '0'
vArcod := vArcod + "CHR(48)+"
ELSEIF (fmaVar) == '1'
vArcod := vArcod + "CHR(49)+"
ELSEIF (fmaVar) == '2'
vArcod := vArcod + "CHR(50)+"
ELSEIF (fmaVar) == '3'
vArcod := vArcod + "CHR(51)+"
ELSEIF (fmaVar) == '4'
vArcod := vArcod + "CHR(52)+"
ELSEIF (fmaVar) == '5'
vArcod := vArcod + "CHR(53)+"
ELSEIF (fmaVar) == '6'
vArcod := vArcod + "CHR(54)+"
ELSEIF (fmaVar) == '7'
vArcod := vArcod + "CHR(55)+"
ELSEIF (fmaVar) == '8'
vArcod := vArcod + "CHR(56)+"
ELSEIF (fmaVar) == '9'
vArcod := vArcod + "CHR(57)+"
END
nVez --
cOntar ++
END
nUmsai := LEN(vArcod) - 1
vArcod := LEFT(vArcod,nUmsai)
set device to print
@ prow()+1,01 say chr(27) + chr(124) + chr(48) + chr(120) + chr(2) + chr(2) + vArcod
set device to SCREEN
END
Que estou fazendo de errado ?
Abs,
Enviado: 16 Jul 2007 18:55
por Pablo César
Caro rbonotto, acredito que o que está faltando é interpretar a sua concatenação, pois você está colocando aspas nos "CHR()". Ou você tira as aspas (que não sei que efeito daria) pois comando de impressão nem sempre dá para concatenar ou então você interpreta com o MARCO "&" a essa variáveL vArcod.
Ficando:
@ prow()+1,01 say chr(27) + chr(124) + chr(48) + chr(120) + chr(2) + chr(2) + (&(vArcod ))
Confirme se deu certo.
Enviado: 16 Jul 2007 19:08
por rbonotto
Pablo César escreveu:Caro rbonotto, acredito que o que está faltando é interpretar a sua concatenação, pois você está colocando aspas nos "CHR()". Ou você tira as aspas (que não sei que efeito daria) pois comando de impressão nem sempre dá para concatenar ou então você interpreta com o MARCO "&" a essa variáveL vArcod.
Ficando:
@ prow()+1,01 say chr(27) + chr(124) + chr(48) + chr(120) + chr(2) + chr(2) + (&(vArcod ))
Confirme se deu certo.
Valeu, mas não deu certo...ela esta interpretando como passando os numeros, sai na impressora codigo invalido e os numero que o usuario digitaria, se eu digitar 5467236 sai na impressora os mesmo 5467236 e não o codigo de barra correspondente...
Enviado: 16 Jul 2007 19:21
por Maligno
A questão é: precisa interpretar dígito por dígito? Não. O usuário entrará números e estes poderão ser passados para a impressora da forma como vieram. Não é necessário mais nada. Enxuguei o seu código. Cole no seu editor de textos, salve e teste do jeito que está.
Código: Selecionar todos
#define MAX_SIZE 20
while .t.
cUsrEnt := Space(MAX_SIZE)
@ 1,1 say "Número: " get cUsrEnt pic Repli("9",MAX_SIZE)
read
if LastKey() = 27
exit
end
set device to print
@ prow()+1,01 say chr( 27) + chr(124) + chr(48) +;
chr(120) + chr( 2) + chr( 2) + cUsrEnt
set device to screen
end
quit
Seu código até daria certo se você fizesse uma macro substituição, que é desnecessária. O que ele faz, afinal, é trocar, por exemplo, a string "0" pelo resultado de &("Chr(48)"), que é a mesma string "0".
Enviado: 16 Jul 2007 19:21
por Pablo César
E se fizer assim ?
Código: Selecionar todos
CVAR:=SPACE(20)
@ 12,00 GET CVAR PICT "@9"
READ
CVAR:=ALLTRIM(CVAR)
VARCOD:=""
FOR I=1 TO LEN(CVAR)
VARCOD:=VARCOD+CHR( ASC( SUBSTR(CVAR,I,1) ) )
NEXT
set device to print
@ prow()+1,01 say chr(27) + chr(124) + chr(48) + chr(120) + chr(2) + chr(2) + VARCOD
set device to SCREEN
Enviado: 16 Jul 2007 19:24
por Maligno
Pablo César escreveu:CHR( ASC( SUBSTR(CVAR,I,1) ) )
Se você fatorar isso, verá que é o mesmo que fazer (10*2)/2. Ou seja, trocou seis por meia dúzia.

Enviado: 16 Jul 2007 19:28
por Pablo César
kakaka...

Pois é... eu tinha percebido quando terminei de postar... realmente não é necessário converter nenhuma string. Mas eu fui no embalo e acabei seguindo a mesma lógica do colega, acreditando que isso seria necessário para impressão de código de barras naquela impressora. Mas de fato Maligno, você tem razão ! Não precisa nada mais que tirar os espaços e colocar o picture de aceitar somente números (se esse for o caso).
Enviado: 16 Jul 2007 19:33
por Maligno
Acontece com as melhores famílias. Eu faço isso o tempo todo.

))
Até esqueci de tirar os espaços. Mas pra efeito de teste está de bom tamanho. Depois o colega dá uma refinada na coisa toda. O importante é que funcione.
Enviado: 16 Jul 2007 19:35
por rbonotto
Rapaizzzzzzz
O troço é chato mesmo, testei com a duas indicações dos colegas mas continua ocorrendo o mesmo: codigo invalido....
Na linha pic Repli("9",MAX_SIZE) tive que mudar para pict(Repli("9",MAX_SIZE)) se não dava erro no compilar, será que fiz algo errado ?
Enviado: 16 Jul 2007 19:46
por Maligno
rbonotto escreveu:O troço é chato mesmo, testei com a duas indicações dos colegas mas continua ocorrendo o mesmo: codigo invalido....
Mas peraí... Pelo que eu vi no manual, você está querendo imprimir código de barras EAN-13, que é codificado. Se você digitar um número qualquer, acho que só vai imprimir por coincidência. Não deve imprimir um número cujo dígito verificador esteja inválido.
Aliás, 20 espaços para o número é exagero. Diminua pra 13, execute o programa do jeito que eu mandei e digite 7898315310012 pra testar. Se imprimir, bingo! É esse o problema. Se não imprimir, queime um pouco de enxofre em cima do computador, dê 3 pulos no lugar e tente de novo.

Enviado: 16 Jul 2007 19:57
por rbonotto
Realmente com o numero que me passou imprime corretamente.
Mas no manual só tem codigo de barras com digito verificador...e o programa meu gera um numero aleatoriamente e este deverá ser impresso no formato de código de barras....
Que o "buana" aqui dever fazer

?
Enviado: 16 Jul 2007 20:13
por Maligno
rbonotto escreveu:o programa meu gera um numero aleatoriamente e este deverá ser impresso no formato de código de barras....
Que o "buana" aqui dever fazer

?
Buana deve gerar um número aleatório de 12 dígitos e calcular o DV, anexando-o antes da impressão. Para o cálculo do DV, eu tenho uma função:
Código: Selecionar todos
function CalcEAN13(cBase)
local nSum := 0
local i
for i := 1 to 12
nSum += Val(SubStr(cBase,i,1)) * if(i%2>0,1,3)
next
return if(nSum%10=0, "0", Str(((Int(nSum/10)+1)*10)-nSum,1))
Falando nisso, eu fiz mas nunca usei essa função. Aproveita pra testar pra mim.

Enviado: 16 Jul 2007 20:18
por rbonotto
Maligno escreveu:rbonotto escreveu:o programa meu gera um numero aleatoriamente e este deverá ser impresso no formato de código de barras....
Que o "buana" aqui dever fazer

?
Buana deve gerar um número aleatório de 12 dígitos e calcular o DV, anexando-o antes da impressão. Para o cálculo do DV, eu tenho uma função:
Código: Selecionar todos
function CalcEAN13(cBase)
local nSum := 0
local i
for i := 1 to 12
nSum += Val(SubStr(cBase,i,1)) * if(i%2>0,1,3)
next
return if(nSum%10=0, "0", Str(((Int(nSum/10)+1)*10)-nSum,1))
Falando nisso, eu fiz mas nunca usei essa função. Aproveita pra testar pra mim.

Com certeza !!
amanhã teseto e dou um alo,
Valeu por esta atenção !