Página 1 de 4

Função para gerar Código de Barras

Enviado: 26 Jul 2007 14:52
por Gilberto M Silva
Caros Colegas,
Estou precisando fazer um programinha que gere um codigo de barras a partir de um número digitado, para etiquetar produtos caseiros.

Gilberto

Enviado: 26 Jul 2007 15:12
por sygecom
Exemplo abaixo:

Código: Selecionar todos

Func geracod
vSOMA=0
vLEO5=78910030
vCOD=0

@ 10,10 get vCOD PICT "9999"
READ

vCOD=STRZERO(vCOD,4)

DO WHILE .T.
   vSOMA=vSOMA+1
   vBARRA1  =SPACE(13)
   vTESTE=STR(vSOMA)

   IF vSOMA=9
      vSOMA=0
      vLEO5=vLEO5+1
   ENDIF
   vBARRA1=STR(vLEO5)+ vCOD +ALLTRIM(vTESTE)
   vLEO=Len((vBARRA1 := AllTrim(vBARRA1)))=13 .and. Right(vBARRA1,1) == CalcEAN13(vBARRA1)

   IF vLEO=.F.
      LOOP
   ELSE
      EXIT
   ENDIF
ENDDO

@ 11,10 SAY vBARRA1  PICT "@!"
INKEY(0)
RETURN

FUNC CalcEAN13(cEAN)
local nSoma := 0
local i
for i := 1 to 12
    nSoma += Val(SubStr(cEAN,i,1)) * if(i%2>0,1,3)
next
return if(nSoma%10=0, "0", Str(((Int(nSoma/10)+1)*10)-nSoma,1))

Enviado: 26 Jul 2007 15:14
por Gilberto M Silva
Tem essa função que achei aqui mesmo no forum, mais não estou conseguindo inplementar ela para gerar o codigo de barras.

clear
a__01 := codbar({'7891058489038','7891035209000','7898112300018'},'Epson',05,01,03)
a__02 := codbar({'7891058489038','7891035209000','7898112300018'},'Epson',05,01,03)
a__03 := codbar({'7891058489038','7891035209000','7898112300018'},'Epson',05,01,04)
a__04 := codbar({'7891058489038','7891035209000','7898112300018'},'Epson',05,01,05)
a__05 := codbar({'7891058489038','7891035209000','7898112300018'},'Epson',05,01,06)
a__06 := codbar({'7891035209000','7898112300018'},'Epson',05,01,06)
*
* 7891058489038 = DIPIRONA SàDICA
* 7891035209000 = VEJA MULTI-USO
* 7898112300018 = ALCOOL ARAUCµRIA
*
set cons off
set devi to prin
@ prow(),pcol() say a__01
@ prow(),pcol() say a__02
@ prow(),pcol() say a__03
@ prow(),pcol() say a__04
@ prow(),pcol() say a__05
@ prow(),pcol() say a__06
set cons on
set devi to scree
return


*ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
*³CodBar ³
*ÃÄÂÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
*³1³aNum³N£mero correspondente ao c¢digo de barras que se quer imprimir ³
*ÃÄÅÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
*³2³cImp³PadrÆo de impressora ([HP] para HP e [Epson] para Epson) ³
*ÃÄÅÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
*³3³nEsq³Quantidade de espa‡os antes de imprimir a primeira coluna (margem) ³
*ÃÄÅÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
*³4³nEsp³Quantidade de espa‡os entre as colunas ³
*ÃÄÅÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
*³5³nAlt³Altura em linhas (6 LPI) total do c¢digo mais o n£mero ³
*ÃÄÅÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
*³R³Retorna um string correspondente … imagem de impressÆo. Deve ser direcio-³
*³ ³nado diretamente para a impressora. ³
*ÃÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
*³D³Imprime etiquetas de c¢digo de barras padrÆo HP e Epson ³
*ÃÄÅÄÄÄÂÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
*³V³1.0³2000.03.02³Maur¡lio J. Franchin Jr. <maurilio@microsafety.com.br> ³
*ÀÄÁÄÄÄÁÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
function CodBar( aNum, cImp, nEsq, nEsp, nAlt )
local I
local J
local cBar
local aTab
local cFlag
local nPos
local cNum
local aBar
local cLF

