A veces su trabajo requiere un mismo informe pero con algunas diferencias. Por ejemplo, cabeceras diferentes para secciones diferentes. Así, por ejemplo, el usuario del generador de informes ActiveReports quiere crear un informe como:
For example, the user select copies for the customer and for administration department.
After, the application has to show the two pages in a form viewer.
Vamos a implementar un informe de este tipo en FastReport.Net. Se puede formar un mismo informe y pasar a este diferentes parámetros para la cabecera. Sin embargo, si quiere obtener unos mismos con diferentes cabeceras en un solo informe, se puede hacer todo de otra manera. Podemos dublicar páginas del informe original para luego cambiar las cabeceras de estas páginas. La solución más fácil será mostrar en un informe de una sola página.
En el informe habrá un parámetro en el que, separados por comas, se numeren las cabeceras que hay que mostrar en este informe. En el script del informe duplicamos la página según la cantidad de los valores del parámetro, luego remplazamos el texto en las cabeceras de las nuevas páginas por uno necesario.
De esta manera, podemos crear páginas con diferentes cabeceras según los números que hemos pasado. Pero hay un problema. Tiene que calcular a mano el número del objeto de texto en el que hay que remplazar el texto. Por ejemplo, en mi informe hay 9 objetos de texto. El primer de estos es una cabecera. Entonces, el décimo también es otra cabecera pero en una nueva página. Si añadimos a los 10 9 más, obtenemos el número de la cabecera en la tercera página, etc.
Estará más claro cuando vea el script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
private void _StartReport(object sender, EventArgs e) { //Parse parameter string parameter = (string)Report.GetParameterValue("Parameter"); string[] arr = parameter.Split(','); //Number of text obj that is header int step = 10; foreach (string item in arr) { ReportPage newPage = new ReportPage(); newPage.AssignAll(Page1); Report.Pages.Add(newPage); newPage.CreateUniqueName(); foreach (object obj in newPage.AllObjects) { if (obj is Base) { (obj as Base).CreateUniqueName(); } } TextObject txt = Report.FindObject("Text"+ step.ToString()) as TextObject; switch (item) { case "1": txt.Text = "Header 1"; break; case "2": txt.Text = "Header 2"; break; case "3": txt.Text = "Header 3"; break; } step = step + 9; } Report.Pages.Remove(Page1); } |
Vamos a examinar este scrip con lupa. Hemos utilizado el evento StartReport. Es en el manejador de eventos donde vamos a trabajar con las páginas del informe. El informe ya tiene una página desarrollada que, esencialmente, es un informe preparado cuya base vamos a utilizar para hacer varios pero con cabeceras diferentes.
En primer lugar, parseamos un parámetro del informe. Como hemos dicho anteriormente, se pasa al parámetro la secuencia de los identificadores de modelos que queremos mostrar. Los identificadores se separan por comas. A continuación, en el ciclo revisamos los identificadores obtenidos del parámetro del informe. Para cada uno de ellos se crea una página a base de la existente, se calcula el objeto de texto con la cabecera. Según el identificador del modelo, se establece un valor para el objeto de texto de la cabecera. Después de crear un "paquete" de páginas necesarias, eliminamos la primera página de modelo.
Como resultado obtenemos varios informes dentro de uno. Administrar la cantidad de estos informes (páginas) se puede pasando al informe el valor del parámetro, es decir, combinación deseada de identificadores o cabeceras.