PDA

Ver la Versión Completa : Problema con FastReport 3, con un formato de factura


David
01-04-2009, 18:12:55
hola

Estoy con fastReport 3, y quiero hacer lo siguiente, imprimir una factura en un papel preimpreso, así cada memo tiene que estar en un lugar para que salga en la casilla correspondiente.

Tengo una tabla de factura y otra DetalleFactura. Hay una relación maestro detalle entre ambas.

El formato es así

Datos de la factura (datos del cliente, número)-> esto tiene que salir en cada página. Tabla Factura.

Detalle (articulos y sus precios) -Tabla DetalleFactura

Total, forma de pago, anotaciones -> tabla Factura (tiene que salir en la parte de abajo de la página y sólo en la última página de la factura en cuestión).

Decir que se pueden imprimir varias facturas a la vez.

He hecho esto:

PageHeader -> vacio para dejar un espacio en blanco
GroupHeader -> Datos Factura (masterData, no vale porque tiene que salir en cada página)
masterdata -> vacio
DetailData -> Detalles con articulos y sus precios
GroupFooter -> Datos de la parte de abajo.

Como el GroupFooter sale después de que el DetailData haya completado los datos, pues inserto en el dataset, registros en blanco, hasta para rellenar espacio y que el GroupFooter, salga abajo. Pregunta, porque no pongo entonces un PageFooter, pues porque si pongo los memos con datos de factura muchos datos no salen, no sé porque pero es así.

Problema, si hay tantos artículos que ocupan dos páginas, el detalle llega hasta el final, y no sé corta donde se supone que empieza el GroupFooter.

Ejemplo.

Cliente tal y tal
Factura:1

articulo1
articulo2
.....


articulon (si han n-x articulos, se inserta espacios en blanco hasta que sea n)

Pie de pagina -> GroupFooter

ejemplo con más de n artículos.

Cliente tal y tal
Factura1

articulo1
articulo2
.......

articulon -> aquí empezaria el GroupFooter, pero como ocupa dos o más paginas, este no aparece y el detalle no se corta y continua fuera de la zona permitida, tendría que cortarse en el articulo n y seguir el detalle en otra página.¿Pero esto no veo la manera de hacerlo?

Bueno esto es todo, veo casi imposible que alguien de una respuesta, pero después de todo el día voy a probar suerte poniendo este post.:D

Kipow
01-04-2009, 18:49:08
Yo utilizo este codigo para colocar mi banda Summary al final de la hoja en su evento beforeprint

Engine.CurY := Engine.CurY + Engine.FreeSpace - ReportSummary1.Height -1

PD. Esto es en el fastreport.

David
01-04-2009, 18:57:01
vale pero supon que tienes dos hojas, el sumary esta al final de la segunda hoja, en la primera hay datos

dato1
dato2
...

daton
Aquí esta el hueco del sumary, pero como no es visible sólo en la segunda hoja,
sigue el dataset
datoa
datob


otra hoja

datoc
datod

Mi intención es que si hay sumary, no hay problemas, pues los datos se cortan en el punto exacto, pero si no hay sumary sigue hasta el final. Lo que yo quiero es que por ejemplo el espacio del sumary pues aparezca en todas las páginas, aunque la información este en la última.

Kipow
01-04-2009, 21:29:33
if (Engine.FreeSpace >= ReportSummary1.Height -1) then
begin
Engine.CurY := Engine.CurY + Engine.FreeSpace - ReportSummary1.Height -1;
end
else
Engine.NewPage;

Asi lo tengo mira, y me funciona como queres.

David
02-04-2009, 16:05:50
Gracias, si me ha salido, además he añadido en el evento before print del detailData, el siguiente código:


procedure DetailData1OnBeforePrint(Sender: TfrxComponent);
begin
if (Engine.FreeSpace <= GroupFooter1.Height +15) then
Engine.NewPage;
end;


donde pongo 15, puede ser 10, 25, etc... hay que ir probando para ir ajustando.

David
03-04-2009, 13:29:50
Me ha surgido una duda, no es algo que necesite hacer, no me lo han pedido aún, pero la tengo en mente.

Si tienes el GroupFooter o el Summary en la parte de abajo y necesitas poner el número de página, en cada pagina ¿Cómo lo haces? He pensado que se puede poner debajo del GroupFooter una pageFooter estrecho, pero imaginemos que el número de página tiene que estar en una distancia media del Groupfooter.

Imaginemos el GroupFooter(o un Summary) así, en la parte inferior de la página

......................................... -> Top de la banda
Datos

...................... página 1/3
Otros datos
...................................... -> botton de la banda

Si el GroupFooter sólo aparece en la última página y queremos que el número de página aparezca en cada página, en la posición indicada ¿Cómo se hace?:confused:

Kipow
04-04-2009, 02:29:30
En ese acaso agregas un PageFooter, y restas el alto de la misma tamaño en la formula que utilizaste antes.

santiago14
14-03-2016, 18:01:26
Gracias, si me ha salido, además he añadido en el evento before print del detailData, el siguiente código:


procedure DetailData1OnBeforePrint(Sender: TfrxComponent);
begin
if (Engine.FreeSpace <= GroupFooter1.Height +15) then
Engine.NewPage;
end;


donde pongo 15, puede ser 10, 25, etc... hay que ir probando para ir ajustando.

Gracias. Me sirvió de mucho este Post.
Lo comento de paso.
Al parecer, hay un problema en FastReport cuando está poniendo las anclas (Anchors). A veces, la banda de datos empieza como "al ras" del final de la hoja, el ancla indica la hoja 19 pero visualmente el texto comienza en 20 (Esto es un ejemplo de numeración)
En el índice, y en lo usuarios, genera un gran revuelo.
Encontré la solución trabajando con FreeSpace y jugando un poco con los pixeles.
Mando el pedacito de código.

//Todo esto en el Script de FastReport

{Controlamos que la altura del espacio en blanco (FreeSpace) que va quedando sea menor a cierto
valor, en pixeles. Con esto, pasamos a nueva página o no}
procedure ControlFinPagina(AlturaMinima:integer);
var
px:integer;
begin
px:=AlturaMinima;
if Engine.FreeSpace <= px then
begin
Engine.NewPage;
end;
end;

procedure mdAvisosSeccionAdmOnBeforePrint(Sender: TfrxComponent);
begin
{Controlamos que la altura del final de la página sea menor, o no, que cierto número.
En base a eso, pasamos o no, a una página nueva}
ControlFinPagina(30);
end

//El ancla...
procedure rchAvisoAdmOnAfterData(Sender: TfrxComponent);
begin
Engine.AddAnchor(<SeccAdministrativaPaginado."IDENTIFICADOR">);
end;


Espero que sea de ayuda a los que le pasa lo mismo.