aNum:= If( ValType( aNum ) # [A], {}, aNum )
nEsq:= If( ValType( nEsq ) # [N], 0, nEsq )
nEsp:= If( ValType( nEsp ) # [N], 1, nEsp )

for I:= 1 to Len( aNum )
if ValType( aNum ) # [C] .or. Len( aNum ) # 13
return []
endif
next

// Esq A Esq B Dir Flag
//------- ------- ------- ------

aTab:= {;
{ [0001101], [0100111], [1110010], [111111] },; // 0
{ [0011001], [0110011], [1100110], [112122] },; // 1
{ [0010011], [0011011], [1101100], [112212] },; // 2
{ [0111101], [0100001], [1000010], [112221] },; // 3
{ [0100011], [0011101], [1011100], [121122] },; // 4
{ [0110001], [0111001], [1001110], [122112] },; // 5
{ [0101111], [0000101], [1010000], [122211] },; // 6
{ [0111011], [0010001], [1000100], [121212] },; // 7
{ [0110111], [0001001], [1001000], [121221] },; // 8
{ [0001011], [0010111], [1110100], [122121] } } // 9

cNum:= []
cBar:= []
aBar:= {}
cImp:= Upper( cImp )
cLF:= Chr( 13 ) +Chr( 10 )

for I:= 1 to Len( aNum )
cFlag:= aTab[Val( Left( aNum, 1 ) ) +1,4]
cBar += [101]

for J:= 1 to 6
nPos:= Val( SubStr( aNum, J +1, 1 ) ) +1
cBar+= aTab[nPos,Val( SubStr( cFlag, J, 1 ) )]
next

cBar+= [01010]

for J:= 1 to 6
nPos:= Val( SubStr( aNum, J +7, 1 ) ) +1
cBar+= aTab[nPos,3]
next

cBar+= [101]

if cImp = [HP]
cNum+= aNum

if I < Len( aNum )
cBar+= Replicate( [0], nEsp * 8 )
cNum+= Space( nEsp )
endif

elseif Upper( cImp ) = [EPSON]
AAdd( aBar, cBar )
cBar:= []
else
return []
endif
next

if cImp = [HP]
cBar:= Space( nEsq ) +Hp( cBar, nAlt ) +cLF +Space( nEsq ) +cNum +cLF
elseif Upper( cImp ) = [EPSON]
cBar:= Epson( aNum, aBar, nEsq, nEsp, nAlt )
endif
return cBar


*ÚÄÄÄÄÄÄÄÄÄÄ¿
*³Epson ³
*ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
static function Epson( aNum, aBar, nEsq, nEsp, nAlt )
local I
local J
local K
local N
local cRet
local cBlo
local cEsp
local bPrefix
local cLF

nAlt:= If( ValType( nAlt ) # [N], 6, nAlt )

cBlo:= Chr( 255 ) +Chr( 255 )
cEsp:= Chr( 0 ) +Chr( 0 )
cLF := Chr( 13 ) +Chr( 10 )

bPrefix:= {|n| Chr( 27 ) +[L] +Chr( n * 2 % 256 ) +Chr( Int( n * 2 / 256 ) ) }

cRet:= Space( nEsq ) +Chr( 27 ) +[A] +Chr( 8 ) // Espa‡amento 9 LPI

for I:= 1 to nAlt
for J:= 1 to Len( aBar )
N:= Len( aBar[J] )

cRet+= [ ] +Eval( bPrefix, N )

for K:= 1 to N
if SubStr( aBar[J], K, 1 ) = [1]
cRet+= cBlo
else
cRet+= cEsp
endif
next

cRet+= Space( nEsp )
next

cRet+= cLF
next

cRet+= Space( nEsq )

for I:= 1 to Len( aNum )
cRet+= [ ] +Transform( aNum, [@R 9.999999.999999] ) +[ ]

if I < Len( aNum )
cRet+= Space( nEsp )
endif
next

cRet+= Chr( 27 ) +[2] // Espa‡amento 6 LPI
cRet+= cLF
return cRet


*ÚÄÄÄÄÄÄÄÄÄÄ¿
*³HP ³
*ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
static function Hp( cBar, nAlt )
local I
local N
local cRet

nAlt:= If( ValType( nAlt ) # [N], 5, nAlt )

N:= Len( cBar )

if N % 8 # 0
cBar+= Replicate( [0], 8 -(N % 8) )
endif

N:= Int( Len( cBar ) / 8)

cRet:= Chr( 27 ) +[*r1A] +Chr( 27 ) +[*b] +LTrim( Str( N ) ) +[W]

for I:= 1 to N
cRet+= Chr( Bin2Dec( SubStr( cBar, (I -1) * 8 +1, 8 ) ) )
next

N:= Round( (nAlt -1) * 12.5 -14, 0 )

for I:= 1 to N
cRet+= Chr( 27 ) +[*b3m0W]
next

cRet+= Chr( 27 ) +[*rbC]
return cRet


*ÚÄÄÄÄÄÄÄÄÄÄ¿
*³Bin2Dec ³
*ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
static function Bin2Dec( cBin )
local I
local J
local nDec

nDec:= 0
J:= Len( cBin )
I:= 0

while J > 0
if SubStr( cBin, J, 1 ) = [1]
nDec+= 2 ^ I
endif

J--
I++
enddo
return nDec

como poderia usa-la???

Enviado: 26 Jul 2007 15:18
por Gilberto M Silva
blz Leonardo vou testar :))

Gilberto

Enviado: 26 Jul 2007 15:56
por sygecom
Gilberto M Silva escreveu:blz Leonardo vou testar :))

Gilberto
A principio é pra funcionar, e lembrando...esta formando o codigo em caracter...vc pode usar VAL(vBARRA1) para converter para numérico.

Re: Função para gerar Código de Barras

Enviado: 26 Jul 2007 16:06
por Maligno
Gilberto M Silva escreveu:Estou precisando fazer um programinha que gere um codigo de barras a partir de um número digitado, para etiquetar produtos caseiros.
Tenho na minha área "pub" (diretório clipper\libs) a biblioteca Light & Dark que gera vários tipos de códigos de barras para vários tipos de impressoras.

Enviado: 26 Jul 2007 16:11
por Maligno
Quero lembrar que, se o seu código não for oficialmente cadastrado no EAN Brasil, o prefixo "789" não faz o menor sentido, e não precisa ser fixo. Assim, você poderá utilizar todo o espectro do código. Ou seja, você terá 12 dígitos para compor o número que quiser. Inclusive, o próprio EAN Brasil prevê esse tipo de situação, e libera o código todo. Só há uma sutiliza no manual deles, mas isso não vem ao caso. Se quiser saber o quê, pergunte.

Enviado: 26 Jul 2007 16:17
por Maligno
sygecom escreveu:

Código: Selecionar todos

Func geracod
vSOMA=0
vLEO5=78910030
vCOD=0

@ 10,10 get vCOD PICT "9999"
READ

vCOD=STRZERO(vCOD,4)

DO WHILE .T.
   vSOMA=vSOMA+1
   vBARRA1  =SPACE(13)
   vTESTE=STR(vSOMA)

   IF vSOMA=9
      vSOMA=0
      vLEO5=vLEO5+1
   ENDIF
   vBARRA1=STR(vLEO5)+ vCOD +ALLTRIM(vTESTE)
   vLEO=Len((vBARRA1 := AllTrim(vBARRA1)))=13 .and. Right(vBARRA1,1) == CalcEAN13(vBARRA1)

   IF vLEO=.F.
      LOOP
   ELSE
      EXIT
   ENDIF
ENDDO

@ 11,10 SAY vBARRA1  PICT "@!"
INKEY(0)
RETURN

FUNC CalcEAN13(cEAN)
local nSoma := 0
local i
for i := 1 to 12
    nSoma += Val(SubStr(cEAN,i,1)) * if(i%2>0,1,3)
next
return if(nSoma%10=0, "0", Str(((Int(nSoma/10)+1)*10)-nSoma,1))
Acho que ficaria mais fácil:

Código: Selecionar todos

function GeraCod(cBase)
cBase := PadR(cBase,12,"0")
return cBase+CalcEAN13(cEAN)
Interessante: tenho a impressão de que já vi essa CalcEAN13() em algum lugar. :)

