Ver Mensaje Individual
  #1  
Antiguo 08-12-2009
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 585
Reputación: 23
santiago14 Va por buen camino
Question CompositeReport con reportes anidados

Bueno, la cosa viene así.
Estoy haciendo un software para un campo de cria de vacas. Hay dos reportes diferentes Pesajes y Enfermedades.

Me están pidiendo que muestre un "informe completo" (pesajes + enfermedades) para toda la colección de animales.
Para que se entienda mejor, por cada animal debo mostrar el informe combinado. Por supuesto, para el propietario esto es un solo informe que ve en la vista previa e imprime.
Lo que hice fue poner un CompositeReport y a través de un for ir cambiando los valores de cada animal al momento del Add.

Un poco mas gráfico sería...

Código Delphi [-]
procedure TFrmBuscarPesajes.qrcrInformeMasivoAddReports(Sender: TObject);
begin
  With qrcrInformeMasivo.Reports, datamodule1, grillaBovinos1 do
  begin
    try
    //Iniciamos la iteración
      for i:= 1 to rowCount - 2 do
      begin
      //Con el pase de las variables globales, se evita el pase de las mismas
      //en cada informe por separado...
        globCodCaravana:=strToInt(cells[0, i]);
        Globcaravana:=cells[1, i];
        globMarca:=cells[2, i];
        globtatuaje:=cells[3, i];
        globcabana:=cells[4, i];
        globFcha_Nac:=cells[5, i];
        globtipo_bovino:=cells[6, i];
        globRaza:=cells[8, i];
        globFoto:=cells[7, i];
       //Agregamos una carátula por ser informe general
        Add(FrmInfGral.ReporteGral);
      //Informes comunes a todos...
        Add(FrmInPesajes.ReportePesajes);
        Add(FrmInfEnfermededes.ReporteEnfermedades);
     end; //del for...
    except
      raise;
    end;
  end; //del with
end;

Las variables "glob..." son las que ponen los diversos datos en los reportes.
Por ejemplo, en el caso de tener 10 vacas, me salen 10 hojas, pero los datos que pone en las 10 hojas corresponden a la última vaca de la lista.

La llamada al composite es de la siguiente manera:

Código Delphi [-]
procedure TFrmBuscarPesajes.btnInformeMasivoClick(Sender: TObject);
begin
  with GrillaBovinos1 do
  begin
    if RowCount > 2 then
    begin
      try
      //Hacemos la composición de informes...
        qrcrInformeMasivo.Preview;
      except
        on e:EMDOError do
      begin
        mErrores(e, 'Informe general no pudo completarse.', 'Informes');
      end;
      end;
    end
    else
    begin
      MessageBox(handle,'La grilla está vacía', 'Informe general masivo.',
        MB_OK + MB_ICONERROR);
    end;
  end;
end;
__________________
Uno es responsable de lo que hace y de lo que omite hacer.

Última edición por santiago14 fecha: 08-12-2009 a las 01:41:44. Razón: Errores en código
Responder Con Cita