Jose R. Guay Paz

Most of the time on
ASP.NET, C# & SQL Server

Sponsors

News

INETA Community Speakers Program

My latest tweets

this.blog.owner=

  • CSW Solutions
  • Follow Me
  • Works On My Machine

.NET Communities

  • INETA Latam

Blogs I Read

Websites I like

Construyendo Reportes Para Aplicaciones Web: Parte 2

Esta es la segunda parte de la serie de artículos dedicada a la construcción de reportes para aplicaciones web. En esta parte vamos a examinar dos aspectos muy importantes en la construcción de reportes. El primero es como “hacer” reportes que se parametrizan por código. El segundo es como enviarle parámetros a los reportes para que puedan filtrar información y mostrar solo lo que nos interesa.

En primer lugar debemos ver en detalle el código generado en nuestro ejemplo de órdenes de la base de datos Northwind. Recuerden que no hemos escrito hasta ahora ninguna línea de código, a pesar que la aplicación fue creada en C#, aún no hemos creado nada usando lenguaje.

Lo primero es ver el código fuente de la página:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Report.Part1._Default" %>

 

<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <rsweb:ReportViewer ID="ReportViewer1" runat="server" Font-Names="Verdana" 
                           
Font-Size="8pt" Height="400px" Width="649px">
            <LocalReport ReportPath="Ordenes.rdlc">
                <DataSources>
                    <rsweb:ReportDataSource DataSourceId="ObjectDataSource1" 
                        Name="DataSet1_Orders" />
                </DataSources>
            </LocalReport>
        </rsweb:ReportViewer>
        <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
            SelectMethod="GetData" 
            TypeName="Report.Part1.DataSet1TableAdapters.OrdersTableAdapter">
        </asp:ObjectDataSource>
    </div>
    </form>
</body>

</html>

Vamos a analizarlo línea por línea:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Report.Part1._Default" %>

La primera línea es la directiva que indica a IIS que es una página ASP.NET escrita en lenguaje C# y que su archivo de Code Behind es Default.aspx.cs. Para quienes no estén muy empapados con el tema; el archivo Code Behind es un archivo asociado a la página donde se realiza toda la programación de métodos y eventos que nos servirán para la manipulación de objetos en nuestra página. El archivo, en este caso, tiene la extensión .cs que indica que es en lenguaje C#; y luce algo así:

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace Report.Part1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
    }
}

No se preocupen, lo utilizaremos más adelante para modificar nuestro reporte.

La siguiente línea en nuestra página es muy importante, ya que es en ella donde se define que vamos a utilizar un objeto ReportViewer y donde hacemos referencia al ensamblado (Assembly) que tiene el manejo de dicho objeto:

<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>

Si están usando Visual Studio 2005, seguramente tendrán en la versión del objeto el número 8.0.0.0. No hay ningún problema, estos artículos funcionan perfectamente con esta versión de ReportViewer.

Luego tenemos la definición de una página web normal, pero dentro de su definición existen dos elementos que son los que nos interesan para nuestro análisis. El primer elemento es la definición del ReportViewer:

<rsweb:ReportViewer ID="ReportViewer1" runat="server" Font-Names="Verdana" Font-Size="8pt" Height="400px" Width="649px">
  
<LocalReport ReportPath="Ordenes.rdlc">
      <DataSources>
         <rsweb:ReportDataSource DataSourceId="ObjectDataSource1" Name="DataSet1_Orders" />
      </DataSources>
   </LocalReport>
</rsweb:ReportViewer>

Si se fijan bien, Un ReportViewer se compone para su funcionamiento de un objeto LocalReport y un ReportDataSource (fuente del reporte). El objeto LocalReport es necesario ya que estamos usando un reporte que existe dentro de nuestra aplicación, si estuviéramos usando un reporte que existe en un servidor de reportes con SQL Server Reporting Services, entonces deberíamos usar un objeto ServerReport (pero no se preocupen, ese es otro tema para una serie de artículos diferentes).

Bien, el objeto LocalReport tiene una referencia al archivo que guarda el documento de reporte por medio del parámetro ReportPath. Nuestro documento de reporte se llama Ordenes.rdlc. Por último es necesario indicar de donde vendrán los datos para este reporte, esto lo hacemos con el objeto ReportDataSource. Este necesita dos parámetros; el primero es el objeto que maneja la conexión con la fuente de datos que en este caso es un ObjectDataSource llamado ObjectDataSource1. El segundo parámetro dice quien tiene la definición de la fuente de datos (DataSet1) y dentro de esta fuente, que objeto está referenciando (Tabla Orders del DataSet).

El otro elemento dentro de la página es el ObjectDataSource que se conectará con la fuente de datos para pasarle la información al reporte:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
                      SelectMethod="GetData" 
                      TypeName="Report.Part1.DataSet1TableAdapters.OrdersTableAdapter">

