La idea es: el .vrd pinta la factura; el PRG solo inyecta valores por ID de Γtem.
CΓ³mo estΓ‘ montada la factura
El invoice.vrd tiene 6 Γ‘reas:
ββββββββ¬ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Γrea β Archivo β QuΓ© es β
ββββββββΌββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 1 β invoice.v01 β Cabecera: empresa, cliente, nΒΊ, fecha, vencimiento β
ββββββββΌββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 2 β invoice.v02 β TΓtulos de columnas (cΓ³digo, descripciΓ³n, cantidadβ¦) β
ββββββββΌββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 3 β invoice.v03 β LΓnea de detalle (fila clara) β
ββββββββΌββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 6 β invoiceSchatten.v03 β LΓnea de detalle (fila sombreada, cebra) β
ββββββββΌββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 4 β invoice.v04 β Totales: base, IVA, total β
ββββββββΌββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 5 β Ganze Seite β Fondo de pΓ‘gina (se imprime primero) β
ββββββββ΄ββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Cada texto del diseΓ±ador tiene un ID. Ese ID es el que usas en ITEMIDS.
CΓ³digo mΓnimo para imprimirla
#include "FiveWin.ch"
#include "easyrep.ch"
FUNCTION PrintInvoice( lPreview, oWnd )
LOCAL oVRD, n, nPrintArea := 3
LOCAL nTotal := 0, nVAT := 0
LOCAL aLines
// Cabecera de la factura (puedes venir de un DBF)
LOCAL cCompany := "EasyReport Comp."
LOCAL cAddress := "Calle Mayor 12" + CRLF + "28013 Madrid"
LOCAL cCIF := "B-12345678"
LOCAL cInvNum := "2026-0042"
LOCAL dDate := Date()
LOCAL dPayDate := Date() + 30
LOCAL nTaxRate := 21
// LΓneas: cΓ³digo, descripciΓ³n, cantidad, precio, dto
aLines := { ;
{ "A001", "Monitor 27 pulgadas", 2, 189.00, 0 }, ;
{ "A002", "Teclado mecanico", 1, 79.50, 5 }, ;
{ "A003", "Cable HDMI 2m", 3, 12.00, 0 } }
EASYREPORT oVRD NAME "yinvoice\invoice.vrd" ;
PREVIEW lPreview OF oWnd MODAL
IF oVRD:lDialogCancel
RETURN .F.
ENDIF
// 5 = fondo de pΓ‘gina
PRINTAREA 5 OF oVRD
// 1 = cabecera (IDs del invoice.v01)
PRINTAREA 1 OF oVRD ;
ITEMIDS { 201, 500, 501, 602, 502, 603 } ;
ITEMVALUES { cCompany, cAddress, cCIF, cInvNum, ;
DToC( dDate ), DToC( dPayDate ) }
// 2 = tΓtulos de columnas
PRINTAREA 2 OF oVRD
// 3 / 6 = lΓneas (cebra)
FOR n := 1 TO Len( aLines )
nTotal += aLines[ n, 3 ] * aLines[ n, 4 ] - aLines[ n, 5 ]
PRINTAREA nPrintArea OF oVRD ;
ITEMIDS { 200, 201, 202, 203, 204, 205 } ;
ITEMVALUES { aLines[ n, 1 ], ;
aLines[ n, 2 ], ;
AllTrim( Str( aLines[ n, 3 ] ) ), ;
AllTrim( Str( aLines[ n, 4 ], 10, 2 ) ), ;
AllTrim( Str( aLines[ n, 5 ] ) ), ;
AllTrim( Str( aLines[ n, 3 ] * aLines[ n, 4 ] - aLines[ n, 5 ], 12, 2 ) ) }
nPrintArea := If( nPrintArea == 3, 6, 3 ) // fila clara / sombreada
NEXT
nVAT := nTotal * nTaxRate / 100
// 4 = pie de totales
PRINTAREA 4 OF oVRD ;
ITEMIDS { 310, 311, 312, 313 } ;
ITEMVALUES { AllTrim( Str( nTotal, 12, 2 ) ), ;
AllTrim( Str( nTaxRate, 5, 2 ) ), ;
AllTrim( Str( nVAT, 12, 2 ) ), ;
AllTrim( Str( nTotal + nVAT, 12, 2 ) ) }
END EASYREPORT oVRD
RETURN .T.
Los IDs tienen que coincidir con los del diseΓ±ador. En invoice.v01 / invoice.v03 / invoice.v04 estΓ‘n asΓ:
βββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ID β Campo β
βββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 201 β Empresa β
βββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 500 β DirecciΓ³n cliente β
βββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 501 β CIF β
βββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 602 β NΒΊ factura β
βββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 502 β Fecha β
βββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 603 β Vencimiento β
βββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 200β205 β CΓ³digo, descripciΓ³n, cantidad, precio, dto, importe β
βββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 310β313 β Base, % IVA, cuota IVA, total β
βββββββββββ΄ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Si el texto no sale, casi siempre es que el ID del PRG no es el del .v01.
CΓ³mo verlo y editarlo
- DiseΓ±ador:
cd C:\fwteam\samples\EasyReport
C:\fwteam\samples\build_new.bat erdsample hb32
Abre ..\yinvoice\invoice.vrd y mira cada Γ‘rea. En cada texto, el ID es el nΓΊmero que luego pasas en ITEMIDS.
- App de facturaciΓ³n completa (clientes, lΓneas, preview):
cd C:\fwteam\samples\misc
C:\fwteam\samples\build_new.bat yunus hb32
En Invoices hay un botΓ³n que llama a ViewInvoiceER().
Flujo tΓpico de una factura
PRINTAREA 5 // fondo / membrete de pΓ‘gina
PRINTAREA 1 // cabecera (datos fijos de esta factura)
PRINTAREA 2 // tΓtulos de columnas
loop lΓneas:
PRINTAREA 3 o 6 // cada fila
si se acaba la pΓ‘gina: PAGEBREAK + cabecera otra vez
PRINTAREA 4 // totales (reserva sitio: oVRD:nPageBreak - oVRD:aAreaHeight[4])
END EASYREPORT
Si hay muchas lΓneas, mira samples\EasyReport\examples\SourceExample2.prg: comprueba oVRD:nNextRow > oVRD:nPageBreak y hace PAGEBREAK oVRD antes de que los totales se corten.
PDF directo (sin diΓ‘logo):
EASYREPORT oVRD NAME "yinvoice\invoice.vrd" PREVIEW .T. FILE "factura.pdf"
Otra vΓa: expresiones (Cargo)
En SourceExample1.prg (albarΓ‘n/pedido) no se pasan todos los IDs. El diseΓ±ador usa expresiones tipo oVRD:Cargo[1] y el PRG solo rellena el array:
oVRD:Cargo := { "Nr. 12345 Date: 5.9.2004", ; // 1
"Testclient", ; // 2
... }
PRINTAREA 5 OF oVRD // el .vrd ya sabe quΓ© Cargo[n] pintar
Para una factura, ITEMIDS/ITEMVALUES (como yunus) suele ser mΓ‘s claro.