Codigo de barras em impressora termica

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

Codigo de barras em impressora termica

Mensagem 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 ??
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Codigo de barras em impressora termica

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

Mensagem 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,
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

Mensagem 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...
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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".
Editado pela última vez por Maligno em 16 Jul 2007 19:21, em um total de 1 vez.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem 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
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

kakaka...
Imagem
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).
Editado pela última vez por Pablo César em 16 Jul 2007 19:35, em um total de 1 vez.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

Mensagem 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 ?
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

Mensagem 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 ????
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

Mensagem 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 !
Responder