</asp:ObjectDataSource>

En este caso, el ObjectDataSource indica que se debe utilizar un tipo TableAdapter que existe dentro de DatasSet1 y que este adaptador se llama OrdersTableAdapter. Este objeto adaptador es el que conoce todo lo necesario para poder obtener los datos de la base de datos y devolverlos en el formato que se necesita. Por último se utilizará un método llamado GetData que tiene la lógica para hacer las llamadas al adaptador y obtener efectivamente los datos a mostrar.

Bueno, es tiempo de “ensuciarnos” las manos con un poco de programación. Debo decir que en al principio del artículo encerré entre comillas la palabra “hacer” refiriéndome a hacer reportes por código, porque esto en realidad no se puede hacer. Los documentos de reporte son documentos que hay que definirlos de manera gráfica, pero lo que si podemos hacer es manipular todo lo demás por código, y ese es el primer ejemplo que vamos a hacer.

En primer lugar vamos a quitarle a la página el objeto ObjectDataSource y vamos a quitarle al reporte la definición del reporte al objeto ReportViewer. Esto nos dejará la página de la siguiente forma:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Report.Part1._Default" %>

<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <rsweb:ReportViewer ID="ReportViewer1" runat="server" Font-Names="Verdana" 
            Font-Size="8pt" Height="400px" Width="649px">
        </rsweb:ReportViewer>
    </div>
    </form>
</body>
</html>

Ahora vamos a trabajar con el archivo Code Behind (Default.aspx.cs) y vamos a agregar todo lo que teníamos antes pero por medio de código en C#:

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace Report.Part1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            ObjectDataSource ObjectDataSource1 = 
                new ObjectDataSource("Report.Part1.DataSet1TableAdapters.OrdersTableAdapter", "GetData");
            Microsoft.Reporting.WebForms.ReportDataSource rds = 
                new Microsoft.Reporting.WebForms.ReportDataSource("DataSet1_Orders", ObjectDataSource1);
            ReportViewer1.LocalReport.ReportPath = "Ordenes.rdlc";
            ReportViewer1.LocalReport.DataSources.Add(rds);
        }
    }
}

Como pueden apreciar hicimos exactamente lo mismo, creamos un ObjectDataSource con la definición hacia el DataSet que teníamos, luego hicimos referencia al documento reporte Ordenes.rdlc y por último agregamos un ReportDataSource.

Esto produce el mismo resultado de la vez anterior:

WorkingReport

Bien, ahora es tiempo de seguir con otro tema importante. El paso de parámetros. Supongamos que es necesario filtrar por un rango de fechas nuestro reporte, de esta forma se mostrará solamente las órdenes que correspondan a ese rango de fechas. Existen varias formas de hacer este trabajo pero nosotros utilizaremos la forma filtrando directamente en la tabla de la fuente de datos, entonces para ello tenemos que modificar nuestro DataSet de la siguiente forma:

Abrimos el documento DataSet donde tenemos lo siguiente:

DataSet_Original

Hacemos un click derecho sobre Orders y seleccionamos la opción “Configurar” (Configure en inglés). Y esto mostrará una ventana con el Query que se hace a la tabla:

TableAdapter_Original

Ahora modificamos el query agregando al final: WHERE OrderDate BETWEEN @FechaInicial AND @FechaFinal y hacienda click al botón Next llegamos al siguiente paso donde el asistente pregunta si se modifican los métodos para obtener los datos.

TableAdapter_2

Es necesario tener seleccionados todos los checkboxes para que el asistente realice las actualizaciones necesarias y que incluya los nuevos parámetros de fecha que hemos agregado. Luego hacemos click en el botón Next y llegamos al final del asistente donde todo debe haber quedado reconstruido y listo para usarse:

 TableAdapter_Fin

Hacemos click en el botón Finish y luego guardamos el documento que ahora queda modificado en el método GetData como sigue:

 TableAdapter_Modificado

Ahora vamos a modificar nuestra página para agregar dos campos donde se puedan ingresar fechas y poder manipular nuestro reporte:

 parametros

El botón será ahora el encargado de hacer que el reporte se ejecute y obtenga los datos, pasando como parámetros los valores seleccionados de los dos calendarios que indican la fecha inicial y la fecha final. El código del botón queda de la siguiente forma:

 

