Hola amigos....
Creo haber resuelto el problema. Ahora ya tengo un encabezado, detalle y pie de página en la primera y segunda mitad de una hoja tamaño carta.
De antemano les comento q no estoy satisfecho con la solución, porq talvez no sea la mas óptima, ademas de q tiene un inconveniente con respecto a las lineas impresas del detalle y con el CompositeReport.
Ahi va la explicación:
Al quickreport le quite las bandas y solo use un GroupHeader, Detail y GroupFooter. Despues le cambié el tipo de hoja al QuickReport1 a A5, ah y tambien le cambie el nombre a NotaECopia.
Despues en el formulario de donde mando llamar al QuickReport, agregue el componente CompositeReport, para agregar los informes:
Código Delphi
[-]procedure TfrmOpImpEntSali.QRCompositeReport1AddReports(Sender: TObject);
begin
with QRCompositeReport1.Reports do
begin
comprep.Reports.Add(qrNotaECopia.NotaECopia);
comprep.Reports.Add(qrNotaECopia.NotaECopia);
end;
end;
Para lo anterior tuve que declarar en las variables privadas del formulario, la variable
comprep:
Código Delphi
[-]
private
comprep: TQRCompositeReport;
Ademas de declarar un procedure:
Código Delphi
[-]
procedure MakeComp(Sender: TObject);
En el cuerpo de dicho procedimiento (no confundir con SP), esto:
Código Delphi
[-]
procedure TfrmOpImpEntSali.MakeComp(Sender: TObject);
begin
comprep:=TQRCompositeReport.Create(frmOpImpEntSali);
comprep.OnAddReports :=frmOpImpEntSali.QRCompositeReport1AddReports;
comprep.Preview;
comprep.Free;
end;
Y en el evento OnClick del Boton para generarlo, esto:
Código Delphi
[-]procedure TfrmOpImpEntSali.BitBtn1Click(Sender: TObject);
begin
ModDatos.trsFluida.Active:=FAlse;
ModDatos.trsFluida.StartTransaction;
spcFormatos.Close;
spcFormatos.ParamByName('ifolio_ini').AsString:=mskFolioIni.Text;
spcFormatos.ParamByName('ifolio_fin').AsString:=mskFolioFin.Text;
spcFormatos.ParamByName('imes').AsInteger:=cbxMes.ItemIndex+1;
spcFormatos.ParamByName('IANIO').AsString:=mskAnio.Text;
spcFormatos.ExecProc;
qrNotaECopia.qryDatos.Close;
qrNotaECopia.qryDatos.ParamByName('mes').AsInteger:=cbxMes.ItemIndex+1;
qrNotaECopia.qryDatos.ParamByName('anio').AsString:=mskAnio.Text;
qrNotaECopia.qryDatos.ParamByName('folio1').AsString:=mskFolioIni.Text;
qrNotaECopia.qryDatos.ParamByName('folio2').AsString:=mskFolioFin.Text;
qrNotaECopia.qryDatos.Open;
MakeComp(Sender);
end;
En el código anterior tengo un componente TIBStoredProc, el cual mando llamar para llenar una tabla de paso y almacenar nuevamente el detalle mas algunos registros "en blanco" hasta llegar a 15....porq 15?....porq son los registros que le caben al formato, si se imprime el registro 16 el GroupFooter se imprime en la siguiente página.....(este es el problema q les comente al principio sobre las lineas de impresion), estoy tratando de como resolver esto y controlarlo para q se imprima todo (GroupHeader, Detail y GroupFooter)en la siguiente pagina lo q hace falta.
Este es el cuerpo del SP:
Código SQL
[-]CREATE PROCEDURE LLENAR_RPT_PASO_E_S (
imes numeric(2,0),
ianio numeric(4,0),
ifolio_ini numeric(6,0),
ifolio_fin numeric(6,0))
as
declare variable vlineas numeric(2,0);
declare variable vfolio numeric(6,0);
declare variable vconsec numeric(3,0);
declare variable vdescr varchar(100);
declare variable vcodigo numeric(4,0);
declare variable vcant numeric(5,0);
declare variable vunidad varchar(15);
declare variable vmax_consec numeric(2,0);
begin
delete from rpt_paso_e_s_detalle;
vLineas=0;
for select b.folio,
b.consec,
b.cantidad_surtida,
b.unidad_producto,
c.descripcion||' 1-'||c.piezas||' '||c.equivalente_litros||' '||lower(c.unidad_medida) as descripcion,
substr(c.cve_producto,8,11) as codificacion
from registro_e_s a,
registro_e_s_detalle b,
producto c
where a.folio between :ifolio_ini and :ifolio_fin
and extract(month from a.fecha_folio)=:imes
and extract(year from a.fecha_folio)=:ianio
and a.movimiento_e_s='E'
and a.folio=b.folio
and b.cve_producto=c.cve_producto
order by b.folio,
b.consec
into :vfolio,
:vconsec,
:vcant,
:vunidad,
:vdescr,
:vcodigo do
begin
if (vconsec=1) then
begin
select max(c.consec)
from registro_e_s_detalle c
where c.folio=:vfolio
into :vmax_consec;
end
if (vconsec < vmax_consec) then
begin
insert into RPT_PASO_E_S_DETALLE(MOVIMIENTO_E_S_1,
FOLIO_1 ,
CONSEC_1 ,
CANTIDAD_SOLICITADA_1,
CANTIDAD_SURTIDA_1 ,
UNIDAD_PRODUCTO_1 ,
DESCRIPCION,
CODIFICACION )
values ('E',
:vfolio,
:vconsec,
:vcant,
:vcant,
:vunidad,
:vdescr,
:vcodigo);
end Else
begin
insert into RPT_PASO_E_S_DETALLE(MOVIMIENTO_E_S_1,
FOLIO_1 ,
CONSEC_1 ,
CANTIDAD_SOLICITADA_1,
CANTIDAD_SURTIDA_1 ,
UNIDAD_PRODUCTO_1 ,
DESCRIPCION,
CODIFICACION )
values ('E',
:vfolio,
:vconsec,
:vcant,
:vcant,
:vunidad,
:vdescr,
:vcodigo);
vmax_consec=vmax_consec+1;
while (vmax_consec<=15) do
begin
insert into RPT_PASO_E_S_DETALLE(MOVIMIENTO_E_S_1,
FOLIO_1 ,
CONSEC_1 ,
CANTIDAD_SOLICITADA_1,
CANTIDAD_SURTIDA_1 ,
UNIDAD_PRODUCTO_1 ,
DESCRIPCION,
CODIFICACION )
values ('E',
:vfolio,
:vmax_consec,
null,
null,
null,
null,
null);
vmax_consec=vmax_consec+1;
end
end
end
end
Sé que el código anterior se puede mejorar....pero hasta el momento este me funciona.
El CompositeReport agrega varios informes en uno solo en apariencia, solo q el priimer informe lo agrega desde la pagina 1 hasta la N pagina y el segundo nuevamente desde la pagina 1 hasta la N...que quiero decir?, que en mi caso se imprime el No. de Folio 1 hasta el 1000 y enseguida del 1000 el folio 1 nuevamente yhasta el mil.....EN LA PRIMER HOJA IMPRESA SE IMPRIMEN EL FOLIO 1 Y EL 2, EN LA HOJA 2 EL FOLIO 3 Y 4 y asi hasta el mil, y el segundo informe agregado igual....q talvez al final no importaria porq el usuario los tiene q separar (cortar) de todas maneras ya q uno seria el original y el otro la copia (no sé si me haya explicado)
Código Delphi
[-]
comprep.Reports.Add(qrNotaECopia.NotaECopia); comprep.Reports.Add(qrNotaECopia.NotaECopia);
Bien hasta ahorita es lo q llevo....y esta funcionando, falta detallarlo mas por supuesto asi q se aceptan sugerencias muchachos y muchachas.....
Espero q a alguien mas le pueda servir. Saludos.