Re: Função para gerar Código de Barras

Enviado: 26 Jul 2007 16:23
por Maligno
Maligno escreveu:Tenho na minha área "pub" (diretório clipper\libs)
Esqueci de dizer: o link está na minha assinatura, caso não tenha notado.

Enviado: 26 Jul 2007 16:24
por Gilberto M Silva
Maligno como uso essa lib para imprimir o código de barras?

Gilberto.

Enviado: 26 Jul 2007 16:25
por Gilberto M Silva
Usando a função que o leonardo postou, a partir dela como posso imprimir o codigo de barras em uma hp por exemplo.

Enviado: 26 Jul 2007 16:29
por Maligno
Gilberto M Silva escreveu:Maligno como uso essa lib para imprimir o código de barras?
Eu próprio nunca usei, mas vi no NG dela que é coisa muito simples. Veja o exemplo que extraí do NG:

Código: Selecionar todos

// create a UPC 12 barcode
cBar := LDUpc12("123456789012")

// generate it
aCode := LDGenerate(LD_TYP_EPSON9,cBar)

// print it
SET PRINTER TO LPT1
SET CONSOLE OFF
SET PRINTER ON

FOR ni := 1 to len(aCode)
   ?? aCode[ni]
NEXT

EJECT
SET CONSOLE ON
SET PRINTER OFF
SET PRINTER TO
O exemplo está para UPC, mas para ter EAN basta trocar pela função apropriada. Parece moleza.
Aliás, por curiosidade, hoje à noite vou até dar uma testada nessa LIB numa LaserJet que tenho aqui.

Enviado: 26 Jul 2007 16:30
por Gilberto M Silva
Para codificar um produto Ex: panela de barro, ai eu digito um condigo ele me gera o de barras, imprimo e etiquieto o produto e boto na prateleira para vender, quando vender é só ler o codigo de barras e pronto, foi vendido.

Enviado: 26 Jul 2007 16:31
por Gilberto M Silva
blz Maligno, vou testar...
Gilberto

Enviado: 26 Jul 2007 16:32
por Maligno
Gilberto M Silva escreveu:Usando a função que o leonardo postou, a partir dela como posso imprimir o codigo de barras em uma hp por exemplo.
Não. A função do Leonardo não é pra imprimir, mas para criar um código de barras. Por isso intercedi e apresentei uma solução mais "econômica" que a que ele apresentou. Pra imprimir você precisará de algo do tipo da biblioteca que subi pra você no meu site.
Veja se ela funciona. Se funcionar, ótimo. Caso contrário, tenho outra biblioteca aqui. Se não me engano, foi feito pela XPTO. Mas nessa eu não sei se consta o código EAN13.