Criando etiquetas com código de barras padrão EAN128


Olá, irei postar um simples exemplo de como imprimir etiquetas com código de barras usando o padrão EAN 128. Estarei usando o componente FWMSPrinter, pois com ele posso enviar para qualquer impressora de etiquetas em rede ou para uma impressora laser, jato de tintas ou para o PDFCreator, ou seja, envio para qualquer lugar, sem desculpas para imprimir. rsrs A etiqueta que irei montar, terá as seguintes proporções: 6 cm de altura x 10 cm de comprimento etiquetacodigobarras Utilizando o componente FWMSPrinter, poderei imprimir direto na impressora ou em arquivo PDF, no meu exemplo, precisarei ter instalado as impressoras no meu computador, estarei utilizando como referência o nome da impressora que está em "Dispositivos e Impressoras" dispositivoseimpressoras Abaixo, veja como ficar preenchido o meu parametro: parametrosetiquetacodigobarrassx6 Agora vamos ao código:

#INCLUDE "RPTDEF.CH"
#INCLUDE "FWPrintSetup.ch"
#INCLUDE "protheus.ch"
#Include 'TopConn.ch'
User Function Etiqueta()
	Local lFinal	:= .T.

	If ValidPerg()
		MsAguarde({|| ImpEtiq() },"Impressão de etiqueta","Aguarde...")
	EndIf

Return

Static Function ImpEtiq()
	Local cQuery	:= ""
	Local cProdDe	:= MV_PAR01
	Local cProdAte	:= MV_PAR02
	Local nQuant	:= MV_PAR03
	Local cImpress  := Alltrim(MV_PAR04) //pego o nome da impressora
	Local cLogo 	:= "\system\logo.jpg"
	Local oFont16	:= TFont():New('Arial',16,16,,.F.,,,,.T.,.F.,.F.)
	Local oFont16N	:= TFont():New('Arial',16,16,,.T.,,,,.T.,.F.,.F.)

	Local lAdjustToLegacy 	:= .F.
	Local lDisableSetup  	:= .T.

	Local nLin		:= 0
	Local nCol		:= 0
	Local nLinC		:= 0
	Local nColC		:= 0
	Local nWidth	:= 0
	Local nHeigth   := 0
	Local lBanner	:= .T.		//Se imprime a linha com o código embaixo da barra. Default .T.
	Local nPFWidth	:= 0
	Local nPFHeigth	:= 0
	Local lCmtr2Pix	:= .T.		//Utiliza o método Cmtr2Pix() do objeto Printer.Default .T.

	MsProcTxt("Identificando a impressora...")

	Private oPrinter := FWMSPrinter():New("produto"+Alltrim(__cUserID)+".etq",IMP_SPOOL,lAdjustToLegacy,"/spool/",lDisableSetup,,,Alltrim(cImpress) /*parametro que recebe a impressora*/)
	
	//Para saber mais sobre o componente FWMSPrinter acesse http://tdn.totvs.com/display/public/mp/FWMsPrinter

	cQuery := "sua consulta SQL"

	TcQuery cQuery New Alias "QRYTMP"
	QRYTMP->(DbGoTop())

	oPrinter:SetMargin(001,001,001,001)

	While QRYTMP->(!Eof())
		For nR := 1 to nQuant
			nLin := 10
			nCol := 22

			MsProcTxt("Imprimindo "+alltrim(QRYTMP->CODIGO) + " - " + alltrim(QRYTMP->DESC)+"...")

			oPrinter:StartPage()

			oPrinter:SayBitmap(nLin,nCol,cLogo,100,030)

			nLin+= 45
			oPrinter:Say(nLin,nCol,"Produto",oFont16)

			nLinC		:= 4.95		//Linha que será impresso o Código de Barra
			nColC		:= 1.6		//Coluna que será impresso o Código de Barra
			nWidth	 	:= 0.0164	//Numero do Tamanho da barra. Default 0.025 limite de largura da etiqueta é 0.0164
			nHeigth   	:= 0.6		//Numero da Altura da barra. Default 1.5 --- limite de altura é 0.3
			lBanner		:= .T.		//Se imprime a linha com o código embaixo da barra. Default .T.
			nPFWidth	:= 0.8		//Número do índice de ajuste da largura da fonte. Default 1
			nPFHeigth	:= 0.9		//Número do índice de ajuste da altura da fonte. Default 1
			lCmtr2Pix	:= .T.		//Utiliza o método Cmtr2Pix() do objeto Printer.Default .T.

			oPrinter:FWMSBAR("CODE128" , nLinC , nColC, alltrim(QRYTMP->CODBAR), oPrinter,/*lCheck*/,/*Color*/,/*lHorz*/, nWidth, nHeigth,.F.,/*cFont*/,/*cMode*/,.F./*lPrint*/,nPFWidth,nPFHeigth,lCmtr2Pix)

			nLin+= 40
			oPrinter:Say(nLin,nCol,alltrim(QRYTMP->CODIGO) + " - " + alltrim(QRYTMP->DESC),oFont16)

			oPrinter:EndPage()
		Next
		QRYTMP->(DbSkip())
	EndDo
	oPrinter:Print()
	QRYTMP->(DbCloseArea())