protected void btnEjecutar_Click(object sender, EventArgs e)
{
    ObjectDataSource ObjectDataSource1 =
        new ObjectDataSource("Report.Part1.DataSet1TableAdapters.OrdersTableAdapter", "GetData");
    ObjectDataSource1.SelectParameters.Add("FechaInicial", calInicio.SelectedDate.ToShortDateString());
    ObjectDataSource1.SelectParameters.Add("FechaFinal", calFinal.SelectedDate.ToShortDateString());

 

    Microsoft.Reporting.WebForms.ReportDataSource rds =
        new Microsoft.Reporting.WebForms.ReportDataSource("DataSet1_Orders", ObjectDataSource1);

 

    ReportViewer1.LocalReport.DataSources.Clear();
    ReportViewer1.LocalReport.DataSources.Add(rds);
    ReportViewer1.LocalReport.ReportPath = "Ordenes.rdlc";
    ReportViewer1.LocalReport.Refresh();
}

Entonces, haciendo click sobre el botón obtenemos el siguiente resultado:

Reporte_Con_Parametros

Podemos estar seguros que el reporte si filtró los datos tan solo viendo que el conteo de hojas dice que el reporte tiene solamente 3 hojas y no 76 como originalmente tenía.

Bueno, espero que esta segunda entrega haya sido de su agrado y les ayude a complementar lo que ya habíamos visto. Por favor, esperen el siguiente artículo que tratará sobre subreportes y como manejarlos.

Hasta la próxima.

Comments

Raul Guzmán said:

Esta excelente el artículo pero quiero pedirte el favor de que me envíes la parte 1

Muchas Gracias

# July 23, 2008 10:14 AM

Jose Rolando Guay Paz said:

Hola Raul.

Si te refieres a la parte 1 del artículo, lo puedes encontrar en weblogs.asp.net/.../construyendo-reportes-para-aplicaciones-web-parte-1.aspx

Ahora, para el codigo, necesito enviartelo por email, por favor incluye tu email en un comentario para poder enviartelo.

Saludos.

Jose Rolando guay Paz

# July 23, 2008 10:37 AM

Jose said:

hola se ve muy bueno el articulo, pero tengo una pregunta: queria saber si para filtrar las fechas en reportes para aplicaciones de windows tambien es el mismo codigo o cambia? veo que esta esta para aplicaciones web y yo necesito lo mismo pero para windows form (formularios). gracias

# July 28, 2008 1:25 PM

Jose Rolando Guay Paz said:

Hola Jose.

Si, debe funcionar igual para Winforms.

Saludos.

Jose Rolando Guay Paz

# July 28, 2008 4:16 PM

Luis Angel said:

Muy, Buen material, Es lo que necesitaba para terminar una cosas de mi proyecto.

# August 1, 2008 8:57 PM

Herman said:

Disculpa como puedo pasar parametros si no tengo el dataset

# September 15, 2008 12:04 PM

Jose Rolando Guay Paz said:

Los parametros los puedes pasar configurandolos desde la opcion de parametros en la definicion del reporte.

Saludos.

# September 15, 2008 12:11 PM

Otoniel said:

Muy buen articulo, me ha servido mucho.He tratado de recrear el ejemplo pero al ejecutarlo tengo el siguiente erro An error has occurred during report processing.

"El valor del parámetro 'FechaInicial' no se puede convertir de 'System.String' a 'System.DateTime' " ¿Como puedo solucionar esto?

Gracias por la ayuda.

# September 15, 2008 9:36 PM

Jose Rolando Guay Paz said:

Hola Otoniel.

Para corregir ese error debes tener en cuenta el formato de la fecha, por ejemplo, si la base de datos esta configurada para usar mm/dd/yyyy y tu le mandas dd/mm/yyyy, entonces seguro tendras ese error.

Saludos.

# September 16, 2008 10:06 AM

carla said:

hola Jose.

soy nueva en esto de .net, quisiera si fura posible me copies tu BD o si conoces algun link que me enseñe paso a paso a crearlas, gracias

carlita_196@hotmail.com

# October 15, 2008 2:09 PM

asthon said:

hola oie disculap uan pregunta

sabes si hay alguna herramienta para crear los reportes de manera grafica sin tener que meterse con codigo

# October 29, 2008 1:59 PM

Jose Rolando Guay Paz said:

@Carla

Si lo que deseas es conocer sobre SQL Server, te recomiendo este link para empezar www.microsoft.com/.../learning.aspx pero para empezar en general con bases de datos te recomiendo que tomes algun curso sobre el tema antes de empezar con cualquier base de datos.

@ashton

Los reportes que hemos hecho aca han sido creados totalmente con herramientas graficas. Lo que sucede es que tambien he incluido unas modificaciones que se pueden hacer por medio de codigo. Ahora si necesitas una herramienta mas completa de de reportes te recomiendo Telerik Reporting (www.telerik.com/.../overview.aspx) o Developer Express XtraReports (www.devexpress.com/.../Reporting).

Saludos.

Jose R. Guay

# November 3, 2008 9:30 AM

RAM said:

Amigo fijate que tengo este codigo

