A veces tiene que utilizar partes de un informe en otro. En casos simples, puede usar la herencia de informes para hacer esto.
Por ejemplo, hay un caso en el que todos los informes tienen elementos comunes (logotipo de la empresa, firma, etc.). Luego, estos objetos se pueden mover a un informe principal y, al crear informes secundarios, se copiarán automáticamente. Por lo tanto, no es necesario copiarlos manualmente cada vez, lo que simplifica y acelera enormemente la creación de nuevos informes. Además, si cambia algo en el informe principal, estos cambios también se reflejarán en todos los informes secundarios.
Sin embargo, la herencia de informes tiene varias limitaciones. Hay casos en los que un informe tenía un "padre" y se hizo necesario hacer que un "padre" fuera un informe completamente diferente. Puede parecer suficiente cambiar la propiedad BaseReport, pero, desafortunadamente, no funcionará.
Sin embargo, este problema se puede resolver de una manera elegante, reemplazando las bandas de un código de informe por bandas de otro.
Supongamos que hay un informe de referencia (base.frx) y sus bandas deben copiarse en un informe secundario (child.frx). Debe reemplazar PageHeader, PageFooter y DataBand con el nombre "Data1". Los siguientes ejemplos de código asumen que ambos informes se encuentran en la carpeta raíz de la unidad C.
Primero, debe descargar ambos informes:
El siguiente paso es obtener las páginas de ambos informes. Es importante conocer los nombres de las páginas. El siguiente ejemplo asume que el nombre de la página en ambos informes es "Página1":
ReportPage basePage = base.FindObject("Page1") as ReportPage; ReportPage childPage = child.FindObject("Page1") as ReportPage;
Si no conoce los nombres de las páginas, puede obtenerlos del índice. Por ejemplo, además obtenemos acceso a las primeras páginas de ambos informes:
ReportPage basePage = baseReport.Pages[0] as ReportPage; ReportPage childPage = childReport.Pages[0] as ReportPage;
Ambas opciones son apropiadas y conducen al mismo resultado.
Ahora puede reemplazar PageHeader y PageFooter. Es bastante simple:
childPage.PageHeader = basePage.PageHeader; childPage.PageFooter = basePage.PageFooter;
Estas líneas copian las dos bandas con todas las propiedades y configuraciones. Además, todos los objetos ubicados en ellos se duplican y las propiedades no se pierden.
A continuación, reemplace DataBand con el nombre "Data1":
DataBand baseBand = basePage.FindObject("Data1") as DataBand; DataBand childBand = childPage.FindObject("Data1") as DataBand; // you need to get the Data1 index in the child report int childBandIndex = childPage.Bands.IndexOf(childBand); // you can now delete it childPage.Bands.Remove(childBand); // and insert the band from the base report in its place childPage.Bands.Insert(bandIndex, baseBand);
Al final, se copia la banda con todas las propiedades y los objetos secundarios, y también se transfiere el enlace a la fuente de datos que es responsable de la propiedad DataSource. Sin este enlace, la banda no funcionará correctamente y no generará datos de la base de datos.
Solo necesitamos copiar las fuentes de datos. Esto se hace con el siguiente fragmento de código:
for (int i = 0; i < baseReport.Dictionary.DataSources.Count; i++) { childReport.Dictionary.DataSources.Add(baseReport.Dictionary.DataSources[i]); }
Por tanto, se han copiado todas las fuentes de datos. Si no es necesario, puede clonar solo aquellos que desee.
Eso es. Un par de docenas de líneas de código hicieron posible copiar las bandas y los objetos de un informe a otro. Si tiene muchos objetos en las bandas, es bastante largo y aburrido duplicarlos con un diseñador, e incluso lleva más tiempo crearlos desde cero.
Por supuesto, si el informe de línea de base solo tenía las bandas copiadas en este ejemplo, entonces esta tarea se puede realizar aún más fácilmente: copiando y pegando trivialmente el archivo del informe. Dejando a un lado las bromas, puede usar este método para copiar una o más bandas de un conjunto cuando no las necesite todas en un nuevo informe. O puede tomar un encabezado de página de un informe, una banda de datos de otro y un pie de página de un tercero.