Return

/*Montagem da tela de perguntas*/
Static Function ValidPerg()
	Local aRet 		:= {}
	Local aParamBox	:= {}
	Local lRet 		:= .F.
	Local aOpcoes	:= {}
	Local cProdDe	:= ""
	Local cProdAte	:= ""
	Local cLocal	:= Space(99)

	If Empty(getMV("ZZ_IMPRESS")) //se o parametro estiver vazio, ja o defino com a impressora PDFCreator 
		aOpcoes := {"PDFCreator"}
	Else
		aOpcoes := Separa(getMV("ZZ_IMPRESS"),";")
	Endif

	cProdDe := space(TamSX3("B1_COD")[1])
	cProdAte:= REPLICATE("Z",TAMSX3("B1_COD")[1])

	aAdd(aParamBox,{01,"Produto de"	  			,cProdDe 	,""					,"","SB1"	,"", 60,.F.})	// MV_PAR01
	aAdd(aParamBox,{01,"Produto ate"	   		,cProdAte	,""					,"","SB1"	,"", 60,.T.})	// MV_PAR02
	aAdd(aParamBox,{01,"Quantidade Etiqueta"	,1			,"@E 9999"			,"",""		,"", 60,.F.})	// MV_PAR03
	aadd(aParamBox,{02,"Imprimir em"			,Space(50)	,aOpcoes			,100,".T.",.T.,".T."})		// MV_PAR04

	If ParamBox(aParamBox,"Etiqueta Produto",/*aRet*/,/*bOk*/,/*aButtons*/,.T.,,,,FUNNAME(),.T.,.T.)

		If ValType(MV_PAR04) == "N" //Algumas vezes ocorre um erro de ao invés de selecionar o conteúdo, seleciona a ordem, então verifico se é numerico, se for, eu me posiciono na impressora desejada para pegar o seu nome
			MV_PAR04 := aOpcoes[MV_PAR04]
		EndIf

		lRet := .T.
	EndIf
Return lRet
Para imprimir uso a propriedade FWMSBAR, ele imprime o código de barras suportados pela função MsBar(). Obs: A utilização deste metodo não é homologado para a impressão de relatorios em ambientes que utilizam sistema operacional com o recurso de "Zoom" ou "Lupa" ativo. Sintaxe: FWMsPrinter():FWMsBar(cTypeBar,nRow,nCol,cCode,oPrint,lCheck,Color,lHorz, nWidth,nHeigth,lBanner,cFont,cMode,lPrint,nPFWidth,nPFHeigth,lCmtr2Pix) Parâmetros
Nome Tipo Descrição Obrigatório Referência
cTypeBar Caracter Código do tipo do código de barras: "EAN13", "EAN8", "UPCA" , "SUP5" , "CODE128", "INT25","MAT25,"IND25","CODABAR","CODE3_9" X
nRow Numérico Posição relativa à esquerda X
nCol Numérico Posição relativa ao topo X
cCode Caracter Texto a ser transformado em código de barra X
oPrint Objeto Objeto Printer
lCheck Lógico Se calcula o digito de controle. Defautl .T.
Color Numérico Numero da Cor, utilize a "color.ch". Default CLR_BLACK
lHorz Lógico Se imprime na Horizontal. Default .T.
nWidth Numérico Numero do Tamanho da barra. Default 0.025
nHeigth Numérico Numero da Altura da barra. Default 1.5
lBanner Lógico Se imprime a linha com o código embaixo da barra. Default .T.
cFont Caracter Nome do Fonte a ser utilizado. Defautl "Arial"
cMode Caracter Modo do codigo de barras CO. Default ""
lPrint Lógico Se executa o método Print() de oPrinter pela MsBar. Default .T.
nPFWidth Numérico Número do índice de ajuste da largura da fonte. Default 1
nPFHeigth Numérico Número do índice de ajuste da altura da fonte. Default 1
lCmtr2Pix Lógico Utiliza o método Cmtr2Pix() do objeto Printer.Default .T.
  A tela de parâmetros ficará assim: parametrosetiquetacodigobarras Simples não?