DateTime FechaDe = Convert.ToDateTime(txtFechaDe.Text);

       DateTime FechaA = Convert.ToDateTime(txtFechaA.Text);

       String F1 = FechaDe.Year.ToString() + FechaDe.Month.ToString().PadLeft(2,'0') + FechaDe.Day.ToString().PadLeft(2,'0');

       String F2 = FechaA.Year.ToString() + FechaA.Month.ToString().PadLeft(2,'0') + FechaA.Day.ToString().PadLeft(2,'0');

       Users X = new Users();

       X.ObtenDatosUsuario(User.Identity.Name.ToString());

       ObjectDataSource ObjectDataSource1 = new ObjectDataSource("DSDepositosTableAdapters.ListaDepositosTableAdapter", "GetData");

       ObjectDataSource1.SelectParameters.Add("IdPV", X.getPV.ToString());

       ObjectDataSource1.SelectParameters.Add("FechaDe", F1);

       ObjectDataSource1.SelectParameters.Add("FechaA", F2);

       Microsoft.Reporting.WebForms.ReportDataSource rds = new Microsoft.Reporting.WebForms.ReportDataSource("DSDepositos_ListaDepositos", ObjectDataSource1);

       rptView.LocalReport.DataSources.Clear();

       rptView.LocalReport.DataSources.Add(rds);

       rptView.LocalReport.ReportPath = "Reportes/rptListaDepositos.rdlc";

       rptView.LocalReport.Refresh();

no me da ningun error,, simplemente no muestra el reporte... muestra los botones del control reportviewer pero aparece en blanco. donde crees que pueda esta el error?

# November 10, 2008 2:26 PM

Jose Rolando Guay Paz said:

@RAM

Mira, el codigo se ve bien, pero posiblemente tienes algun problema con los parametros ya que no estas haciendo ninguna diferenciacion de los campos de cada fecha, es decir, no le has puesto ni guiones ni diagonales para separar el anio del mes del dia. Algo asi:

String F2 = FechaA.Year.ToString() + "/" + FechaA.Month.ToString().PadLeft(2,'0') + "/" + FechaA.Day.ToString().PadLeft(2,'0');

Saludos.

Jose Guay

# November 11, 2008 9:14 AM

RAM said:

Sabes.... paso las fechas asi porque uso el formato ANSI para comparación de fechas en SQL,,, de hecho siempre me ha funcionado.... incluso si los valores los dejo fijos en el reporte con ese formato trabaja muy bien... el problema es cuando lo mando a llamar con parametros..... de hecho cuando la consulta no trae valores almenos me aparecen los encabezados del reporte....

Cuando genero el reporte con paso de parametros me aparece completamente en blanco....

Gracias por tu apoyo; por cierto es un excelente articulo el que publicas... seguro que nos sacaste a varios del problema....

# November 11, 2008 6:24 PM

JoseAmbrocio said:

Hola, me gustaria, y si es posible me enviaras el codigo para VB, estoy empezando un algo en Visual studio, quiero hacer reportes como los que explicar aqui, pero utilizando visual Basic.

Mi correo es Ambrocio.Ruiz@trw.com

Saludos desde Reynosa Mex.

# November 26, 2008 5:32 PM

StreamWriter said:

Hola jose, tengo un problema con el ejemplo de filtrar el report, en todo caso si funciona impekable se paso, pero por ejemplo: de 7 registros me reporta 4 perfectamente pero los otro 3 me muestra los reportes en blanco, porque es esto?, te envio el codigo por mail (enviame un mail de respuesta para enviartelo por favor)

red_s_kull@hotmail.com.

# December 30, 2008 10:37 AM

StreamWriter said:

hola impekable la entrada del report, funciona muy bien pero tengo un problema con el filtrado de 7 me filtra y reporta 4 pero los otros 3 aparece en blanco el reporte, por que es esto? te envio mi mail para que me contestes y asi enviarte mi codigo porfavor y ver que pasa red_s_kull@hotmail.com.

# December 30, 2008 10:42 AM

Fabio matheus said:

Excelente material, hay que tener en cuenta en el tipo de datos que se envia al reporte,batalle un poco en ese aspecto,pero definiendo bien los parametros que concuerden con el tipo de datos, funciona correctamente.

# January 19, 2009 5:22 PM

gabriela said:

Gracias por la info! Ahora, como hago para utilizar en el diseño las fechas que paso por código? Yo quiero agregar un textbox con el rango de fechas que ingreso el usuario en tiempo de ejecucion.

# January 29, 2009 7:55 AM

Jose Rolando Guay Paz said:

Hola Gabriela.

Puedes utilizar como valor del textbox lo siguiente:

=Parameters!FechaInicio & " " & Parameters!FechaFinal

Saludos.

Jose

# January 29, 2009 8:32 AM

Deivis said:

