ORIGENES DE DATOS Un informe (.rdlc) incluye elementos de conjunto de datos que definen la estructura de los orígenes de datos que utiliza el informe. Se debe agregar uno o varios conjuntos de datos al informe antes de poder usar los datos en la definición de informe. Después de crear un conjunto de datos puede arrastrar un campo específico hasta una región de datos o un cuadro de texto en el informe. Para insertar un nuevo origen de datos, pulsaremos en “Nuevo/Conjunto de datos…”. Tenemos la posibilidad de crear orígenes de datos a partir de tablas, vistas, clases, servicios Web, entre otros, pero en este curso nos centraremos en vistas y clases. ORIGEN DE DATOS DESDE UNA VISTA Si aún no tenemos el origen de datos, crearemos uno nuevo y elegiremos la conexión (creando una nueva en el caso de que no exista todavía). Elegimos que incluya los datos confidenciales en la cadena de conexión, el nombre que le queremos dar y la vista que queremos utilizar. En la imagen siguiente podemos ver el resultado, con los datos que se va a traer de la vista: Y en el panel de datos del informe, aparecerán dichos datos para poder arrastrarlos al informe. ORIGEN DE DATOS DESDE UNA CLASE DE OBJETOS Para utilizar este tipo de origen de datos debemos elegir la opción “global” y el método a utilizar. Si no aparece puede ser causado por: -La clase que se quiere utilizar es estática. Para utilizar una clase como origen de datos, esta no deberá ser estática debido a que el informe debe instanciarla para poder obtener sus campos. -El método no devuelve una colección Innumerable (listas, vectores,…). -No hemos compilado el proyecto después de crear la clase. ENLAZAR DATOS A UN INFORME Con el origen de datos le hemos dicho al informe que campos debe esperar, pero no se los hemos enviado. Los informes (.rdlc) están enlazados a objetos DataSet u clases que contienen los datos que necesita. Para enlazar los datos disponemos de varias formas, automática o manualmente, las cuales vamos a ver a continuación. ENLAZAR DATOS MEDIANTE ASISTENTE Una vez elegido el informe en el ReportViewer, se nos da la oportunidad de elegir el origen de datos a enlazar mediante un asistente. Veamos como utilizarlo: Pulsamos sobre la opción de “Elegir orígenes de datos” y nos aparece el siguiente cuadro, en el cual, elegiremos “Nuevo origen de datos”. Aquí es donde elegiremos entre los distintos tipos de datos (Dase de datos para vistas, Objeto para Clases). DATOS DESDE VISTAS Si queremos obtener los datos desde una vista, una vez seleccionada la opción de Base de datos, seleccionaremos la conexión, y la vista con sus filtros. DATOS DESDE CLASES Si queremos obtener los datos desde una clase, después de elegir “Objeto” como tipo de dato, debemos de elegir que clase nos va a devolver los datos. Debemos desmarcar la opción de “Mostrar sólo componentes de datos” para que nos aparezcan nuestras clases. Elegiremos el método que devuelve los datos, y nos dará la opción de aplicar un filtro para el método. Es muy importante que apliquemos el mismo origen de datos, tanto en el informe, como al enlazar los datos. Es decir, si elegimos utilizar el origen de datos desde una Clase, debemos de hacerlo en ambos sitios. ENLAZAR DATOS MANUALMENTE Enlazar manualmente los datos tiene mucha mas potencia que hacerlo automáticamente. Por ejemplo, podemos elegir dinámicamente que informe utilizar, o que datos cargar. Para ello, lo único que necesitamos recordar, es que nombre le hemos dado al origen de datos del informe (Dataset1 en nuestro caso). El objeto ReportViewer tiene una colección DataSources con la que jugaremos para cambiar los datos del informe. El código para cambiar el origen de datos es el siguiente: ReportViewer1.LocalReport.DataSources.Clear(); ReportViewer1.LocalReport.DataSources.Add(miOrigenDeDatos); ReportViewer1.LocalReport.ReportPath = "NombreReport.rdlc"; ReportViewer1.LocalReport.Refresh(); La primera instrucción nos limpia cualquier origen de datos que pudiese estar enlazado al informe y la segunda agrega uno nuevo. La tercera instrucción especifica el informe que deseamos utilizar, refrescándolo mediante la última instrucción. DATOS DESDE VISTAS Simplemente se debe crear un método que acceda a la base de datos y nos devuelva los datos que deseemos ya filtrados. (1)ClaseOracleBD baseDatos = new ClaseOracleBD(); (2)baseDatos.CadenaConexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString; (3)baseDatos.TextoComando = "SELECT * FROM CURSONET.VREPORT_ALUCURSO WHERE NIF = :pNIF"; (4)baseDatos.CrearParametro("NIF", OracleType.VarChar, ParameterDirection.Input, parametro.Length, parametro); (5)OracleDataAdapter da = baseDatos.DataAdapter; (6)DataSet ds = new DataSet(); (7)da.Fill(ds); (8)ReportDataSource dataSourceInforme = new ReportDataSource("DataSet1", ds.Tables[0]); (9)ReportViewer1.LocalReport.DataSources.Clear(); (10)ReportViewer1.LocalReport.DataSources.Add(dataSourceInforme); (11)ReportViewer1.LocalReport.ReportPath = "informe/Report3.rdlc"; (12)ReportViewer1.LocalReport.Refresh(); (13)baseDatos.Close(); A continuación se explica el código: 1) Instanciamos el objeto de conexión. 2) Creamos la conexión. 3) Le pasamos al objeto la sentencia a ejecutar. 4) Le pasamos el parámetro de filtro (si existe). 5) Introducimos los resultados en un objeto OracleDataAdapter. 6) Creamos el objeto DataSet. 7) Introducimos los datos en el DataSet desde el OracleDataAdapter. 8) Creamos el enlace a los datos del informe. 9) Borramos todos los posibles enlaces de datos que existieran en el ReportViewer. 10) Asignamos en enlace de datos creado al ReportViewer. 11) Indicamos cual es el informe. 12) Refrescamos el ReportViewer para que pinte el resultado. 13) Cerramos la conexión del objeto de conexión. DATOS DESDE CLASES El código, al utilizar clases, se simplifica mucho porque la conexión está en la clase. (1)ReportViewer1.LocalReport.DataSources.Clear(); (2)ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSetCurso", new ClaseAluCursos().Filtrar(""))); (3)ReportViewer1.LocalReport.ReportPath = "Report.rdlc"; (4)ReportViewer1.LocalReport.Refresh(); 1) Limpiamos los enlaces de datos. 2) Agregamos la nueva conexión de datos. Para ello, hacemos una llamada a la clase que contiene los datos. El nombre del DataSet debe coincidir con el de origen de datos del informe. 3) Asignamos el informe al ReportViewer. 4) Pintamos el ReportViewer. Al código de ambos casos, se le debe especificar que actúe solamente en la primera llamada. En caso contrario, como el objeto ReportViewer trabaja internamente en Ajax, entrará en un bucle, y no lograremos ver datos. if (!IsPostBack) { ... }