Está en la página 1de 9

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 artculos 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 artculos de ese pedido y, al pulsar sobre el otro, veremos el pedido
con los artculos 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 cdigo:
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 botn para crear el evento de cada botn para
posteriormente utilizarlo.
Para finalizar de editar la plantilla seleccionamos Terminar edicin de plantilla.

CREAMOS EL INFORME
A continuacin, vamos a crear el informe de artculos (Botn derecho sobre el proyecto y
Agregar nuevo elemento de tipo informe) y le ponemos como nombre InformeArticulos.
A este elemento le vamos a aadir un nuevo conjunto de datos llamado DataSetArticulos.
Para aadir el nuevo conjunto de datos hay que darle a la opcin aadir de los datos del
informe.

Una vez aadidos 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 artculos.

En el evento Page_Load de este formulario agregamos el siguiente cdigo:


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 cdigo del botn. 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 botn derecho sobre el subinforme y seleccionando Propiedades del


subinforme podremos cambiar sus propiedades.
De momento, lo ms 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 extensin del informe).

Ahora, vamos a crear la pgina 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 cdigo:


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 cdigo del botn:


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 aadrselo 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 cdigo 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 parmetro al componente del informe y al subinforme.
Vamos primero al subinforme. Abrimos InformeArticulos.rdlc y agregamos un nuevo
parmetro de tipo entero llamado pedido.

Ahora falta pasrselo desde el componente Subinforme. Para


InformePedidos.rdlc y abrimos el panel de las propiedades del subinforme.

ello,

abrimos

En su solapa Parmetros aadimos 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 parmetro. As que cambiamos el cdigo 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 PARMETRO


El botn ahora funciona correctamente, pero si nos fijamos, el otro botn no muestra datos ya
que espera un parmetro y no se lo estamos pasando.
Para que funcione, basta con ir a las propiedades del parmetro de InformeArticulos.rdlc y
decirle que el parmetro permita nulos.

También podría gustarte