Disculpa, una pregunta me pierdo cuando hay que agregar los campos de FechaInicio y Fecha Final, que tipo de objeto debo utilizar. Gracias

# February 16, 2009 5:09 PM

César Vallejo said:

Hola José, excelente artículo, si me harías este favor, enviame el ejempli 1 y 2 con código a mi correo por favor, cesar_vallejo09@hotmail.com, gracias, saludos, (y)

# March 4, 2009 12:21 AM

Jose Espindola said:

Hola José ya tengo configurados mis reportes pero cuando subi la aplicacion al sitio web, me manda el siguiente error al ejecutar un reporte:

Parser Error Message: Could not load file or assembly 'Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

Creo que es una dll que debo incluir en la carpeta bin , es asi? cual es esta dll

Gracias

Saludos!!

# March 10, 2009 2:37 PM

Jose Rolando Guay Paz said:

@Cesar Vallejo: El codigo completo esta para que lo descarguen en el post de la parte 3 de esta serie.

@Jose Espindola: Necesitas instalar el componente de report viewer. Si es un hosting debes preguntar a la empresa proveedora si ellos soportan ese componente, si es un server propio, puedes descargar el programa de instalacion del componente aca:

Version 2005

www.microsoft.com/.../details.aspx

Version 2008

www.microsoft.com/.../details.aspx

Saludos.

# March 11, 2009 11:25 AM

Ferzamher said:

Buenos dias Jose rolando

el tema es muy bueno e ilustrativo, usted podria ayudarme a realizar un filtro pero con un textbox, le agradeceria mucho

feliz dia

# April 29, 2009 10:21 AM

Jose Rolando Guay Paz said:

@Ferzamher: Gracias. realmente el uso de componentes para el filtrado utiliza el mismo patron. Por ejemplo, digamos que quiere escojer una orden en particular y para ello provee un textbox donde el usuario ingresa el numero de orden.

<asp:TextBox ID="txtNoOrden" runat="server"></asp:TextBox>

Luego en el codigo del boton ejecutar (btnEjecutar_Click) agregamos lo siguiente:

ObjectDataSource1.SelectParameters.Add("NumeroDeOrden", txtNoOrden.Text);

Espero le sirva.

Saludos.

# April 29, 2009 10:48 AM

Alejandra Anzueto said:

Jose que tal estas, he estado buscando un ejemplo de como pasar parametros desde una pagina a un report viewer, y esta interensate el ejemplo que pusiste en tu blog, yo estoy trabajando una aplicacion en VISUAL BASIC 2005 me estuve guiando por tu ejemplo, en el OBJECTDATASOURCE tengo un query que hace referencia a 3 tablas (uso de base de datos oracle 10g), este es el codigo que tengo:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Dim v_ejer, v_ped, CodUsuario As String

Dim objectDS1 As New ObjectDataSource(”DataSet4TableAdapters.DataTable1TableAdapter”, “GetData”)

v_ejer = Request.QueryString(”ejercicio”).ToString

v_ped = Request.QueryString(”pedido”).ToString

CodUsuario = Session(”CodUser”).ToString

objectDS1.SelectParameters.Add(”ejercicio”, v_ejer)

objectDS1.SelectParameters.Add(”pedido”, v_ped)

objectDS1.SelectParameters.Add(”usuario”, CodUsuario)

Dim rds = New ReportDataSource(”DataSet4_DataTable1″, objectDS1)

RVOP.LocalReport.DataSources.Clear()

RVOP.LocalReport.DataSources.Add(rds)

RVOP.LocalReport.ReportPath = “REPORTE/RLOP.rdlc”

RVOP.LocalReport.Refresh()

End Sub

y siempre me da este error:

An error has occurred during report processing.

Se produjo una excepción en el destino de la invocación.

No se pudieron habilitar las restricciones. Una o varias filas contienen valores que infringen las restricciones NON-NULL, UNIQUE o FOREIGN-KEY.

No se que puede ser, hasta hice otra pagina de prueba en c# 2005 y copie tu codigo como esta (solo segui usando mi query que hace referencia a 3 tablas) y me da el mismo error, tu sabes si es necesario cambiar alguna propiedad del reportviewer o del objectdatasource o que puede estar mal para que me este dando este error.

Gracias

# May 15, 2009 1:45 PM

ferzamher said:

Muchisimas gracias entonces emprezare a trabjar esta parte. Le agradezco muchisimo (nuevamente) su colaboracion

# May 27, 2009 5:53 PM

Rodrigo said:

Hola mira te quiero hacer una consulta: Tengo un servidor windows 2008 server corriendo con sql server 2005, tengo una aplicacion corriendo en el ISS 7 en perfecto estado , salvo por el tema de los reportes, ya que no me deja imprimr nada de hecho ni se molesta en mostrarme los reportes ,  me dice que no se encuentra la pagina. eso me sucede al momento de acceder desde internet y en forma local a mi aplicacion , los reportes son de tipo LocalReport. ¿sabes como puedo hacer para que se vean mis reportes en una red local o en internet? que tipo de reporte tengo que crear?  desde ya muchas gracias.

