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.

55 Comments

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



    Muchas Gracias

  • Hola Raul.

    Si te refieres a la parte 1 del artículo, lo puedes encontrar en http://weblogs.asp.net/joseguay/archive/2008/06/26/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

  • Hola Jose.

    Si, debe funcionar igual para Winforms.

    Saludos.
    Jose Rolando Guay Paz

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

  • Disculpa como puedo pasar parametros si no tengo el dataset

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

    Saludos.

  • 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.

  • 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.

  • 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

  • hola oie disculap uan pregunta
    sabes si hay alguna herramienta para crear los reportes de manera grafica sin tener que meterse con codigo

  • 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?

  • @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

  • 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....

  • 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.

  • 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.

  • 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.

  • 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.

  • 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.

  • Hola Gabriela.

    Puedes utilizar como valor del textbox lo siguiente:

    =Parameters!FechaInicio & " " & Parameters!FechaFinal

    Saludos.
    Jose

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

  • 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)

  • 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!!

  • 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

  • @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.



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

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

    Espero le sirva.
    Saludos.

  • 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

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

  • 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.

  • 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

  • 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.

  • 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

  • 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.

  • @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.

  • 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
    }

  • 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.

  • 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?

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

    http://www.microsoft.com/downloads/details.aspx?familyid=8A166CAC-758D-45C8-B637-DD7726E61367&displaylang=en

    Luego hay que reiniciar el servidor.

    Saludos.
    Jose

  • 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

  • @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

  • @JANET: El codigo esta en el articulo 1 de esta serie. http://weblogs.asp.net/joseguay/archive/2008/06/26/construyendo-reportes-para-aplicaciones-web-parte-1.aspx

  • 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....

  • 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.

  • 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!

  • 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

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

  • 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.

  • 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!!

  • 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

  • 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.

  • 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

  • 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

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

  • 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


  • 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'.

  • 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.

  • 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,

Comments have been disabled for this content.