Publicado el 29 de Mayo del 2017
958 visualizaciones desde el 29 de Mayo del 2017
301,4 KB
9 paginas
Creado hace 12a (19/11/2012)
EJEMPLO 5. SUBINFORMES
En este ejemplo vamos a ver la forma de crear un informes dentro de otro.
Para ello disponemos de una clase, llamada ClasePedidos, con los pedidos de una tienda, y la
clase ClaseLineas, con los artículos de cada pedido.
Empezamos creando un nuevo elemento “Web Form” llamado ejer5.aspx.
Para este ejercicio vamos a crear una tabla con los pedidos y dos botones. Al pulsar sobre uno,
veremos el informe con los artículos de ese pedido y, al pulsar sobre el otro, veremos el pedido
con los artículos como subinforme.
Empezamos creando la tabla, para ello, arrastramos un componente GridView al formulario.
Para asignarle los datos, vamos a su evento Page_Load y insertamos el siguiente código:
if(!IsPostBack)
{
GridView1.DataSource = new ClasePedidos().Todos();
GridView1.DataBind();
}
Para crear los dos botones vamos a crear una nueva columna del tipo “Template” y, en ella,
insertar dos botones.
Pulsamos sobre “Agregar nueva columna” del menú del GridView y seleccionamos el tipo
“TemplateField”:
Ahora, en el mismo menú anterior, pulsamos sobre “Editar plantillas” y agregamos dos
botones a la plantilla.
A uno le ponemos como nombre “Pedido” y al otro “Articulos”.
Importante: Pulsamos doble Click en cada botón para crear el evento de cada botón para
posteriormente utilizarlo.
Para finalizar de editar la plantilla seleccionamos “Terminar edición de plantilla”.
CREAMOS EL INFORME
A continuación, vamos a crear el informe de artículos (Botón derecho sobre el proyecto y
“Agregar nuevo elemento…” de tipo informe) y le ponemos como nombre InformeArticulos.
A este elemento le vamos a añadir un nuevo conjunto de datos llamado “DataSetArticulos”.
Para añadir el nuevo conjunto de datos hay que darle a la opción añadir de los datos del
informe.
Una vez añadidos los datos, arrastramos un elemento tabla y le asignamos todos los datos
excepto IdPedido.
ENLAZAMOS LOS DATOS
Ahora vamos a crear un nuevo formulario llamado “articulos.aspx” con un ReportViewer y un
ScriptManager. Este nuevo formulario recibirá el pedido por una variable de session y filtrará
los artículos.
En el evento Page_Load de este formulario agregamos el siguiente código:
if(!IsPostBack)
{
if(Session["pedido"] != null)
{
string pedido = (string) Session["pedido"];
Session.Remove("pedido");
ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.LocalReport.DataSources.Add(
new ReportDataSource("DataSetArticulos",
new ClaseLineas().Filtro(int.Parse(pedido))));
ReportViewer1.LocalReport.ReportPath = "InformeArticulos.rdlc";
ReportViewer1.LocalReport.Refresh();
}
}
Para que esto funcione, solamente nos queda insertar el código del botón. Será el siguiente:
Button boton = (Button)sender;
GridViewRow fila = (GridViewRow)boton.NamingContainer;
string pedido = fila.Cells[1].Text;
Session["pedido"] = pedido;
Response.Redirect("articulos.aspx");
CREAMOS EL INFORME DE PEDIDO
Ahora vamos a crear el informe que contendrá, como subinforme, el informe anteriormente
creado.
Creamos un nuevo informe llamado “InformePedido” y le agregamos el informe de datos de la
ClasePedidos(el nuevo origen de datos se llamará DataSetPedidos).
El nuevo informe tendrá esta forma:
Pulsando con el botón derecho sobre el subinforme y seleccionando “Propiedades del
subinforme…” podremos cambiar sus propiedades.
De momento, lo más importante es ponerle en nombre del informe que debe abrir. Este
nombre lo deberemos poner donde dice “Usar este informe como un subinforme” (no se pone
la extensión del informe).
Ahora, vamos a crear la página que va a ser la encargada de mostrar el informe. A este nuevo
formulario le llamaremos “pedidos.aspx” y en el agregaremos un ReportViewer y un
ScriptManager.
En el evento Page_Load tendrá en siguiente código:
if (!IsPostBack)
{
if (Session["pedido"] != null)
{
string pedido = (string)Session["pedido"];
Session.Remove("pedido");
ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.LocalReport.DataSources.Add(
new ReportDataSource("DataSetPedidos",
new ClasePedidos().Filtro(int.Parse(pedido))));
ReportViewer1.LocalReport.ReportPath = "InformePedidos.rdlc";
ReportViewer1.LocalReport.Refresh();
}
}
Ahora, nos falta insertar el código del botón:
Button boton = (Button)sender;
GridViewRow fila = (GridViewRow)boton.NamingContainer;
string pedido = fila.Cells[1].Text;
Session["pedido"] = pedido;
Response.Redirect("pedidos.aspx");
EVENTO SUBREPORTPROCESSING
Si comprobamos el resultado sin el elemento subinforme funcionará correctamente, pero si lo
hacemos con él, fallará. Esto es debido a que no le estamos enlazando los datos al subinforme.
Para hacerlo tendremos que crear el siguiente evento y añadírselo al informe.
En pedidos.apsx.cs agregamos el siguiente evento:
void SubreportProcessingEventHandler(object sender, SubreportProcessingEventArgs
e)
{
e.DataSources.Add(
new ReportDataSource("DataSetArticulos",
new ClaseLineas().Todos()));
}
Para agregar el evento, el código del Page_Load quedará así:
if (!IsPostBack)
{
if (Session["pedido"] != null)
{
string pedido = (string)Session["pedido"];
Session.Remove("pedido");
ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.LocalReport.SubreportProcessing +=
new SubreportProcessingEventHandler(SubreportProcessingEventHandler);
ReportViewer1.LocalReport.DataSources.Add(
new ReportDataSource("DataSetPedidos",
new ClasePedidos().Filtro(int.Parse(pedido))));
ReportViewer1.LocalReport.ReportPath = "InformePedidos.rdlc";
ReportViewer1.LocalReport.Refresh();
}
}
Ahora, el subinforme funciona, pero no filtra los datos. Para conseguir que los filtre habrá que
pasarle un parámetro al componente del informe y al subinforme.
Vamos primero al subinforme. Abrimos “InformeArticulos.rdlc” y agregamos un nuevo
parámetro de tipo entero llamado “pedido”.
Ahora
falta pasárselo desde el
componente Subinforme. Para ello, abrimos
“InformePedidos.rdlc” y abrimos el panel de las propiedades del subinforme.
En su solapa “Parámetros” añadimos uno con el mismo nombre y con valor el dato IdPedido.
Ya solamente nos queda decirle al subinforme, en el momento de pasarle los datos, nos filtre
por
el
valor del parámetro. Así que
cambiamos
el
código del
evento
SubReportProcessingEventHandler por el siguiente:
e.DataSources.Add(
new ReportDataSource("DataSetArticulos",
new ClaseLineas().Filtro(int.Parse(e.Parameters[0].Values[0]))));
PROBLEMAS CON EL PARÁMETRO
El botón ahora funciona correctamente, pero si nos fijamos, el otro botón no muestra datos ya
que espera un parámetro y no se lo estamos pasando.
Para que funcione, basta con ir a las propiedades del parámetro de “InformeArticulos.rdlc” y
decirle que el parámetro permita nulos.
Comentarios de: Ejemplo5- Subinformes (0)
No hay comentarios