# June 15, 2009 7:49 PM

Orlando Lopez said:

Hola Jose, excelente articulo el tuyo, pero crees que lo podrias hacer con codigo VB? o si no crees que me lo puedes enviar a mi correo?

orlando_b6a@hotmail.com

Yo estoy desarrollando una aplicacion en asp con codigo VB y cuando trato de hacer lo que haces tu me da problemas y lo mas seguro es que por que no he escrito algun codigo correctamente, me aparece el siguiente error

An error has occurred during report processing.

ObjectDataSource 'ObjectDataSource1' could not find a non-generic method 'GetData' that has no parameters.

Te agradeceria si me pudieras enviar el codigo a mi correo lo antes posible, gracias Jose y adelante con mas blog como estos

# June 24, 2009 11:21 PM

Diego said:

Excelente articulo!!! Hacia 2 días que no podía incluir parámetros en mi reporte, y con este tutorial paso a paso pude hacerlo a la perfección!!!

Te agradezco por todas las explicaciones!!!

PD: Lo hice en VB.NET sin problemas, el código es casi igual.

# July 19, 2009 11:14 AM

MijailStell said:

Bueno en la parte de las fechas, si te sale errores, talvés podemos corregirlo asi.

ObjectDataSource1.SelectParameters.Add("FechaInicial", System .TypeCode .DateTime,calInicio.SelectedDate.ToShortDateString());

Igual para el otro parametro!!!.

Pues de esa manera utilizamos la otra sobrecarga del metodo Add().

Saludos

# September 8, 2009 6:30 PM

Agustin said:

Hola, una pregunta, el control reportviewer no trae la opcion de usar el calendario propio como si fuese el de reportingservices? lo mimo para el boton ejecutar reporte, en reportingservices el boton es parte del toolbox.

# October 22, 2009 11:36 AM

Jose Rolando Guay Paz said:

@Agustin: No, recuerda que estos reportes son muy basicos y aunque te permiten crear muchas cosas para este tipo de funcionalidad necesitas algo mas poderoso como Reporting Services.

# October 22, 2009 6:19 PM

Miguel said:

Ola q tal, interesante tu aporte, sin embargo io lo estoy intentando acer en windows form, pero no me sale mira, tengo una base de datos en SQLSERVER llamada DATA y una tabla llamada PERSONAS con campos idPersona, Nombres, Apellidos; Ahora quiero dar un reporte de las personas registradas, creo un DATASET1 al cual arrastro la tabla PERSONAS, luego creo un CrystalReport1 que lo conecto con DataSet1 con ADO.NET; luego en mi formulario uso el siguiente code:

DataSet ds = new DataSet();            ds.ReadXmlSchema(@"C:\Proyecto\DataSet1.xsd");

CrystalReport1 reporte = new CrystalReport1();

reporte.Database.Tables[0].SetDataSource(ds);

this.crystalReportViewer1.ReportSource = reporte;                      

bueno el problema es q no me sale nada ni una sola fila, solo los encabezados..

a si uso .net 2008 y mi S.O. 64x(no se si esto sera relevante)

porfavor espero una respuesta, gracias            

       }

# February 19, 2010 11:48 AM

ahernandez said:

Excelente explicación.

podrás publicar los mismo pero en codigo para VB,

Mi correo es ahernandez@litorallaboratorios.com

Saludos desde Cd. del Carmen Campeche, Mex.

# February 27, 2010 11:21 AM

Hans said:

Una consulta.

Al publicar un reporte en un servidor de explotacion, este me arroja el siguiente error.

An error occurred during local report processing.

The definition of the report 'Main Report' is invalid.

An unexpected error occurred in Report Processing.

No se puede cargar el archivo o ensamblado 'Microsoft.ReportViewer.ProcessingObjectModel, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' ni una de sus dependencias. El sistema no puede hallar el archivo especificado.

Estoy haciendo una publicacion en vs.net 2005 y al parecer me hace falta incorporar otra dll.

Las dll de MS de mi royecto son:

Microsoft.ReportViewer.Common.dll

Microsoft.ReportViewer.WebForms.dll

Microsoft.ReportViewer.WinForms.dll

AjaxControlToolkit.dll

Ajax.dll

Alguna idea?

# April 9, 2010 2:29 PM

Jose Rolando Guay Paz said:

@Hans, necesitas instalar en el servidor el Microsoft Report Viewer. Para la version que estas usando el link para descargarlo es el siguiente:

www.microsoft.com/.../details.aspx

