ermatica wrote:Gracias por vuestra orientación (Carlos y Biel).
Me he bajado la clase que hay en UTILES de este foro. Contiene cuatro ficheros (makefile, timprime.prg, utlprn.ch y utilprn.prg):
- ¿es la ultima version de la clase?
- ¿donde podría ver algun ejemplo de su utilización? algo sencillo para empezar a trabajar con ella.
Un cordial saludo
Ernesto
Seguro que The Full te puede decir si es la última versión.
Yo compilo y linco directamente timprime.prg y utilprn.prg junto con el resto de PRG de la aplicación, y donde los utilizo hago un include utilprn.ch
Yo creo que es una utilidad que permite realizar (casi) cualquier documento.
Vale la pena dedicarle una tarde a las clases timprimi y utilprn para ver como funcionan; mira que métodos tiene la clase y verás que puedes hacer mucho y fácil.
Debes tener en cuenta que para definir tu documento deberas crear una clase basada en TImprime, y será esta clase la que llames desde tu programa para imprimirlo.
Cuando hagas la primera las demás seran copiar y pegar modificando allá donde sea necesario.
Para imprimir el ejemplo que adjunto hago:
TFactuA1():New( JuvaArra, uIdenDocu, lSINOprevisual )
Te adjunto un ejemplo de como creo la clase:
****************************************
#include "Juva02.ch"
#INCLUDE "Utilprn.CH"
#DEFINE CLR_GREY 14671839
#DEFINE CMSEPARADOR 0.3
#ifdef __XPP__
#define Super ::TImprime
#endif
*Clase Para Imprimir Facturas.
// Fact.Pre-imprès A/Desc.+IVAs+Reten
CLASS TFACTUA1 FROM TIMPRIME
CLASSDATA lRegistered AS LOGICAL
DATA lprevisual
DATA oFnt_8
DATA oFnt_10B
DATA oFnt_10
DATA ArraJuva
DATA FileBmp
DATA oTdbfEntita
DATA oTDbfFactur
DATA oTDbfConFac
DATA oTDbfArticu
DATA oTDbfDestin
// Methods constructores
METHOD Init( cSpool)
METHOD New( JuvaArra, nNUMEFACT, lSINOprevisual ) CONSTRUCTOR
METHOD Cabecera()
METHOD Lineas()
METHOD Separator( nSpace ) // Este method es compartido por las dos clases
METHOD End( lPageCount )
ENDCLASS
METHOD Init( cSpool ) CLASS TFACTUA1
Super:Init( cSpool,,, !::lPrevisual )
DEFINE FONT ::oFnt_8 NAME "Arial" SIZE 0,-8 OF ::oPrn
DEFINE FONT ::oFnt_10B NAME "Arial" SIZE 0,-10 BOLD OF ::oPrn
DEFINE FONT ::oFnt_10 NAME "Arial" SIZE 0,-10 OF ::oPrn
Return self
METHOD End( lPageCount ) CLASS TFACTUA1
EndMsgNoWait( ::ArraJuva )
Super:End( lPageCount )
::oFnt_8:End()
::oFnt_10B:End()
::oFnt_10:End()
Self := Nil
Return Self
METHOD New( JuvaArra, nNUMEFACT, lSINOprevisual ) CLASS TFACTUA1
Local nOrden := 0
Local aFiltro := { 1, "Sense Filtre", "Recno()>0", JuvaArra[1][2][48][3] }
Local lRest := .F.
::ArraJuva := JuvaArra
::FileBmp := ::ArraJuva[1][2][43][3]
If nNUMEFACT = 0
/* Se establece el orden de la base.
-------------------------------*/
nOrden := Orden01( ::ArraJuva, Nil, "FACTUR", Nil, .F., 0 )[2]
/* Se establece el filtro de la base.
--------------------------------*/
aFiltro := Filtro01( ::ArraJuva, Nil, "FACTUR", Nil, Nil, .F., aFiltro, .F. )
Else
aFiltro := { 1, "Sense Filtre", ;
"(NUMEFACT>=Val('" + Str(nNUMEFACT) + "') .and. NUMEFACT<=Val('" + Str(nNUMEFACT) + "'))", ;
.F. }
EndIf
msgnowait2( JuvaArra, "Imprimint ...", "Cancel·lar...")
CursorWait()
/* Se comprueba que no se haya pulsado ESCAPE.
-----------------------------------------*/
If aFiltro[1] > 0
/* Se abren las bases.
-----------------*/
::oTdbfEntita := oDbfClon( ::ArraJuva, "ENTITA" )
::oTDbfEntita:GoTop():Load()
::oTdbfFactur := oDbfClon( ::ArraJuva, "FACTUR" )
::oTdbfConFac := oDbfClon( ::ArraJuva, "CONFAC" )
::oTdbfArticu := oDbfClon( ::ArraJuva, "ARTICU" )
::oTDbfDestin := oDbfClon( ::ArraJuva, "DESTIN" )
/* Se aplica el orden y el filtro a las bases.
-----------------------------------------*/
::oTDbfFactur:SetIndex( nOrden )
Aplifil( ::ArraJuva, ::oTdbfFactur, Nil, aFiltro[3] + " .and. !Deleted()" )
::oTDbfConFac:Setindex( 4 )
::oTDbfArticu:Setindex( 2 )
While ::oTdbfFactur:Locate( , , lRest ) .and. ValType( ::ArraJuva[1][1][1] ) = "O"
lRest := .T.
::oTdbfFactur:Load()
Aplifil( ::ArraJuva, ::oTdbfConFac, Nil, "NUMEFACT = Val('" + ;
AllTrim( Str( ::oTdbfFactur:NumeFact, 10,0 ) ) + ;
"') .and. !Deleted()" )
IMPRIME INIT "Impressió de la factura " + AllTrim( Str( ::oTdbfFactur:NumeFact, 15, 0 ) )
msgnowait2( JuvaArra, "Imprimint " + ::oPrn:GetModel(), "Cancel·lar...")
PAGE
::Cabecera()
::Lineas()
ENDPAGE
IMPRIME END .F.
SysRefresh()
EndDo
laTDbfEnd( ::ArraJuva, { ::oTdbfEntita, ::oTdbfFactur, ::oTdbfConFac, ::oTdbfArticu, ::oTDbfDestin } )
EndIf
CursorArrow()
Return .T.
METHOD Cabecera() CLASS TFACTUA1
Local oFont,oPen,oBrush
Local nColor := 35724527
DEFINE FONT oFont NAME "Arial" SIZE 0,-16 OF ::oPrn
DEFINE PEN oPen WIDTH 3 COLOR CLR_GREY
DEFINE BRUSH oBrush COLOR nColor
UTILPRN ::oUtil 5.8, 1.7 SAY "Factura:" + Str( ::oTdbfFactur:NumeFact, 9,0 ) FONT oFont COLOR CLR_BLACK
If ::oTdbfFactur:Totalbru < 0
UTILPRN ::oUtil 5.8, 7.0 SAY "ABONO" FONT oFont COLOR CLR_BLACK
EndIf
UTILPRN ::oUtil 6.5, 1.7 SAY "Data: " + DToC( ::oTdbfFactur:DataFact ) FONT oFont COLOR CLR_BLACK
/* Datos cliente.
-------------*/
If ::oTDbfFactur:TIPUPERS = 1
UTILPRN ::oUtil 4, 10.7 SAY RTrim( ::oTdbfFactur:NOM ) + " " + ;
RTrim( ::oTdbfFactur:COGNOM1 ) + " " + ;
RTrim( ::oTdbfFactur:COGNOM2 ) ;
FONT ::oFnt_10B COLOR CLR_BLACK
ELSE
UTILPRN ::oUtil 4, 10.7 SAY ::oTdbfFactur:COGNOM1 + ;
::oTdbfFactur:COGNOM2 + ;
::oTdbfFactur:NOM ;
FONT ::oFnt_10B COLOR CLR_BLACK
ENDIF
UTILPRN ::oUtil 4.5, 10.7 SAY ::oTdbfFactur:ADRECA FONT ::oFnt_10B COLOR CLR_BLACK
UTILPRN ::oUtil 5, 10.7 SAY Right( Transform( ::oTdbfFactur:CODIPOST + 100000, "999999" ),5) + ;
"-" + AllTrim(::oTdbfFactur:POBLACIO) ;
FONT ::oFnt_10B COLOR CLR_BLACK
UTILPRN ::oUtil 5.5, 10.7 SAY "(" + AllTrim(::oTdbfFactur:PROVINCI) + ")" ;
FONT ::oFnt_10B COLOR CLR_BLACK
UTILPRN ::oUtil 6.0, 10.7 SAY ::oTdbfFactur:NIF FONT ::oFnt_10B COLOR CLR_BLACK
/* Cajas de la cabecera del encolumnado.
-----------------------------------*/
UTILPRN ::oUtil BOX 8, 1.5 TO 9, 3.5
UTILPRN ::oUtil BOX 8, 3.5 TO 9, 4.5
UTILPRN ::oUtil BOX 8, 4.5 TO 9, 14
UTILPRN ::oUtil BOX 8, 14 TO 9, 15.5
UTILPRN ::oUtil BOX 8, 15.5 TO 9, 17.5
UTILPRN ::oUtil BOX 8, 17.5 TO 9, 20
UTILPRN ::oUtil 8.2, 2 SAY "Mes" FONT ::oFnt_10B COLOR CLR_BLACK
UTILPRN ::oUtil 8.2, 3.7 SAY "Dia" FONT ::oFnt_10B COLOR CLR_BLACK
UTILPRN ::oUtil 8.2, 6.5 SAY "Descripció/Destí" FONT ::oFnt_10B COLOR CLR_BLACK
UTILPRN ::oUtil 8.2, 14.2 SAY "Unitats" FONT ::oFnt_10B COLOR CLR_BLACK
UTILPRN ::oUtil 8.2, 16 SAY "Preu U." FONT ::oFnt_10B COLOR CLR_BLACK
UTILPRN ::oUtil 8.2, 18.2 SAY "Total" FONT ::oFnt_10B COLOR CLR_BLACK
/* Cajas de los totales.
-------------------*/
UTILPRN ::oUtil BOX 24.6, 1.5 TO 27.1, 8
UTILPRN ::oUtil BOX 24.6, 8 TO 27.1, 14
UTILPRN ::oUtil BOX 24.6, 14 TO 27.1, 20
oFont:End()
oPen:End()
oBrush:End()
::oUtil:Reset() //Valores por defecto
::nLinea := 9.5 // comenzamos a 10 cms
RETURN NIL
METHOD Lineas() CLASS TFACTUA1
Local lRest := .F.
Local lRest2 := .F.
Local nEPreu := 0
Local nFPreu := 0
Local nImport := 0
// Sumes parcials
Local nEDescRapp := 0
Local nEDescPron := 0
Local nERetencio := 0
// Sumes totals.
Local nFDescRapp := 0
Local nFDescPron := 0
Local nFRetencio := 0
Local nFReteIRPF := 0
Local aIVA := {}
Local nIVA := 0
Local nFIVA := 0
Local nFBI := 0
Local nContador := 0
Local uDummy := 0
/* Se cambia el fin del área de impresión.
-------------------------------------*/
::nEndLine := ::nEndLine - 4
While ::oTdbfConFac:Locate( , , lRest ) .and. ValType( ::ArraJuva[1][1][1] ) = "O"
lRest := .T.
lRest2 := .F.
::oTdbfConFac:Load()
/* Se imprime mes, año, día y descripción si el precio es <> 0.
Si la cantidad es <> 0. Maite 05-02-2003
----------------------------------------------------------*/
If ::oTdbfConFac:QUANUNIT <> 0
UTILPRN ::oUtil Self:nLinea, 2 ;
SAY juvcmonth(::oTdbfConFac:DATAALBA,3,1)+"/"+right(str(year(::oTdbfConFac:DATAALBA),4,0),2) ;
FONT ::oFnt_10 COLOR CLR_BLACK
UTILPRN ::oUtil Self:nLinea, 3.8 SAY str(day(::oTdbfConFac:DATAALBA),2,0) ;
FONT ::oFnt_10 COLOR CLR_BLACK
EndIf
Aplifil( ::ArraJuva, ::oTdbfArticu, Nil, "CODIARTI = '" + ::oTdbfConFac:CODIARTI + ;
"' .and. !Deleted()" )
/* Se imprime el artículo.
---------------------*/
If ::oTdbfArticu:Locate( , , lRest2 )
lRest2 := .T.
::oTdbfArticu:Load()
UTILPRN ::oUtil Self:nLinea, 4.8 SAY ::oTdbfArticu:DESCRIPC ;
FONT ::oFnt_8 COLOR CLR_BLACK
EndIf
While ::oTdbfArticu:Locate( , , lRest2 ) .and. ValType( ::ArraJuva[1][1][1] ) = "O"
::oTdbfArticu:Load()
ISEPARATOR CMSEPARADOR
UTILPRN ::oUtil Self:nLinea, 4.8 SAY ::oTdbfArticu:DESCRIPC ;
FONT ::oFnt_8 COLOR CLR_BLACK
EndDo
Aplifil( ::ArraJuva, ::oTdbfDestin, Nil, "CODIDEST = Val('" + Str(::oTdbfConFac:CODIDEST) + ;
"') .and. !Deleted()" )
/* Se imprime el destino.
--------------------*/
lRest2 := .F.
If ::oTdbfDestin:Locate( , , lRest2 )
::oTdbfDestin:Load()
ISEPARATOR CMSEPARADOR
UTILPRN ::oUtil Self:nLinea, 4.8 SAY Left(RTrim(::oTdbfDestin:ADRECA) + "-" + ;
RTrim(::oTdbfDestin:POBLACIO) + space(50), 50 ) ;
FONT ::oFnt_8 COLOR CLR_BLACK
EndIf
/* Se imprimen otros datos si el precio es <> 0.
-------------------------------------------*/
If ::oTdbfConFac:PREUUNIT <> 0
/* Se imprime la cantidad.
---------------------*/
UTILPRN ::oUtil Self:nLinea, 15.0 SAY Transform( ::oTdbfConFac:QUANUNIT, "@E 9,999,999.99" ) ;
FONT ::oFnt_8 COLOR CLR_BLACK RIGHT
/* Se imprime tipo artículo.
-----------------------*/
UTILPRN ::oUtil Self:nLinea, 15.1 SAY ::oTdbfArticu:tipuunit ;
FONT ::oFnt_8 COLOR CLR_BLACK LEFT
/* Se calcula el precio.
-------------------*/
nEPreu := nContravalor( ::ArraJuva, ;
::oTdbfConFac:PREUUNIT, ;
::oTdbfConFac:MNDA, ;
::oTdbfFactur:MNDA )
/* Se imprime el precio.
-------------------*/
UTILPRN ::oUtil Self:nLinea, 17.2 ;
SAY Transform( nEPreu, ;
GetPicture( "N", 13, nDecMnda( ::ArraJuva, ::oTdbfFactur:Mnda ), .T. ) ;
) FONT ::oFnt_8 COLOR CLR_BLACK RIGHT
/* Se imprime el total.
------------------*/
nImport := ( nEPreu * ::oTdbfConFac:QUANUNIT )
nFPreu := nFPreu + nImport
UTILPRN ::oUtil Self:nLinea, 19.7 ;
SAY Transform( nImport, ;
GetPicture( "N", 13, nDecMnda( ::ArraJuva, ::oTdbfFactur:Mnda ), .T. ) ;
) FONT ::oFnt_8 COLOR CLR_BLACK RIGHT
/* Se calculan los descuentos del movimiento y se añaden a los de la factura.
------------------------------------------------------------------------*/
nEDescRapp := nImport * ::oTdbfConFac:DESCRAPP / 100
nEDescPron := ( nImport - nEDescRapp ) * ::oTdbfConFac:DESCPRON / 100
nERetencio := (( nImport - nEDescRapp) - nEDescPron ) * ::oTdbfFactur:PTGRETEN / 100
nFDescRapp := nFDescRapp + nEDescRapp
nFDescPron := nFDescPron + nEDescPron
nFRetencio := nFRetencio + nERetencio
/* Se captura el tipo de IVA y la base imponible.
--------------------------------------------*/
If ( nIVA := AScan( aIVA, { |eIVA| eIVA[1] = ::oTdbfConFac:TIPUIVA } ) ) > 0
aIVA[ nIVA ][ 2 ] := aIVA[ nIVA ][ 2 ] + ( nImport - nEDescRapp - nEDescPron - nERetencio )
nIVA := 0
Else
AADD( aIVA, { ::oTdbfConFac:TIPUIVA, ( nImport - nEDescRapp - nEDescPron - nERetencio ) } )
EndIf
EndIf
ISEPARATOR CMSEPARADOR
ISEPARATOR CMSEPARADOR
SysRefresh()
End While
nFReteIRPF := (((nFPreu - nFDescRapp) - nFDescPron) - nFRetencio) * ::oTdbfFactur:PTGIRPF / 100
If ValType( ::ArraJuva[1][1][1] ) = "O"
/* Se restaura el fin del área de impresión.
---------------------------------------*/
::nEndLine := ::oPrn:nVertSiZe() / 10 - 1 // En Cms
/* Se imprime los datos el vencimiento.
----------------------------------*/
UTILPRN ::oUtil 24.7, 2 SAY "Data i import venciment:" ;
FONT ::oFnt_8 COLOR CLR_BLACK LEFT
UTILPRN ::oUtil 25.1, 2 SAY ::oTDbfFactur:VENCIMEN ;
FONT ::oFnt_8 COLOR CLR_BLACK LEFT
UTILPRN ::oUtil 25.1, 6 SAY ;
Transform( Round( ::oTDbfFactur:IMPOVENC, nDecMnda2( ::ArraJuva, ::oTDbfFactur:MNDA)), ;
GetPicture( "N", 13, nDecMnda2( ::ArraJuva, ::oTdbfFactur:Mnda ), .T. ) ) ;
FONT ::oFnt_8 COLOR CLR_BLACK RIGHT
/* Se imprime la forma de pago.
--------------------------*/
UTILPRN ::oUtil 26.3, 2 SAY "Forma de pagament:" ;
FONT ::oFnt_8 COLOR CLR_BLACK LEFT
If ( uDummy := AScan( ArForPagCod( ::ArraJuva ), {| e | e == ::oTDbfFactur:FORMPAGA } ) ) > 0
UTILPRN ::oUtil 26.7, 2 SAY ArForPagLit( ::ArraJuva )[uDummy] ;
FONT ::oFnt_8 COLOR CLR_BLACK LEFT
EndIf
/* Se imprime los datos del I.V.A.
-----------------------------*/
UTILPRN ::oUtil 24.7, 8.5 SAY "Tipus I.V.A." ;
FONT ::oFnt_8 COLOR CLR_BLACK LEFT
UTILPRN ::oUtil 24.7, 11 SAY "B.I." ;
FONT ::oFnt_8 COLOR CLR_BLACK LEFT
UTILPRN ::oUtil 24.7, 12 SAY "Quota I.V.A." ;
FONT ::oFnt_8 COLOR CLR_BLACK LEFT
For nContador := 1 To Len( aIVA )
UTILPRN ::oUtil 24.7 + (nContador * CMSEPARADOR), 9.5 SAY Transform( aIVA[nContador][1], "@E 999.99") + "%" ;
FONT ::oFnt_8 COLOR CLR_BLACK RIGHT
UTILPRN ::oUtil 24.7 + (nContador * CMSEPARADOR), 11.5 SAY Transform( aIVA[nContador][2], ;
GetPicture( "N", 13, nDecMnda2( ::ArraJuva, ::oTdbfFactur:Mnda ), .T. ) ) ;
FONT ::oFnt_8 COLOR CLR_BLACK RIGHT
UTILPRN ::oUtil 24.7 + (nContador * CMSEPARADOR), 13.5 ;
SAY Transform( aIVA[nContador][2] * aIVA[nContador][1] / 100 , ;
GetPicture( "N", 13, nDecMnda2( ::ArraJuva, ::oTdbfFactur:Mnda ), .T. ) ) ;
FONT ::oFnt_8 COLOR CLR_BLACK RIGHT
nFIVA := nFIVA + ( aIVA[nContador][2] * aIVA[nContador][1] / 100 )
nFBI := nFBI + aIVA[nContador][2]
EndFor
UTILPRN ::oUtil 26.7, 11 SAY "Imports en " + cNameMnda( ::ArraJuva, ::oTdbfFactur:Mnda) ;
FONT ::oFnt_8 COLOR CLR_BLACK CENTER
UTILPRN ::oUtil 24.7, 14.5 SAY "Total" ;
FONT ::oFnt_8 COLOR CLR_BLACK LEFT
UTILPRN ::oUtil 24.7, 19.7 SAY Transform( nFPreu, ;
GetPicture( "N", 13, nDecMnda2( ::ArraJuva, ::oTdbfFactur:Mnda ), .T. ) ) ;
FONT ::oFnt_8 COLOR CLR_BLACK RIGHT
If nFDescRapp <> 0
UTILPRN ::oUtil 25.0, 14.5 SAY "Rappel" ;
FONT ::oFnt_8 COLOR CLR_BLACK LEFT
UTILPRN ::oUtil 25.0, 19.7 SAY Transform( -1 * nFDescRapp, ;
GetPicture( "N", 13, nDecMnda2( ::ArraJuva, ::oTdbfFactur:Mnda ), .T. ) ) ;
FONT ::oFnt_8 COLOR CLR_BLACK RIGHT
EndIf
If nFDescPron <> 0
UTILPRN ::oUtil 25.3, 14.5 SAY "Pron.pag." ;
FONT ::oFnt_8 COLOR CLR_BLACK LEFT
UTILPRN ::oUtil 25.3, 19.7 SAY Transform( -1 * nFDescPron, ;
GetPicture( "N", 13, nDecMnda2( ::ArraJuva, ::oTdbfFactur:Mnda ), .T. ) ) ;
FONT ::oFnt_8 COLOR CLR_BLACK RIGHT
EndIf
If nFRetencio <> 0
UTILPRN ::oUtil 25.6, 14.5 SAY "Retenció " + Transform(::oTdbfFactur:PTGRETEN, "@E 9,999.99" ) + "%";
FONT ::oFnt_8 COLOR CLR_BLACK LEFT
UTILPRN ::oUtil 25.6, 19.7 SAY Transform( -1 * nFRetencio, ;
GetPicture( "N", 13, nDecMnda2( ::ArraJuva, ::oTdbfFactur:Mnda ), .T. ) ) ;
FONT ::oFnt_8 COLOR CLR_BLACK RIGHT
EndIf
If nFReteIRPF <> 0
UTILPRN ::oUtil 25.9, 14.5 SAY "Ret. IRPF " + Transform(::oTdbfFactur:PTGIRPF, "@E 999.99" ) + "%";
FONT ::oFnt_8 COLOR CLR_BLACK LEFT
UTILPRN ::oUtil 25.9, 19.7 SAY Transform( -1 * nFReteIRPF, ;
GetPicture( "N", 13, nDecMnda2( ::ArraJuva, ::oTdbfFactur:Mnda ), .T. ) ) ;
FONT ::oFnt_8 COLOR CLR_BLACK RIGHT
EndIf
UTILPRN ::oUtil 26.3, 14.5 SAY "Quota I.V.A." ;
FONT ::oFnt_8 COLOR CLR_BLACK LEFT
UTILPRN ::oUtil 26.3, 19.7 SAY Transform( Round( nFIVA, nDecMnda2( ::ArraJuva, ::oTdbfFactur:MNDA ) ), ;
GetPicture( "N", 13, nDecMnda2( ::ArraJuva, ::oTdbfFactur:Mnda ), .T. ) ) ;
FONT ::oFnt_8 COLOR CLR_BLACK RIGHT
UTILPRN ::oUtil 26.7, 14.5 SAY "TOTAL FACTURA" ;
FONT ::oFnt_8 COLOR CLR_BLACK LEFT
UTILPRN ::oUtil 26.7, 19.7 SAY Transform( Round( nFPreu - nFDescRapp - nFDescPron - nFRetencio - nFReteIRPF + nFIVA, ;
nDecMnda2( ::ArraJuva, ::oTdbfFactur:MNDA ) ), ;
GetPicture( "N", 13, nDecMnda2( ::ArraJuva, ::oTdbfFactur:Mnda ), .T. ) ) ;
FONT ::oFnt_8 COLOR CLR_BLACK RIGHT
EndIf
RETURN .T.
METHOD Separator( nSpace ) CLASS TFACTUA1
// Si habido un salto de pagina despues de una linea de separacion
if Super:Separator( nSpace ) // Atentos. Llamada a la TImprime.
::Cabecera()
//::nLinea := 5
endif
Return Self
****************************************