en

Tecnologia

Estripando Crystal Reports desde el Código

Hola amigos y amigas

Hoy les traigo un código muy útil cuando trabajen con crystal.

Primero que todo CR trae una caracteristica llamada SubReportes, simplemente es que en un reporte principal ustedes pueden insertar lo que se llaman subreportes, que no son más que reportes comunes y normales.

El siguiente código les muestra como manipular un subreporte que se encuentra dentro de un reporte principal.

Recuerden que es código mio y pues si lo usan deben ajustar los valores a sus proyectos.

SubreportObject sbrObjetoContadorCierre = null;

ReportDocument rdOficinasCierre    = new ReporteCierreOficinas();

string strSubReporteNombre = "";

ReportDocument rdContadoresCierre = new ReportDocument();

//Obtener el ReportObject por nombre como un SubreportObject para Contadores de Cierre
     sbrObjetoContadorCierre = 
      rdOficinasCierre.ReportDefinition.ReportObjects[5] as SubreportObject;
     //Obtiene el nombre del subreporte
     strSubReporteNombre = sbrObjetoContadorCierre.SubreportName;
     //Abre el subreporte como un ReportDocument.
     rdContadoresCierre = rdOficinasCierre.OpenSubreport(strSubReporteNombre);
     //Fija la fuente de datos del subreporte de Oficinas Pendientes     
     rdContadoresCierre.SetDataSource(dtReporteContadoresCierre);  

     return(rdOficinasCierre);

Arriba entonces defino los objetos que necesito, y la aprte de abajo va má o menos así:

En sbrObjetoContadorCierre por casteo normal y corriente se obtiene de la colección

ReportObjects el objeto tipo  SubreportObject que está incrustado en el reporte principal que está identificado por rdOficinasCierre.

Luego strSubReporteNombre almacena el nombre del subreporte, nombre que ustedes pueden manipular a través de la ventana de propiedades del subreporte en la propiedad SubreportName.

Luego fijense que con el nombre almacenado en strSubReporteNombre se obtiene el objeto SubReporte que al final es un ReportDocument como les dije anteriormente, es un reporte comun y corriente.

Luego para rdContadoresCierre se fija la fuente de datos que puede ser DataTable, DatSet, en fin una fuente de datos, pero finalmente se retorna el rdOficinasCierre que es el reporte principal que contiene al subreporte.

recuerden que  pueden tener varios subreportes dentro del principal, obviamente hasta que el diseño y su necesidad lo permita.

Un abrazo

Att. Andres Ortiz

Publicado ago 27 2007, 09:49 por admin
Archivado en: ,,

Comentarios

 

admin ha opinado:

Hola, espero que te vaya bien.

Quiero hacerte la consulta del problema que me surgió al probar el código que muestras en este ejemplo.

A la hora de crear la variable de subreporte, la creas en null; luego le asignas el valor:

sbrObjetoContadorCierre = rdOficinasCierre.ReportDefinition.ReportObjects[5] as SubreportObject;

y apartir de allí asignas lo necesario a cada variable, sin embargo, hago exactamente lo mismo que haces, pero a la hora de hacer esta asignación me genera una excepción de tipo System.NullReference que dice "Object reference not set to an instance of an object.".

Probé con cada uno de los elementos de ReportObjects y con todos pasa exactamente lo mismo.

Me pareciere ser que al inicializar el subreporte debiese inicializarlo en algún valor (aunque la clase de subReportObject no tiene constructores) en vez de inicializarlo en null.

Te agradezco la ayuda, porque es lo único que me falta para entender bien cómo generar un subreporte a partir de un reporte en C#.

Gracias. Bendiciones.

agosto 27, 2007 9:54
 

admin ha opinado:

Hola

Bueno quiza yo coloque código ahi, epro segurtamente pyuede escaparse algo.

Aqui un pedazo de código de algo que funciona perfectamente, y espero te sirva para salir del enredo.

private ReportDocument subReporte = null;

private void Consultar()

{

this.crvVisorReporte.Visible = true;

this.lblMensajeEspera.Visible = false;

string unCodigo = "";

if(Request["codigoDecFEP"] != null)

unCodigo = Request["codigoDecFEP"];

try

{

Fachada miFachada = new Fachada("declaraciones", Session.SessionID);

DataSet miDataSet = new DataSet();

SubreportObject subReportObject = null;

// Crea el reporte

repConsultaFormulario miReporte = new repConsultaFormulario();

//Agrego el cabezote a Cache, para mantener el DataSet para cada subreporte que muestra el cabezote

if(Cache["Cabezote"] == null)

Cache["Cabezote"] = miFachada.ConsultarEncabezado_DS(unCodigo);

// Abre el subreporte que presenta el cabezote

miDataSet = (DataSet)Cache["Cabezote"];//miFachada.ConsultarEncabezado(unCodigo);

subReporte = new ReportDocument();

subReportObject = miReporte.ReportDefinition.ReportObjects["subRepCabezote"] as

SubreportObject;

subReporte = miReporte.OpenSubreport(subReportObject.SubreportName);

subReporte.SetDataSource(miDataSet.Tables[0]);

miDataSet = new DataSet();

// Consulta la información a mostrar en el reporte principal

miDataSet = miFachada.Consultar(unCodigo, Session["TipoUsuario"].ToString());

miReporte.SetDataSource(miDataSet.Tables[0]);

this.crvVisorReporte.ReportSource = miReporte;

this.crvVisorReporte.DataBind();

this.Session["ReporteDeclaracion"] = miReporte;

//Se limpia la Cache para posteriores reportes

Cache.Remove("Cabezote");

}

catch (Exception ex)

{

 //Aqui hace algo....

}

}

Hombre espero te sirva de guia esto

felices lineas de código

Att. Andres Ortiz

agosto 27, 2007 9:58
Copyright © 2003 - 2007 Célula Unicauca.NET.
Ofrecido por Community Server (Non-Commercial Edition)