Luego hay que reiniciar el servidor.

Saludos.

Jose

# April 9, 2010 2:47 PM

Roberto said:

Muy buena tu explicacion sobre el tema, necesito me ayudes, necesito realizar una consulta desde un webform c# en el cual tengo una lista, al escoger un item de dicha lista filtrará el reporte realizado en crystal report, todo esto desde codigo, al publicarlo necesito instalar un sw en el server??? espero tus comentarios

# April 20, 2010 5:32 PM

Jose Rolando Guay Paz said:

@Roberto. Bueno, segun se para usar reportes de Crystal Reports necesitas instalar Crystal Reports en el servidor pero si es un shared hosting no podras hacerlo.

No domino el tema de Crystal Reports asi que lamento no poder ayudarte mas.

Saludos.

Jose

# April 20, 2010 10:18 PM

JANET GONZALEZ BERNAL said:

QUE TAL JOSE ROLANDO, EXCELENTE ARTICULO.

ME PODRIAS MANDAR EL CODIGO DEL TEMA Construyendo Reportes Para Aplicaciones Web: Parte 1

POR FAVOR!!!

Mi correo es: jegb02@gmail.com

SALUDOS DESDE NAYARIT

# May 7, 2010 7:31 PM

Jose Rolando Guay Paz said:

@JANET: El codigo esta en el articulo 1 de esta serie. weblogs.asp.net/.../construyendo-reportes-para-aplicaciones-web-parte-1.aspx

# May 7, 2010 9:20 PM

Daniel Almaguer said:

Que tal Jose Rolando, mira tengo el siguiente detalle, he creado un Xtra Report's y en el ReportViewer me muestra todo de lo mejor, puedo ver la información que estoy consultando, todo esto en el web form, pero al momento de imprimirlo con el ToolBar de DevExpress, la vista previa de este reporte me aparece sin la información consultada  y por ende lo imprimo y aparece sin información.................:S

Como vez ?? que me esta faltando agregar ??

Gracias de antemano....

# May 8, 2010 12:25 PM

Eduardo Texier said:

Hola Jose.

A ver si me puedes ayudar con esto: tal como pones en el ejemplo arriba, para agragar parámetros hay que incluir la cláusula WHERE: "WHERE OrderDate BETWEEN @FechaInicial AND @FechaFinal", y más adelante los usamos como "FechaInicial" y "FechaFinal". En mi caso yo quiero colocar la siguiente condición: "WHERE pais in (@ListadePaises)", es decir, quiero que el query me devuelva todos los registros de los paises que se seleccionen.

Cómo puedo hacer esto?, es posible?

De antemano gracias por tu ayuda.

# May 11, 2010 6:51 PM

Ignacio said:

Hola Jose!

Excelente el articulo!

Ahora te hago una consulta, resulta que implemente lo de las fechas por parametro y anda muy bien, pero lo que quiero es que una vez mostrado el reporte, poder cambiar las fechas y que me muestre los datos nuevos segun las nuevas fechas elegidas, pero hasta el momento no me ha funcionado dado que me muestra los datos de la primer consulta, o sea las mostradas por 1ra vez.

Es como que no se actuliza el DataSet o algo...

Desde ya te agradezco en lo que me puedas ayudar.

Saludos!

# May 14, 2010 10:49 AM

Tedder Niño Drago said:

Muy buenas a todos. Muchas gracias por todos los aportes. Excelente material. Me ha sido muy útil para obtener reportes de buena calidad dentro de un proyecto que estoy desarrollando. No obstante no he conseguido que aparezca el icono de imprimir directamente sin necesidad de exportar el reporte. Conmigo son cuatro las personas que han expuesto el mismo caso, pero aun no hay claridad al respecto. Estoy usando el IEXPLORE 8.0, pero aun así, nada.

:-S

# May 18, 2010 11:59 AM

Silvi said:

hola a todos por favor necesito urgente hacer subreportes, estoy utilizando xtrareport con punto net.

mil gracias.

# May 18, 2010 3:40 PM

daro said:

Hola a todos si alguien sabe de un manual de cristal report por favor publicarlo gracias..

# May 19, 2010 10:30 AM

Ignacio said:

Hola Jose!

