Perdona que 'vomite' aqu铆 este c贸digo 'tal cual' y sin comentar nada sobre 茅l, pero quiz谩s te sirva.
Son 2 impresiones independientes de etiquetas.
Una me gusta mucho por que utiliza 3 joyas que tenemos disponibles de 3 'Grandes':
=========
1er. PRG
=========
#include "AMPA32.ch"
/* *************************************************************************
聽 聽Per a imprimir codi de barres EAN13
聽 聽********************************************************************** */
FUNCTION ImprCoba( AmpaArra )
Local nCodBar13Ini := 0
Local nCodBar13Fin := 0
Local nEtiqLini 聽 聽:= 6
Local nEtiqCOLU 聽 聽:= 12
If MsgGet( "CODI DE BARRES INICIAL", "Indiqui el n煤mero INICIAL de codi de barres a imprimir:", @nCodBar13Ini, Nil, Nil )
聽 聽 If MsgGet( "CODI DE BARRES FINAL", "Indiqui el n煤mero FINAL de codi de barres a imprimir:", @nCodBar13Fin, Nil, Nil )
聽 聽 聽 聽 If MsgGet( "Nombre d'etiquetes per L脥NIA", "Indiqui nombre d'etiquetes per L脥NIA:", @nEtiqLini, Nil, Nil )
聽 聽 聽 聽 聽 聽 If MsgGet( "Nombre d'etiquetes per COLUMNA", "Indiqui nombre d'etiquetes per COLUMNA:", @nEtiqCOLU, Nil, Nil )
聽 聽 聽 聽 聽 聽 聽 聽 TImpCoBa():New( AMPAArra, nCodBar13Ini, nCodBar13Fin, nEtiqLini, nEtiqCOLU )
聽 聽 聽 聽 聽 聽 EndIf
聽 聽 聽 聽 EndIf
聽 聽 EndIf
EndIf
Return Nil
/* *************************************************************************
/* *************************************************************************
聽 聽Per a imprimir codi de barres CODE128
聽 聽********************************************************************** */
FUNCTION ImprCobaAlum( AmpaArra )
Local aFiltro 聽 聽 := aFiltroFun( AMPAARRA )
Local nEtiqLini 聽 聽:= 4
Local nEtiqCOLU 聽 聽:= 12
Local nEtiqAlum 聽 聽:= 1
Local aOrden 聽 聽 聽 := aOrdenFun( AMPAARRA )
aOrden[2] := 4
aFiltro := Filtro01( AMPAarra, AMPAarra[1][1][2][1][1], "ALUMNE", Nil, Nil, .F., aFiltro, .F. )
If aFiltro[1] = 1
聽 聽 aOrden := Orden01( AMPAARRA, AMPAarra[1][1][2][1][1], "ALUMNE", Nil, .F., aOrden )
聽 聽 If aOrden[3]
聽 聽 聽 聽 If MsgGet( "Nombre d'etiquetes per L脥NIA", "Indiqui nombre d'etiquetes per L脥NIA:", @nEtiqLini, Nil, Nil )
聽 聽 聽 聽 聽 聽 If MsgGet( "Nombre d'etiquetes per COLUMNA", "Indiqui nombre d'etiquetes per COLUMNA:", @nEtiqCOLU, Nil, Nil )
聽 聽 聽 聽 聽 聽 聽 聽 If MsgGet( "Nombre d'etiquetes per ALUMNE", "Indiqui nombre d'etiquetes per ALUMNE:", @nEtiqAlum, Nil, Nil )
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 TImpCoBaAlum():New( AMPAArra, nEtiqLini, nEtiqCOLU, nEtiqAlum, aFiltro, aOrden )
聽 聽 聽 聽 聽 聽 聽 聽 EndIf
聽 聽 聽 聽 聽 聽 EndIf
聽 聽 聽 聽 EndIf
聽 聽 EndIf
EndIf
Return Nil
/* ********************************************************************** */
========
2do. PRG
========
#include "AMPA32.ch"
//#INCLUDE "Fivewin.CH"
#INCLUDE "Utilprn.CH"
#INCLUDE "Barcode.CH"
#DEFINE CLR_GREY 14671839
************************************************************************
************************************************************************
************************************************************************
*Clase para realizar unas etiquetas
*Haciendo uso de la Clausula NOBOX.
CLASS TIMPCOBA FROM TIMPRIME
聽 聽 聽 CLASSDATA lRegistered AS LOGICAL
聽 聽 聽 DATA lprevisual
聽 聽 聽 DATA ARRAAMPA
聽 聽 聽 DATA nContadora
聽 聽 聽 // Methods constructores
聽 聽 聽 //METHOD Init( cSpool)
聽 聽 聽 METHOD New( AMPAARRA, nCodBar13Ini, nCodBar13Fin, netiqlini, netiqfila ) CONSTRUCTOR
聽 聽 聽 METHOD Etiqueta()
聽 聽 聽 METHOD InitLineFile() INLINE ( ::nLinea := 0, ::nFila := 0 )
聽 聽 聽 METHOD Separator() 聽// Este method es compartido por las dos clases
ENDCLASS
METHOD New( AMPAARRA, nCodBar13Ini, nCodBar13Fin, netiqlini, netiqfila ) 聽CLASS TIMPCOBA
聽 聽 ::ARRAAMPA := AMPAARRA
聽 聽 /* Es solicita si es desitja previsualitzar.
聽 聽 聽 聽--------------------------------------*/
聽 聽 ::lprevisual := MsgNoYes( "Es desitja previsualitzar?", "Atenci贸!" )
聽 聽 traza( 1, "::lPrevisual=", ::lprevisual )
聽 聽 msgnowait2( AMPAARRA, "Imprimint ...", "Cancel路lar...")
聽 聽 CursorWait()
聽 聽 /* Inicia el proceso de impresi贸n
聽 聽 聽 聽--------------------------- */
聽 聽 IMPRIME INIT "Impressi贸 EAN13 entre " + AllTrim( Str( nCodBar13Ini, 15, 0 ) ) + " i " + AllTrim( Str( nCodBar13Fin, 15, 0 ) )
聽 聽 PAGE
聽 聽 聽 ::Etiqueta( nCodBar13Ini, nCodBar13Fin, netiqlini, netiqfila )
聽 聽 ENDPAGE
//TRAZA(1, "::nVertRes()=", ::nVertRes() )
//TRAZA(1, "::nHORZRes()=", ::nHORZRes() )
//TRAZA(1, "::nVertSIZE()=", ::nVertSIZE() )
//TRAZA(1, "::nHORZSIZE()=", ::nHORZSIZE() )
//TRAZA(1, "::GetPhySize()[1]=", ::GetPhySize()[1] )
//TRAZA(1, "::GetPhySize()[2]=", ::GetPhySize()[2] )
聽 聽 IMPRIME END .F.
聽 聽 CursorArrow()
聽 聽 EndMsgNoWait( ::ARRAAMPA )
Return .T.
METHOD Etiqueta( nCodBar13Ini, nCodBar13Fin, netiqlini, netiqfila ) CLASS TIMPCOBA
Local nContador := 0
Local nFlag 聽 聽 := 1
Local nVertSIZE := 0
Local nHORZSIZE := 0
Local cCode 聽 聽 := ""
nVertSIZE := Val(Str( ::oPrn:GetPhySize()[2] / 10, 4, 1 ) )
nHORZSIZE := Val(Str( ::oPrn:GetPhySize()[1] / 10, 4, 1 ) )
TRAZA(1, "nVertSIZE=", nVertSIZE )
TRAZA(1, "nHORZSIZE=", nHORZSIZE )
::InitLineFile()
聽 聽 For nContador := nCodBar13Ini To nCodBar13Fin STEP 1
聽 聽 聽 聽 聽// Usando BARLIB de Cayetano.
聽 聽 聽 聽 聽// Para no tener que retocar el .CH ni historia solamente tendremos que
聽 聽 聽 聽 聽// pasar en vez de nCol como hasta ahora , hacerlo asi, ::Row( nRow ), donde nRow
聽 聽 聽 聽 聽// sera un valor expresado en CMS.
聽 聽 聽 聽 聽/* Si los m谩rgenes son '0':
聽 聽 聽 聽 聽 聽 ::nVertSIZE()=297 聽 聽 MILIMETROS !!!
聽 聽 聽 聽 聽 聽 ::nHORZSIZE()=210
聽 聽 聽 聽 聽*/
聽 聽 聽 聽 聽//@ ::Row( ::nLinea + 1.5 ), ::Col( ::nFila 聽- 1 ) EAN13 Right("000000000000" + AllTrim(Str( nContador, 12, 0) ), 12) ;
聽 聽 聽 聽 聽// OF ::oPrinter SIZE 1 BANNER
聽 聽 聽 聽 聽//@ ::Row( ::nLinea + 3 ), ::Col( ::nFila 聽- 1 ) CODE128 "LOLES REBALE 8E PRIMARIA" MODE "A" ;
聽 聽 聽 聽 聽// OF ::oPrinter SIZE 1
聽 聽 聽 聽 聽//@ ::Row( ::nLinea + ( (::nVertSIZE()/10) / nEtiqFila ) - 1.5 - 0.5 ), ::Col( ::nFila + 0.5 ) EAN13 Right("000000000000" + AllTrim(Str( nContador, 12, 0) ), 12) ;
聽 聽 聽 聽 聽// OF ::oPrinter SIZE 1 BANNER
聽 聽 聽 聽 聽cCode := Right("00000000000" + AllTrim(Str( nContador, 11, 0) ), 11) + cGetDigitMatr( ::ARRAAMPA, Right("00000000000" + AllTrim(Str( nContador, 11, 0) ), 11) )
聽 聽 聽 聽 聽@ ::oUtil:Row( ::nLinea + ( nVertSIZE / nEtiqFila ) - 1.5 - 0.5 ), ::oUtil:Col( ::nFila + 0.5 ) EAN13 cCode ;
聽 聽 聽 聽 聽 OF ::oUtil:oPrinter SIZE 1 BANNER
聽 聽 聽 聽 聽//::nFila := ( (::nHORZSIZE()/10) / nEtiqLini ) * nFlag
聽 聽 聽 聽 聽::nFila := ( nHORZSIZE / nEtiqLini ) * nFlag
聽 聽 聽 聽 聽nFlag++
聽 聽 聽 聽 聽if nFlag = (nEtiqLini + 1 )
聽 聽 聽 聽 聽 聽 聽 ISEPARATOR ( nVertSIZE / nEtiqFila )
聽 聽 聽 聽 聽 聽 聽 nFlag := 1
聽 聽 聽 聽 聽 聽 聽 ::nFila := 0
聽 聽 聽 聽 聽endif
聽 聽 EndFor
聽 聽::oUtil:Reset() 聽//Valores por defecto
RETURN NIL
METHOD Separator( nSpace ) CLASS TIMPCOBA
聽 聽// Si habido un salto de pagina despues de una linea de separacion
聽 聽if Super:Separator( nSpace ) // Atentos. Llamada a la TImprime.
聽 聽 聽 ::InitLineFile()
聽 聽endif
Return Self
************************************************************************
************************************************************************
CLASS TIMPCOBAALUM FROM TIMPRIME
聽 聽 聽 CLASSDATA lRegistered AS LOGICAL
聽 聽 聽 DATA lprevisual
聽 聽 聽 DATA ARRAAMPA
聽 聽 聽 DATA nContadora
聽 聽 聽 // Methods constructores
聽 聽 聽 //METHOD Init( cSpool)
聽 聽 聽 METHOD New( AMPAARRA, netiqlini, netiqfila, nEtiqAlum, aFiltro, aOrden ) CONSTRUCTOR
聽 聽 聽 METHOD Etiqueta( nEtiqlini, nEtiqfila, nEtiqAlum, aFiltro, aOrden )
聽 聽 聽 METHOD InitLineFile() INLINE ( ::nLinea := 0, ::nFila := 0 )
聽 聽 聽 METHOD Separator() 聽// Este method es compartido por las dos clases
ENDCLASS
METHOD New( AMPAARRA, nEtiqlini, nEtiqfila, nEtiqAlum, aFiltro, aOrden ) 聽CLASS TIMPCOBAALUM
聽 聽 ::ARRAAMPA := AMPAARRA
聽 聽 /* Es solicita si es desitja previsualitzar.
聽 聽 聽 聽--------------------------------------*/
聽 聽 ::lprevisual := MsgNoYes( "Es desitja previsualitzar?", "Atenci贸!" )
聽 聽 traza( 1, "::lPrevisual=", ::lprevisual )
聽 聽 msgnowait2( AMPAARRA, "Imprimint ...", "Cancel路lar...")
聽 聽 CursorWait()
聽 聽 /* Inicia el proceso de impresi贸n
聽 聽 聽 聽--------------------------- */
聽 聽 IMPRIME INIT "Impressi贸 CODE128 d'alumnes " + aFiltro[2]
聽 聽 PAGE
聽 聽 聽 ::Etiqueta( nEtiqlini, nEtiqfila, nEtiqAlum, aFiltro, aOrden )
聽 聽 ENDPAGE
聽 聽 //TRAZA(1, "::nVertRes()=", ::nVertRes() )
聽 聽 //TRAZA(1, "::nHORZRes()=", ::nHORZRes() )
聽 聽 TRAZA(1, "::nVertSIZE()=", ::oPrn:nVertSIZE() )
聽 聽 TRAZA(1, "::nHORZSIZE()=", ::oPrn:nHORZSIZE() )
聽 聽 TRAZA(1, "::GetPhySize()[1]=", ::oPrn:GetPhySize()[1] )
聽 聽 TRAZA(1, "::GetPhySize()[2]=", ::oPrn:GetPhySize()[2] )
聽 聽 IMPRIME END .F.
聽 聽 CursorArrow()
聽 聽 EndMsgNoWait( ::ARRAAMPA )
Return .T.
METHOD Etiqueta( nEtiqlini, nEtiqfila, nEtiqAlum, aFiltro, aOrden ) CLASS TIMPCOBAALUM
Local nContadora 聽:= 0
Local nFlag 聽 聽 聽 := 1
Local nVertSIZE 聽 := 0
Local nHORZSIZE 聽 := 0
Local oTdbfAlumne := Nil
Local lRest 聽 聽 聽 := .F.
Local oFnt_8 聽 聽 聽:= Nil
DEFINE FONT oFnt_8 NAME "Arial" SIZE 0,-8 OF ::oPrn
oTdbfAlumne := oDbfClon( ::ArraAMPA, "ALUMNE" )
oTdbfAlumne:SetIndex( aOrden[ 2 ] )
nVertSIZE := Val(Str( ::oPrn:GetPhySize()[2] / 10, 4, 1 ) )
nHORZSIZE := Val(Str( ::oPrn:GetPhySize()[1] / 10, 4, 1 ) )
TRAZA(1, "nVertSIZE=", nVertSIZE )
TRAZA(1, "nHORZSIZE=", nHORZSIZE )
::InitLineFile()
While oTDbfAlumne:Locate( bCodiFil( ::ArraAMPA, aFiltro[3] ), , lRest ) 聽 // .and. ValType( ::ArraAMPA[1][1][1] ) = "O"
聽 聽 lRest := .T.
聽 聽 oTdbfalumne:Load()
聽 聽 For nContadora := 1 To nEtiqalum STEP 1
聽 聽 聽 聽 聽// Usando BARLIB de Cayetano.
聽 聽 聽 聽 聽// Para no tener que retocar el .CH ni historia solamente tendremos que
聽 聽 聽 聽 聽// pasar en vez de nCol como hasta ahora , hacerlo asi, ::Row( nRow ), donde nRow
聽 聽 聽 聽 聽// sera un valor expresado en CMS.
聽 聽 聽 聽 聽/* Si los m谩rgenes son '0':
聽 聽 聽 聽 聽 聽 ::nVertSIZE()=297 聽 聽 MILIMETROS !!!
聽 聽 聽 聽 聽 聽 ::nHORZSIZE()=210
聽 聽 聽 聽 聽*/
聽 聽 聽 聽 聽@ ::oUtil:Row( ::nLinea + ( nVertSIZE / nEtiqFila ) - 1.5 - 0.6 ), ::oUtil:Col( ::nFila + 0.5 ) ;
聽 聽 聽 聽 聽 聽CODE128 ;
聽 聽 聽 聽 聽 聽Left( AllTrim( oTdbfalumne:CodiAlum ) + Space(12), 12 ) ;
聽 聽 聽 聽 聽 聽MODE "A" OF ::oUtil:oPrinter SIZE 1
聽 聽 聽 聽 聽 ::oUtil:Text( ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 AlLTrim(oTdbfalumne:CodCurAc) + " / " + AlLTrim(oTdbfalumne:CodiAlum), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::nLinea + ( nVertSIZE / nEtiqFila ) - 0 - 1.1, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::nFila + 0.5, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oFnt_8, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Nil, Nil, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Nil, Nil, Nil, Nil, Nil, Nil, Nil )
聽 聽 聽 聽 聽 ::oUtil:Text( ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 AlLTrim(oTDbfAlumne:nomAlum) + " " + AlLTrim(oTDbfAlumne:cognom1) + " " + AlLtrim(oTDbfAlumne:cognom2), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::nLinea + ( nVertSIZE / nEtiqFila ) - 0 - 0.7, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::nFila + 0.5, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oFnt_8, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Nil, Nil, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Nil, Nil, Nil, Nil, Nil, Nil, Nil )
/*
聽 聽 聽 聽 聽UTILPRN ::oUtil 3, ( ::nFila + 0.5 ) SAY ;
聽 聽 聽 聽 聽 聽 聽 聽 聽AlLTrim(oTdbfalumne:CodCurAc) + "-" + AlLTrim(oTdbfalumne:CodiAlum) + "-" + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽AlLTrim(oTDbfAlumne:nomAlum) + " " + AlLTrim(oTDbfAlumne:cognom1) + " " + AlLtrim(oTDbfAlumne:cognom2)
聽 聽 聽 聽 聽UTILPRN ::oUtil (::nLinea + ( nVertSIZE / nEtiqFila ) - 0 - 0.5 ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽( ::nFila + 0.5 ) SAY ;
聽 聽 聽 聽 聽 聽 聽 聽 聽AlLTrim(oTdbfalumne:CodCurAc) + "-" + AlLTrim(oTdbfalumne:CodiAlum) + "-" + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽AlLTrim(oTDbfAlumne:nomAlum) + " " + AlLTrim(oTDbfAlumne:cognom1) + " " + AlLtrim(oTDbfAlumne:cognom2)
*/
聽 聽 聽 聽 聽::nFila := ( nHORZSIZE / nEtiqLini ) * nFlag
聽 聽 聽 聽 聽nFlag++
聽 聽 聽 聽 聽if nFlag = (nEtiqLini + 1 )
聽 聽 聽 聽 聽 聽 聽 ISEPARATOR ( nVertSIZE / nEtiqFila )
聽 聽 聽 聽 聽 聽 聽 nFlag := 1
聽 聽 聽 聽 聽 聽 聽 ::nFila := 0
聽 聽 聽 聽 聽endif
聽 聽 EndFor
EndDo
::oUtil:Reset() 聽//Valores por defecto
laTDbfEnd( ::ArraAMPA, { oTdbfAlumne } )
oFnt_8:End()
RETURN NIL
METHOD Separator( nSpace ) CLASS TIMPCOBAALUM
聽 聽// Si habido un salto de pagina despues de una linea de separacion
聽 聽if Super:Separator( nSpace ) // Atentos. Llamada a la TImprime.
聽 聽 聽 ::InitLineFile()
聽 聽endif
Return Self
*************************************