Ver Mensaje Individual
  #14  
Antiguo 19-02-2014
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 646
Reputación: 23
mRoman Va por buen camino
Solucionado

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
    { Private declarations }
     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
     /* PROCESO DE LLENADO PARA IMPRIMIR LA NOTA DE ENTRADA DE LECHE AL ALMACEN*/
     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); // primer informe agregado.
          comprep.Reports.Add(qrNotaECopia.NotaECopia); // segundo informe agregado....que es el mismo q el primero.

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.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!

Última edición por mRoman fecha: 19-02-2014 a las 12:50:47.
Responder Con Cita