Frazato, montei uma rotina, acho que servirá pra vc. Eu imprimo 2 colunas, 9 linhas, são 18 etiquetas por folha A4. Acho que fica fácil de vc colocar 3 colunas, mais linhas etc.
Não sei como anexar as FONTES ao post... 
Se algum moderador estiver no ar, por favor ajude...
Em tempo, peguei a minha rotina e tirei algumas coisas que só fazem sentido no meu sistema. Se alguma coisa estiver faltando ou não muito clara, "prende o grito!" (como diz o Leonardo Sygecom).
Código: Selecionar todos
do whil .t.
oPrinter := Win32Prn():new(printer)
oPrinter:setPrintQuality(-1)
oPrinter:formtype(9) // A4
eolo=oPrinter:create()
if eolo=.f.
exit
endi
eolo=oPrinter:startDoc()
if eolo=.f.
exit
endi
oprinter:setbkmode(1)
oprinter:setpen(0,2,0)
priv lar,alt,pix
lar=oprinter:pagewidth // captura a largura da página
alt=oprinter:pageheight // ...altura
pix("r") // função abaixo
********** CHECA FONTES
* as fontes devem ser instaladas no Windows
afontes:=oprinter:getfonts()
if !(ascan(afontes,{|aa| upper(aa[1])=="BARRAS BIRO"})>0) .and. ;
(ascan(afontes,{|bb| upper(bb[1])=="ARIAL ROUNDED MT BOLD"})>0)
oPrinter:destroy()
* mensagem = fonte ausente
retu
endi
exit
endd
if eolo=.f.
oPrinter:destroy()
pfs()
* mensagem = incapaz de imprimir
retu
endi
sele nprod
set orde to "001" // campo contem branco ou X (marcado antes pelo usuário)
priv imprime,lado
priv nome00,nome01,nome02,Lnome01
imprime=0
lado=1 // imprime coluna 1 ou 2
do whil .t.
seek "X"
if !found()
exit
endi
for x=1 to copias // usuário escolhe antes quantas cópias quer
if imprime=18 // são 18 etiquetas em cada folha, 2 COLUNAS de 9
oprinter:newpage()
imprime=0
lado=1
endi
imprime++
oPrinter:SetFont('ARIAL ROUNDED MT BOLD', 23, {3,33}, 400 )
oPrinter:setColor(preto00) // oPrinter:setColor(preto75)
* nprod->nnome contem o nome do produto, com 60 caracteres
* na etiqueta, vai sair em 1 ou 2 linhas, pra acomodar
nome00=alltrim(nprod->nnome)+" "
do whil .t. // tira brancos duplicados
if at(" ",nome00)=0
exit
endi
nome00=strtran(nome00," "," ")
endd
nome01:=""
nome02:=""
Lnome01=.t.
do whil .t.
if len(nome00)=0
exit
endi
if oprinter:gettextwidth(nome01+substr(nome00,1,at(" ",nome00)-1))<(1100*pix) .and. Lnome01=.t.
if len(nome01)#0
nome01=nome01+" "
endi
nome01=nome01+substr(nome00,1,at(" ",nome00)-1)
nome00=substr(nome00,at(" ",nome00)+1,len(nome00))
else
Lnome01=.f.
if len(nome02)#0
nome02=nome02+" "
endi
if oprinter:gettextwidth(nome02+substr(nome00,1,at(" ",nome00)-1))<(1100*pix)
nome02=nome02+substr(nome00,1,at(" ",nome00)-1)
nome00=substr(nome00,at(" ",nome00)+1,len(nome00))
else
exit
endi
endi
endd
* imprime nome linha 1
lar=iif(lado=1,1117*pix,2357*pix)
alt=(119*pix)+((round(imprime/2,0)-1)*(354*pix))
setpos(lar,alt)
oPrinter:TextOutat(lar,alt,hb_oemtoansi(nome01),.f.,.f.,alinha(1)) // função abaixo
* imprime nome linha 2
lar=iif(lado=1,1117*pix,2357*pix)
alt=(218*pix)+((round(imprime/2,0)-1)*(354*pix))
setpos(lar,alt)
oPrinter:TextOutat(lar,alt,hb_oemtoansi(nome02),.f.,.f.,alinha(1))
* código de barras
priv xxxxx:=alltrim(str(nprod->nbarr))
if len(xxxxx)=13
xxxxx:=barraean13(xxxxx)
elseif len(xxxxx)=8
xxxxx:=barraean8(xxxxx)
else
xxxxx=padl(xxxxx,13,"0")
xxxxx:=barraean13(xxxxx)
endi
* número do código de barras
oPrinter:SetFont('Barras Biro',20,{3,7}, 400 )
oPrinter:setColor(preto00)
lar=iif(lado=1,19*pix,1259*pix)
alt=(310*pix)+((round(imprime/2,0)-1)*(354*pix))
setpos(lar,alt)
oPrinter:TextOutat(lar,alt,xxxxx,.f.,.f.,alinha(0))
* imprime código de barras em número
oprinter:SetFont('VERDANA', 5, {3,45}, 400 )
oPrinter:setColor(preto00)
lar=iif(lado=1,19*pix,1259*pix)
alt=(334*pix)+((round(imprime/2,0)-1)*(354*pix))
setpos(lar,alt)
oPrinter:TextOutat(lar,alt,hb_oemtoansi(alltrim(str(nprod->nbarr))),.f.,.f.,alinha(0))
* imprime valor
oPrinter:SetFont('ARIAL ROUNDED MT BOLD', 27, {3,15}, 700 )
oPrinter:setColor(preto00)
lar=iif(lado=1,1129*pix,2369*pix)
alt=(334*pix)+((round(imprime/2,0)-1)*(354*pix))
setpos(lar,alt)
* nprod->nprom = preço promoção
* nprod->nprec = preço normal
if strzero(nprod->nprom,7,2)=="0000.00"
oPrinter:TextOutat(lar,alt,hb_oemtoansi("R$"+tran(nprod->nprec,"@E 9,999.99")),.f.,.f.,alinha(1))
else
oPrinter:TextOutat(lar,alt,hb_oemtoansi(".R$"+tran(nprod->nprom,"@E 9,999.99")),.f.,.f.,alinha(1))
endi
* imprime linha horizontal separadora
lar=oprinter:pagewidth
alt=(345*pix)+((round(imprime/2,0)-1)*(354*pix))
setpos(lar,alt)
oprinter:line(1,alt,lar,alt)
if lado=1
* imprime linha separadora vertical
lar=1200*pix
alt=(345*pix)+((round(imprime/2,0)-1)*(354*pix))
oprinter:line(lar,1,lar,alt)
endi
lado=iif(lado=1,2,1)
next
* desmarca o X no produto
repl marca with " "
dbcommit()
endd
oPrinter:endDoc()
oPrinter:destroy()
function pix(orienta)
* número de pixels disponíveis na folha depende da QUALIDADE de impressão
* as variáveis LAR e ALT contêm os pixels em cada caso
if orienta="r" // retrato
if (abs(int(lar/1)-2480)<20) .and. (abs(int(alt/1)-3507)<20)
* rascunho
pix=1
elseif (abs(int(lar/2)-2480)<20) .and. (abs(int(alt/2)-3507)<20)
* regular
pix=2
elseif (abs(int(lar/3)-2480)<20) .and. (abs(int(alt/3)-3507)<20)
* bom
pix=3
elseif (abs(int(lar/4)-2480)<20) .and. (abs(int(alt/4)-3507)<20)
* ótimo
pix=4
else
pix=4
endi
elseif orienta="p" // paisagem
if (abs(int(lar/1)-3507)<20) .and. (abs(int(alt/1)-2480)<20)
pix=1
elseif (abs(int(lar/2)-3507)<20) .and. (abs(int(alt/2)-2480)<20)
pix=2
elseif (abs(int(lar/3)-3507)<20) .and. (abs(int(alt/3)-2480)<20)
pix=3
elseif (abs(int(lar/4)-3507)<20) .and. (abs(int(alt/4)-2480)<20)
pix=4
else
pix=4
endi
endi
function alinha(x)
* alinhamento à direita, esquerda e centro
priv y
if alinha32==100 // xHarbour 100
y=x
elseif alinha32==121 // xHarbour 121
if x=0
y=0
elseif x=1
y=2
elseif x=2
y=6
endi
endi
retu y
* funções ean8, ean13 etc estão em anexo ao post
Código: Selecionar todos
* Codigo de Barras Facil
*
* Estas funcoes para impressão de codigo de barras devem ser usadas com
* a fonte BARRAS2.TTF (Barras Biro).
*
* Esta fonte possui apenas as seguintes letras:
* f - espaco fino
* F - barra fina
* m - espaco medio
* M - barra media
* g - espaco grosso
* G - barra grossa
* s - espaco super grosso
* S - barra super grossa
* x - espaco extra grosso
* X - barra extra grossa
*
* As funcoes abaixo apenas geram sequencias de fFmMgGsSxX que vao
* formar as barras.
*
* Neste PRG seguem 5 exemplos de funcoes para geracao do codigo de
* barras 2 de 5 industrial, 2 de 5 intercalado, 3 de 9, EAN8, EAN13 e 128B.
*
* Para usar as funcoes abaixo basta chamar a funcao, passando o
* codigo desejado. Selecionar a fonte Barras Biro e o tamanho apropriado.
* Se a barra ficar muito estreita crie outra linha identica e cole
* embaixo.
*
* Exemplos:
*
* Barra25("1234567890") && Fonte Barras Biro, Tamanho 20
* Barra25i("1234567890") && Fonte Barras Biro, Tamanho 20
* Barra39("*1234567890*") && Fonte Barras Biro, Tamanho 20
*
*********************************************************************
* IMPORTANTE: *
* SEMPRE FACA MUITOS TESTES DE LEITURA COM VARIOS CODIGOS ANTES DE *
* LIBERAR A IMPRESSAO DE BARRAS PARA SEUS CLIENTES. *
*********************************************************************
*
* Esta fonte (BARRAS2.TTF Barras Biro) e as funcoes Barra25, Barra25i,
* Barra39, BarraEAN8, BarraEAN13 e Barra128B podem ser livremente usadas e
* alteradas.
*
* Claudio Gaspar Martins (cgmartins@biro.com.br)
* Biro Processamento de Dados Ltda
* Novo Hamburgo - RS - Brasil
* Dezembro, 1999
*
*
* Historico das revisoes (YYYY/MM/DD):
* 2001/02/28 - Corrigida tabela A nas funcoes EAN13 e EAN8
* 2003/08/21 - Adicionada função Barra128b para geração de barras padrão 128B
* Contribuição de Ezequiel Júnior Zemolin (ezequiel@slcagricola.com.br)
*
*
***
*
* Barra 2 de 5 Industrial
*
*
FUNCTION Barra25( tcNumero )
*LOCAL lnT, lcRetorno, lnTamanho
PRIV lnT, lcRetorno, lnTamanho
*LOCAL ARRAY laBarras(10)
priv laBarras[10]
lcRetorno = "GfGfFf" && Sequencia inicial
lnTamanho = LEN(tcNumero)
*-- Sequencias fixas
laBarras[1] = "FfFfGfGfFf"
laBarras[2] = "GfFfFfFfGf"
laBarras[3] = "FfGfFfFfGf"
laBarras[4] = "GfGfFfFfFf"
laBarras[5] = "FfFfGfFfGf"
laBarras[6] = "GfFfGfFfFf"
laBarras[7] = "FfGfGfFfFf"
laBarras[8] = "FfFfFfGfGf"
laBarras[9] = "GfFfFfGfFf"
laBarras[10] = "FfGfFfGfFf"
FOR lnT = 1 TO lnTamanho
lcRetorno = lcRetorno + laBarras[VAL(SUBSTR(tcNumero, lnT, 1)) + 1]
NEXT
*-- Acrescenta sequencia de finalizacao
lcRetorno = lcRetorno + "GfFfGf"
RETURN lcRetorno
***
*
* Barra 2 de 5 Intercalado
*
*
FUNCTION Barra25i( tcNumero )
*-- Variaveis
LOCAL lnT, lnU, lcBarras, lcEspacos, lcRetorno, lnTamanho
*LOCAL ARRAY laBarras(10)
priv laBarras[10]
lcRetorno = "FfFf" && Sequencia inicial
lnTamanho = LEN(tcNumero)
*-- Sequencias
laBarras[1] = "00110"
laBarras[2] = "10001"
laBarras[3] = "01001"
laBarras[4] = "11000"
laBarras[5] = "00101"
laBarras[6] = "10100"
laBarras[7] = "01100"
laBarras[8] = "00011"
laBarras[9] = "10010"
laBarras[10] = "01010"
*-- Se quantidade de caracteres nao for par coloca 0 na frente
IF lnTamanho % 2 <> 0
tcNumero = "0" + tcNumero
ENDIF
FOR lnT = 1 TO lnTamanho STEP 2
*-- Pega os 0 e 1
lcBarras = laBarras[VAL(SUBSTR(tcNumero, lnT, 1)) + 1]
lcEspacos = laBarras[VAL(SUBSTR(tcNumero, lnT + 1, 1)) + 1]
*-- Combima as barras e os espacos
FOR lnU = 1 TO 5
lcRetorno = lcRetorno + IIF(SUBSTR(lcBarras, lnU, 1) == "0", "F", "G")
lcRetorno = lcRetorno + IIF(SUBSTR(lcEspacos, lnU, 1) == "0", "f", "g")
NEXT
NEXT
*-- Acrescenta sequencia de finalizacao
lcRetorno = lcRetorno + "GfFf"
RETURN lcRetorno
***
*
* Barra 3 de 9
*
* OBSERVACAO: Alguns leitores exigem o * como prefixo e sufixo do codigo
*
*
FUNCTION Barra39( tcNumero )
LOCAL lnT, lnPosicao, lcRetorno, lnTamanho, lcCaracteres
*LOCAL ARRAY laBarras(44)
priv laBarras[44]
lcRetorno = ""
lnTamanho = LEN(tcNumero)
lcCaracteres = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ-.#*$/+%"
*-- Sequencias
laBarras[1] = "GfFgFfFfGf"
laBarras[2] = "FfGgFfFfGf"
laBarras[3] = "GfGgFfFfFf"
laBarras[4] = "FfFgGfFfGf"
laBarras[5] = "GfFgGfFfFf"
laBarras[6] = "FfGgGfFfFf"
laBarras[7] = "FfFgFfGfGf"
laBarras[8] = "GfFgFfGfFf"
laBarras[9] = "FfGgFfGfFf"
laBarras[10] = "FfFgGfGfFf"
laBarras[11] = "GfFfFgFfGf"
laBarras[12] = "FfGfFgFfGf"
laBarras[13] = "GfGfFgFfFf"
laBarras[14] = "FfFfGgFfGf"
laBarras[15] = "GfFfGgFfFf"
laBarras[16] = "FfGfGgFfFf"
laBarras[17] = "FfFfFgGfGf"
laBarras[18] = "GfFfFgGfFf"
laBarras[19] = "FfGfFgGfFf"
laBarras[20] = "FfFfGgGfFf"
laBarras[21] = "GfFfFfFgGf"
laBarras[22] = "FfGfFfFgGf"
laBarras[23] = "GfGfFfFgFf"
laBarras[24] = "FfFfGfFgGf"
laBarras[25] = "GfFfGfFgFf"
laBarras[26] = "FfGfGfFgFf"
laBarras[27] = "FfFfFfGgGf"
laBarras[28] = "GfFfFfGgFf"
laBarras[29] = "FfGfFfGgFf"
laBarras[30] = "FfFfGfGgFf"
laBarras[31] = "GgFfFfFfGf"
laBarras[32] = "FgGfFfFfGf"
laBarras[33] = "GgGfFfFfFf"
laBarras[34] = "FgFfGfFfGf"
laBarras[35] = "GgFfGfFfFf"
laBarras[36] = "FgGfGfFfFf"
laBarras[37] = "FgFfFfGfGf"
laBarras[38] = "GgFfFfGfFf"
laBarras[39] = "FgGfFfGfFf"
laBarras[40] = "FgFfGfGfFf"
laBarras[41] = "FgFgFgFfFf"
laBarras[42] = "FgFgFfFgFf"
laBarras[43] = "FgFfFgFgFf"
laBarras[44] = "FfFgFgFgFf"
FOR lnT = 1 TO lnTamanho
lnPosicao = AT(SUBSTR(tcNumero, lnT, 1), lcCaracteres)
IF lnPosicao > 0
lcRetorno = lcRetorno + laBarras[lnPosicao]
ENDIF
NEXT
RETURN lcRetorno
***
*
* Barras EAN13
*
*
FUNCTION BarraEAN13( tcNumero )
LOCAL lnT, lcRetorno, lcSequencia
*LOCAL ARRAY laBarras(4, 10)
priv laBarras[4, 10]
lcRetorno = "FfF"
*-- Deve sempre ter 13 caracteres
IF LEN(tcNumero) <> 13
RETURN ""
ENDIF
*-- Tabela A
laBarras[1, 1] = "fffFFfF"
laBarras[1, 2] = "ffFFffF"
laBarras[1, 3] = "ffFffFF" && Corrigido em 20010228
laBarras[1, 4] = "fFFFFfF"
laBarras[1, 5] = "fFfffFF"
laBarras[1, 6] = "fFFfffF"
laBarras[1, 7] = "fFfFFFF"
laBarras[1, 8] = "fFFFfFF"
laBarras[1, 9] = "fFFfFFF"
laBarras[1, 10] = "fffFfFF"
*-- Tabela B
laBarras[2, 1] = "fFffFFF"
laBarras[2, 2] = "fFFffFF"
laBarras[2, 3] = "ffFFfFF"
laBarras[2, 4] = "fFffffF"
laBarras[2, 5] = "ffFFFfF"
laBarras[2, 6] = "fFFFffF"
laBarras[2, 7] = "ffffFfF"
laBarras[2, 8] = "ffFfffF"
laBarras[2, 9] = "fffFffF"
laBarras[2, 10] = "ffFfFFF"
*-- Tabela C
laBarras[3, 1] = "FFFffFf"
laBarras[3, 2] = "FFffFFf"
laBarras[3, 3] = "FFfFFff"
laBarras[3, 4] = "FffffFf"
laBarras[3, 5] = "FfFFFff"
laBarras[3, 6] = "FffFFFf"
laBarras[3, 7] = "FfFffff"
laBarras[3, 8] = "FfffFff"
laBarras[3, 9] = "FffFfff"
laBarras[3, 10] = "FFFfFff"
*-- Tabela para definir primeiro caracter
laBarras[4, 1] = "111111"
laBarras[4, 2] = "112122"
laBarras[4, 3] = "112212"
laBarras[4, 4] = "112221"
laBarras[4, 5] = "121122"
laBarras[4, 6] = "122112"
laBarras[4, 7] = "122211"
laBarras[4, 8] = "121212"
laBarras[4, 9] = "121221"
laBarras[4, 10] = "122121"
*-- Pega a sequencia de tabela a usar
lcSequencia = laBarras[4, VAL(SUBSTR(tcNumero, 1, 1)) + 1]
*-- Apura do 2' ao 7' caracter
FOR lnT = 2 TO 7
lcRetorno = lcRetorno +;
laBarras[VAL(SUBSTR(lcSequencia, lnT - 1, 1)),;
VAL(SUBSTR(tcNumero, lnT, 1)) + 1]
NEXT
*-- Coloca o meio
lcRetorno = lcRetorno + "fFfFf"
*-- Apura do 8' ao 13'
FOR lnT = 8 TO 13
lcRetorno = lcRetorno +;
laBarras[3, VAL(SUBSTR(tcNumero, lnT, 1)) + 1]
NEXT
*-- Acrescenta sequencia de finalizacao
lcRetorno = lcRetorno + "FfF"
RETURN lcRetorno
***
*
* Barras EAN8
*
*
FUNCTION BarraEAN8( tcNumero )
LOCAL lnT, lcRetorno
*LOCAL ARRAY laBarras(2, 10)
priv laBarras[2, 10]
lcRetorno = "FfF"
*-- Deve sempre ter 8 caracteres
IF LEN(tcNumero) <> 8
RETURN ""
ENDIF
*-- Tabela A
laBarras[1, 1] = "fffFFfF"
laBarras[1, 2] = "ffFFffF"
laBarras[1, 3] = "ffFffFF" && Corrigido em 20010228
laBarras[1, 4] = "fFFFFfF"
laBarras[1, 5] = "fFfffFF"
laBarras[1, 6] = "fFFfffF"
laBarras[1, 7] = "fFfFFFF"
laBarras[1, 8] = "fFFFfFF"
laBarras[1, 9] = "fFFfFFF"
laBarras[1, 10] = "fffFfFF"
*-- Tabela C
laBarras[2, 1] = "FFFffFf"
laBarras[2, 2] = "FFffFFf"
laBarras[2, 3] = "FFfFFff"
laBarras[2, 4] = "FffffFf"
laBarras[2, 5] = "FfFFFff"
laBarras[2, 6] = "FffFFFf"
laBarras[2, 7] = "FfFffff"
laBarras[2, 8] = "FfffFff"
laBarras[2, 9] = "FffFfff"
laBarras[2, 10] = "FFFfFff"
*-- Apura do 1' ao 4' caracter
FOR lnT = 1 TO 4
lcRetorno = lcRetorno +;
laBarras[1, VAL(SUBSTR(tcNumero, lnT, 1)) + 1]
NEXT
*-- Coloca o meio
lcRetorno = lcRetorno + "fFfFf"
*-- Apura do 5' ao 8'
FOR lnT = 5 TO 8
lcRetorno = lcRetorno +;
laBarras[2, VAL(SUBSTR(tcNumero, lnT, 1)) + 1]
NEXT
*-- Acrescenta sequencia de finalizacao
lcRetorno = lcRetorno + "FfF"
RETURN lcRetorno
***
*
* Barras Padrão 128-B
* Contribuição de Ezequiel Júnior Zemolin (ezequiel@slcagricola.com.br)
*
*
FUNCTION Barra128B( tcNumero )
LOCAL lnT, lnPosicao, lcRetorno, lnTamanho, lcCaracteres, lnCheck
*LOCAL ARRAY laBarras(106)
priv laBarras[106]
lcRetorno = "MfFmFs"
lnTamanho = LEN(tcNumero)
lnCheck = 104
lcCaracteres = " !^#$%&~()*+,-.;0123456789Çç<=>:@ABCDEFGHIJKLMNOPQRSTUVWXYZ']["+;
["_~abcdefghijklmnopqrstuvwxyz]
*-- Sequencias
laBarras[1] = "MfMmMm"
laBarras[2] = "MmMfMm"
laBarras[3] = "MmMmMf"
laBarras[4] = "FmFmMg"
laBarras[5] = "FmFgMm"
laBarras[6] = "FgFmMm"
laBarras[7] = "FmMmFg"
laBarras[8] = "FmMgFm"
laBarras[9] = "FgMmFm"
laBarras[10] = "MmFmFg"
laBarras[11] = "MmFgFm"
laBarras[12] = "MgFmFm"
laBarras[13] = "FfMmGm"
laBarras[14] = "FmMfGm"
laBarras[15] = "FmMmGf"
laBarras[16] = "FfGmMm"
laBarras[17] = "FmGfMm"
laBarras[18] = "FmGmMf"
laBarras[19] = "MmGmFf"
laBarras[20] = "MmFfGm"
laBarras[21] = "MmFmGf"
laBarras[22] = "MfGmFm"
laBarras[23] = "MmGfFm"
laBarras[24] = "GfMfGf"
laBarras[25] = "GfFmMm"
laBarras[26] = "GmFfMm"
laBarras[27] = "GmFmMf"
laBarras[28] = "GfMmFm"
laBarras[29] = "GmMfFm"
laBarras[30] = "GmMmFf"
laBarras[31] = "MfMfMg"
laBarras[32] = "MfMgMf"
laBarras[33] = "MgMfMf"
laBarras[34] = "FfFgMg"
laBarras[35] = "FgFfMg"
laBarras[36] = "FgFgMf"
laBarras[37] = "FfMgFg"
laBarras[38] = "FgMfFg"
laBarras[39] = "FgMgFf"
laBarras[40] = "MfFgFg"
laBarras[41] = "MgFfFg"
laBarras[42] = "MgFgFf"
laBarras[43] = "FfMfGg"
laBarras[44] = "FfMgGf"
laBarras[45] = "FgMfGf"
laBarras[46] = "FfGfMg"
laBarras[47] = "FfGgMf"
laBarras[48] = "FgGfMf"
laBarras[49] = "GfGfMf"
laBarras[50] = "MfFgGf"
laBarras[51] = "MgFfGf"
laBarras[52] = "MfGfFg"
laBarras[53] = "MfGgFf"
laBarras[54] = "MfGfGf"
laBarras[55] = "GfFfMg"
laBarras[56] = "GfFgMf"
laBarras[57] = "GgFfMf"
laBarras[58] = "GfMfFg"
laBarras[59] = "GfMgFf"
laBarras[60] = "GgMfFf"
laBarras[61] = "GfSfFf"
laBarras[62] = "MmFsFf"
laBarras[63] = "SgFfFf"
laBarras[64] = "FfFmMs"
laBarras[65] = "FfFsMm"
laBarras[66] = "FmFfMs"
laBarras[67] = "FmFsMf"
laBarras[68] = "FsFfMm"
laBarras[69] = "FsFmMf"
laBarras[70] = "FfMmFs"
laBarras[71] = "FfMsFm"
laBarras[72] = "FmMfFs"
laBarras[73] = "FmMsFf"
laBarras[74] = "FsMfFm"
laBarras[75] = "FsMmFf"
laBarras[76] = "MsFmFf"
laBarras[77] = "MmFfFs"
laBarras[78] = "SfGfFf"
laBarras[79] = "MsFfFm"
laBarras[80] = "FgSfFf"
laBarras[81] = "FfFmSm"
laBarras[82] = "FmFfSm"
laBarras[83] = "FmFmSf"
laBarras[84] = "FfSmFm"
laBarras[85] = "FmSfFm"
laBarras[86] = "FmSmFf"
laBarras[87] = "SfFmFm"
laBarras[88] = "SmFfFm"
laBarras[89] = "SmFmFf"
laBarras[90] = "MfMfSf"
laBarras[91] = "MfSfMf"
laBarras[92] = "SfMfMf"
laBarras[93] = "FfFfSg"
laBarras[94] = "FfFgSf"
laBarras[95] = "FmMgFm"
laBarras[96] = "FfSfFg"
laBarras[97] = "FfSgFf"
laBarras[98] = "SfFfFg"
laBarras[99] = "SfFgFf"
laBarras[100]= "FfGfSf"
laBarras[101]= "FfSfGf"
laBarras[102]= "GfFfSf"
laBarras[103]= "SfFfGf"
laBarras[104]= "MfFfSm"
laBarras[105]= "MfFmFs"
laBarras[106]= "MfFmGm"
FOR lnT = 1 TO lnTamanho
lnPosicao = AT(SUBSTR(tcNumero, lnT, 1), lcCaracteres)
IF lnPosicao > 0
lcRetorno = lcRetorno + laBarras[lnPosicao]
ENDIF
lnCheck = lnCheck + ((lnPosicao - 1) * lnT)
NEXT
lcRetorno = lcRetorno + laBarras[lnCheck % 103 + 1]
lcRetorno = lcRetorno + "MgGfFfM"
RETURN lcRetorno
*-- Fim
O resultado disso é o seguinte:
