Hace pocos hemos visto como crear reportes con Reporting Services y como hacerlo con Crystal Reports en WinForms, pero hoy veremos como crear un simple reporte con Crystal Reports y mostrarlo con ASP.Net escribiendo un par de líneas de código.
El artículo lo iré dividiendo, ésta vez será un reporte plano, en las siguientes entregas cómo pasarle parámetros dinámicamente, exportar directamente a .PDF y otros subtemas que podrían resultar de interes.
Para seguir con éste tutorial necesitaremos de la BD Adventure Works, en este enlace pueden ver como conseguirlo e instalarlo para los que no conocen.
El primer paso será crear un nuevo proyecto llamado Crystalito (que ingenioso estoy a veces xD)
Ahora creamos una nueva carpeta dentro del proyecto, llamada Reportes. Dentro de ella agregaremos un nuevo elemento, un reporte para listar los proveedores de nuestra base de datos.
Si es la primera vez que usamos la herramienta, deberemos aceptar la licencia de uso. Sino nos aparecerá la pantalla de galerías del reporteador y crearemos unos basado en el asistente. Luego veremos reportes más complejos para diseñarlos manualmente.
Nos aparecerá una pantalla de donde podremos elegir la fuente de datos que alimentará a nuestro reporte. Nosotros vamos a crear uno nuevo de ADO.Net, pero ello no quiere decir que tienen que ser el mismo servidor que el de producción, puede ser uno de desarrollo o nuestra propia maquina nada más. Es suficiente que las estructuras de las BD’s sean iguales a las que usaremos en Producción con tal la conexión y credenciales de login las cargaremos por código, siendo en la mayoría de los casos el mismo que la credencial que nos autenticó a la BD para trabajar con los WebForms (recalco, no estrictamente necesario esto último). De hecho para diseñar nuestro reporte vamos a utilizar OLE DB de ADO pero no quiere decir tampoco que en producción se conectará por OLE DB, es para simple y mero diseño.
Elegimos el proveedor de datos para la conexión, en este caso el Native Client
Seteamos los parametros de la credencial
Y si deseamos personalizar más la conexión nos queda una última pantalla para hacerlo
Ya nos aparecerá el servidor, con todas sus tablas, vistas y procedimientos almacenados que podemos usar, dentro del Schema Purchasing veremos la tabla Vendor, seleccionamos la tabla así
Seleccionamos las columnas a mostrar
En las siguientes pantallas podrán agrupar y filtrar los datos, de momento los dejaremos pasar a éstas opciones para el tutorial.
Ahora elegimos el estilo que nos gusta para el reporte, por cierto son muy simples y algo feos. Sientanse libres de retocar la apariencia de sus reportes como gusten.
Dejando el diseño algo asi
El código ASP lo haremos sencillo y limpio para que no se preste a confusiones, quedando asi:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Assembly="CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"
Namespace="CrystalDecisions.Web" TagPrefix="CR" %>
<!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>Página sin título</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblMensaje" runat="server" Text=""></asp:Label>
<CR:CrystalReportViewer ID="VisorCR" runat="server" AutoDataBind="true" />
</div>
</form>
</body>
</html>
Y finalmente el código que irá dentro del Load de nuestra pagina será como sigue
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 40 | using System; using System.Data; using System.Data.SqlClient; using CrystalDecisions.CrystalReports.Engine; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { var conn = new SqlConnection("Data Source=NABUCODONOSOR;Initial Catalog=AdventureWorks;User Id=usuario;Password=********"); try { using (var comando = new SqlCommand("SELECT * FROM Purchasing.Vendor", conn)) { using (var adaptador = new SqlDataAdapter(comando)) { var ds = new DataSet(); adaptador.Fill(ds); var reporte = new ReportDocument(); reporte.Load(Server.MapPath("Reportes/Proveedores.rpt")); reporte.SetDataSource(ds.Tables[0]); reporte.DataSourceConnections[0].SetConnection("NABUCODONOSOR", "AdventureWorks", "usuario", "********"); VisorCR.ReportSource = reporte; } // end using adaptador } // end using comando } // end try catch (Exception ex) { lblMensaje.Text = ex.Message; } finally { if (conn.State != ConnectionState.Closed) conn.Close(); conn.Dispose(); } } } |
El usuario verá un reporte como este




















en
en
en
en
Yo que tu cambiaba la version del crystal report. Cual estas ocupando? tenias anteriormente otras versiones de crystal report en tu visual studio? si es asi solo deja una, la mas reciente y luego en tu formulario o web.config indica esa version.
Una ayuda urgente ustedes que todo lo saben, tengo mi codigo:
ReportDocument rpt = new ReportDocument();
DataSet ds = new DataSet();
Gestion_Reportes gr = new Gestion_Reportes();
ds = gr.Select_listadiaria(TextBox1.Text);
rpt.Load(Server.MapPath(“~\Reportes\ReportDiario.rpt”));
rpt.SetDataSource(ds.Tables[0]);
rpt.DataSourceConnections[0].SetConnection(Datos.server, Datos.bd, Datos.user1, Datos.pass);
this.CrystalReportViewer1.ReportSource = rpt;
Select_listadiaria me envia un dataset, y normal lo muestra pero mi barra de herramientas del visor del crystal report no funciona y tampoco exporta … dice origen de datos no valido… ayudenme
Cambia las barras invertidas por barras normales
Ron gracias por responder pero es la barra que por defecto sale en el crystal report viewer no sabia q se puede cambiar, pero si se puede sabes cual es la propiedad en viewer
Excelente post. Le agregué al reporte un parámetro:
Dim V_INFORME As New CrystalDecisions.CrystalReports.Engine.ReportDocument()
Dim V_PARAMETRO1 As CrystalDecisions.Shared.ParameterField
V_PARAMETRO1 = V_INFORME.ParameterFields(0)
V_PARAMETRO1.CurrentValues.Clear()
V_PARAMETRO1.CurrentValues.AddValue(“etc.”)
Anda fenómeno, pero cuando aprieto el botón de imprimir o el de exportar el informe a otro formato me vuelve a pedir el parámetro y los datos de la conexión (en la conexión me pide la contraseña, los otros campos aparecen escritos, servidor, nombre usuario y base). Porqué ocurre esto? Alguien me puede decir como solucionarlo? Desde ya, muchas gracias.
Muchas gracias voy a probarlo. Me espera una larga noche jeje
Saludos!
xD ya lo solucione, era la version que se utilizaba de crystal report
en el config.web tengo una version distinta:
Asi que solo hice el cambio de version que tengo en el web.config a la pagina que contiene el reporte. es decir de la 10.x.x.x a la 13.x.x.x.x
Yo tengo un problemita, me dice cada vez que deseo cargar el reporte lo siguiente:
Invalid Report Source.
el codigo que tengo es un poco distinto pero es la misma idea, regresar un dataadapter desde mi funcion y luego rellenar el dataset
Basicamente es esto:
dsKardex ds = new dsKardex();
DataTable dt = new DataTable();
ReportDocument cReport = new ReportDocument();
SqlDataAdapter adaptador = objSQL.getDataAdapterReporte(“0007″, “1010″, “2011-01-11″, “2011-30-12″, “Entrada”);
adaptador.Fill(ds);
try
{
cReport.Load(Server.MapPath(“Reportes/CrystalReportKardex.rpt”));
cReport.SetDataSource(ds.Tables[0]);
//cReport.DataSourceConnections[0].SetConnection(“192.168.0.103″, “KARDEX”, “sa”, “Pmnica2011″);
CrystalReportViewer1.ReportSource = cReport;
}
catch (Exception exc)
{
Ext.Net.X.Msg.Show(new Ext.Net.MessageBoxConfig
{
Title = “Error”,
Message = exc.Message,
Buttons = Ext.Net.MessageBox.Button.OK,
Icon = Ext.Net.MessageBox.Icon.INFO
});
}
Si me pudieran ayudar
Gracias GeekZero Ya le agregue el conotrol del CristalViewer, pero me sale el error que mencioné u_u…
No se puede obtener acceso a un miembro no estático de tipo externo ‘_Default’ mediante el tipo anidado ‘ASP.default_aspx._Default’
lo mas probable que tocaste la clase partial de tu webform, si estas probando solo este ejemplo prueba eliminado la pagina y creala de nueva, será mas rapido, que intentar buscar una solucion a eso sin ver tu trabajo..
Mmmmm… yo de nuevo, la regué en el ID del CrystalViewer, total se lo cambie, diculpen tantas molestias, ahora el error que me sale es el siguiente :s…
CS0038: No se puede obtener acceso a un miembro no estático de tipo externo ‘_Default’ mediante el tipo anidado ‘ASP.default_aspx._Default’
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var conn = new SqlConnection(“Data Source=myhost;Initial Catalog=mydb;User Id=myuser;Password=mypass”);
try
{
using (var comando = new SqlCommand(“SELECT b_traba1.rpe, b_contra.cl_puest, c_puesto.puesto FROM c_puesto, b_traba1, b_contra WHERE b_traba1.rpe=b_contra.rpe AND c_puesto.cl_puest=b_contra.cl_puest GROUP BY b_traba1.rpe, b_contra.cl_puest, c_puesto.puesto ORDER BY b_traba1.rpe”, conn))
{
using (var adaptador = new SqlDataAdapter(comando))
{
var ds = new DataSet();
adaptador.Fill(ds);
var reporte = new ReportDocument();
reporte.Load(Server.MapPath(“Proveedores.rpt”));
reporte.SetDataSource(ds.Tables[0]);
reporte.DataSourceConnections[0].SetConnection(“myhost”, “mydb”, “myuser”, “mypass”);
CrystalReportViewer2.ReportSource = reporte;
} // end using adaptador
} // end using comando
} // end try
catch (Exception ex)
{
Lbl1.Text = ex.Message;
}
finally
{
if (conn.State != ConnectionState.Closed)
conn.Close();
conn.Dispose();
}
}
}
No se por que no sale el código completo en el POST…
No especifique el error en el post pasado, lo siento es este :p…
Mensaje de error del compilador: CS0103: El nombre ‘CrystalReportViewer1′ no existe en el contexto actual
Falta que agregues al webform el control crystalreportviewer (el que se encuentra en la barra de herramientas) y se coloques ese nombre nada mas
Oralé!!! Muchas gracias por tu aporte, quisiera y me pudiesen ayudar con este error:
CrystalReportViewer1.ReportSource = reporte;
Este es el código que tengo:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var conn = new SqlConnection(“Data Source=myhost;Initial Catalog=mydb;User Id=myuser;Password=mypass”);
try
{
using (var comando = new SqlCommand(“SELECT b_traba1.rpe, b_contra.cl_puest, c_puesto.puesto FROM c_puesto, b_traba1, b_contra WHERE b_traba1.rpe=b_contra.rpe AND c_puesto.cl_puest=b_contra.cl_puest GROUP BY b_traba1.rpe, b_contra.cl_puest, c_puesto.puesto ORDER BY b_traba1.rpe”, conn))
{
using (var adaptador = new SqlDataAdapter(comando))
{
var ds = new DataSet();
adaptador.Fill(ds);
var reporte = new ReportDocument();
reporte.Load(Server.MapPath(“Proveedores.rpt”));
reporte.SetDataSource(ds.Tables[0]);
reporte.DataSourceConnections[0].SetConnection(“myhost”, “mydb”, “myuser”, “mypass”);
CrystalReportViewer1.ReportSource = reporte;
} // end using adaptador
} // end using comando
} // end try
catch (Exception ex)
{
Lbl1.Text = ex.Message;
}
finally
{
if (conn.State != ConnectionState.Closed)
conn.Close();
conn.Dispose();
}
}
}
Grax, de muuucha utilidad!! lo implementé sin falla
Hola muchas gracias esta super util este tutorial pero me podrias mostrar el codigo de la clase VisorCR o que tipo de objeto es? Saludos
SALUDOS.. ESTABA REALIZANDO ESTE TUTO, ANTES DE LA PARTE DE “Ya nos aparecerá el servidor, con todas sus tablas, vistas y procedimientos almacenados que podemos usar, dentro del Schema Purchasing veremos la tabla Vendor, seleccionamos la tabla así”…. AL MOMENTO DE DAR CLIC EN SIGUIENTE ME SALIO ESTE ERROR:
La conexion no es posible Detalles: Codigo de error ADO:0x Origen Microsoft SQL Server Native Client 10.0 Descripcion: Named Pipes Provider: Could not open a connection to SQL Server [53]. Estado de SQL 08001 Error nativo:
ME PUEDES AYUDAR A SOLUCIONARLO???
GRACIAS!!!
Fijate principalmente en 3 cosas:
Hola te hago una consulta cuando armo la pagina asp me tira los siguientes errores:
Error 1 No se puede cargar el archivo o ensamblado ‘CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304′ ni una de sus dependencias. El sistema no puede hallar el archivo especificado. C:\Proyectos\academiaPuntoNet\Academia\Web\Default.aspx 2
Error 2 Etiqueta de servidor ‘CR:CrystalReportViewer’ desconocida. C:\Proyectos\academiaPuntoNet\Academia\Web\Default.aspx 12
Error 3 El elemento ‘CrystalReportViewer’ es desconocido. Este desconocimiento puede deberse a un error de compilación en el sitio Web. C:\Proyectos\academiaPuntoNet\Academia\Web\Default.aspx 13 5 C:\…\Web\
Mi codigo asp es:
Página sin título
EXCELENTE EXPLICACIÓN GRACIAS PORQUE EN LA WEB HAY GENTE COMO VOS ME SIRVIO DE MUCHO, QUISAS PODRÍAS PONER COMO EXPORTARLOS A PDF, EXCEL O WORD
Hola Juan, alegra que te haya servidor el tutorial.. ya tenemos creado como exportar a pdf, aqui lo puedes ver:
http://www.devtroce.com/2010/11/03/exportar-directamente-a-pdf-los-reportes-de-crystal-reports-en-asp-net/
Saludos y visitanos pronto
gracias por el aporte me sirvió de mucho