Mas arriba te consulte sobre las fechas, eso ya lo corregi... Ahora me surgio un nuevo problemilla, el reporte en mi maquina local anda de maravillas, pero cuando lo subo al servicio de host que contrate para publicar mi sitio no funcionan :( Sale el sgte error:  

Security Exception

Description: The application attempted to perform an operation not allowed by the security policy.  To grant this application the required permission please contact your system administrator or change the application's trust level in the configuration file.

Exception Details: System.Security.SecurityException: That assembly does not allow partially trusted callers.

Sabras a que se debe y como solucionarlo??

Desde ya gracias!!

Ignacio.

# May 19, 2010 3:59 PM

Cristina B said:

Hola, tengo un reporte que esta combinando información de dos servidores, si corro este reporte desde el servidor donde tengo el "stored procedure" funciona bien, el problema es cuando quiero hacerlo desde mi computadora en Visual Studio. (ambos servidore tienen SQL 2005 y tengo VS2008) el error que envia es el siguiente:

An error has occurred during report processing. Exception has been thrown by the target of an invocation.

Named Pipes Provider: Could not open a connection to SQL Server [5].

Espero puedan ayudarme, gracias!!

# May 31, 2010 6:27 PM

Silvi said:

Saludos,

Tengo el siguiente problema si alguien puede ayudarme se lo agradecere mucho.

tengo una imagen en el reporte y al momento que le paso a un aspx no se muestra.

estoy trabajando con xtrareport y punto net.

mil gracias

# June 4, 2010 12:30 PM

Ivonne said:

Buenas tardes, si alguien me puede asesorar en como publicar mi reporte, en mi PC si corre, esta hecho en asp.net lenguaje c# y  reporting services 2005.

De antemano agradezco la ayuda.

# July 7, 2010 4:47 PM

elias said:

Hola rolando buen dia fijate que segui los procedimientos para generar reporte y me ayudo muchisimo, que agradesco por este articulo muy excelente, ahora mi problemita es que en el reporte te genera la fecha pero te muestra las horas yo quisiera saber como hacerle para que solo me muestre dd/mm/yyyy.

de ante mano espero tu ayuda y agradecertelo, cuidate y muchas felicidades

# July 8, 2010 12:25 PM

PETER said:

Como envío como parámetro un "enter" para que cada vez que lo encuentre haga un salto d elínea

alguien que me pueda ayudar con eso

# July 9, 2010 10:37 AM

10GO! said:

pero como haces un reporte con tablas relacionadas? todos muestran ejemplos de reportes de la misma tabla acaso la tabla no tiene FKs?

# October 14, 2010 12:14 PM

Yesid Campos said:

Saludos.

Excelente artículo en sus tres partes.

Te cuento que genero todos los reportes que necesito sin ningún problema pero al momento de exportar a PDF me esta generando una hoja adicional en blanco. La pregunta es como puedo controlar esto o si puedo en algún lugar por la parte gráfica o por código la cantidad de hojas a imprimir.

Muchas gracias por tu colaboración

jesidcampos@hotmail.com

jesidcampos@gmail.com

# October 25, 2010 9:24 AM

Edwin Cieza said:

amigo, excelente articulo. La pregunta que te tengo es para lo siguiente, tengo un metodo que lista todas las ventas del dia de una persona. ahora este metodo solo necesita el idpersona para poder mostrar la data en el reportviewer, pero hay un tema yo e definido un parametro de tipo String llamado "vendedor", que muestra el nombre de la persona que sale en el reporte.

La pregunt es como configuro el reportViewer para decirle que ese parametro "Vendedor", sale de la seleccion de un drowdownlist, Pero ojo que estoy utilizando el Objectdatasource como origen de datos.

Gracias de antemano por la respuesta.

mi correo es ecieza.18@hotmail.com

# November 28, 2010 2:55 PM

Guillermo said:

Hola que tal esta muy bueno el articulo y estaba tratando de cambiar los calendario por un dropdwonlist o con tu textbox y me sale este error!!queria saber si me podes ayudar gracias

No se ha proporcionado ninguna instancia de origen de datos para el origen de datos 'DataSet1'.

# December 9, 2010 7:31 AM

Carlos Romero said:

Amigo he hecho todo lo detallado y solo tengo una pregunta por que se me ejecuta n veces el reporte que mas hay que configurar.

# February 21, 2011 4:35 PM

Marta said:

Buenos días, me podríais orientar, al exportar de reporting services a Pdf e intentar abrir el .pdf me dice "Error al abrir el documento.El archivo está dañado y no puede repararse", tengo Sql Server 2005 , en un windows server 2003 y estoy atacando al reporting desde visual studio 2005.

Muchas gracias,

# March 9, 2011 4:45 AM

Mario Portilla said:

error:"Caracteres no válidos en la ruta de acceso."

Resulta que tenia mis reportes no en la raiz como este ejemplo si no en una carpeta llamada reportes,  documentandome encontre este articulo

msdn.microsoft.com/.../system.io.path.aspx

las rutas se colocan dependiendo del lenguaje asi

"MiDir\\MiSubdir" en C# o "MiDir\MiSubDir" en Visual Basic.

osea : mi report path quedo

ReportPath = "reports\\repInfProg.rdlc";

y ya solucionado el problema

# March 15, 2011 10:46 AM
Leave a Comment

(required) 

(required) 

(optional)

(required)