services query expresiones example c# reporting-services parameters reporting subreport

c# - query - reporting services subreport example



Informes de Microsoft: configuración de parámetros de subinforme en el código (7)

¿Cómo puedo establecer un parámetro de un subinforme? Me he conectado exitosamente al evento SubreportProcessing, puedo encontrar el subinforme correcto a través de e.ReportPath y puedo agregar fuentes de datos a través de e.DataSources.Add. Pero no encuentro forma de agregar parámetros de informe?

He encontrado personas que sugieren agregarlas al informe maestro, pero realmente no quiero hacer eso, ya que el informe maestro no debería tener que estar conectado al subinforme, excepto que está envolviendo el informe maestro. subinforme.

Estoy usando un informe como plantilla maestra, imprimiendo el nombre del informe, los números de página, etc. Y el informe integrado será el informe en sí. Y si solo pudiera encontrar una manera de establecer esos parámetros de informe del informe secundario, sería bueno que fuera ...

Aclaración: Crear / Definir los parámetros no es el problema. El problema es establecer sus valores. Pensé que lo más natural era hacerlo en el evento SubreportProcessing. Y los SubreportProcessingEventArgs sí tienen una propiedad Parámetros. ¡Pero es de solo lectura! Entonces, ¿cómo usas eso? ¿Cómo puedo establecer su valor?


Puede agregarlos a través de la definición xml. Uso xml para crear un informe completo basado en subinformes seleccionados y otras opciones. Puedo pegar algún código aquí el lunes si quieres ver esto como una posible solución.

Editar: puede establecer valores en el subinforme en el XML antes de implementar el informe. Esto no es muy flexible y estoy asumiendo que si desea solicitar estos valores, lo más probable es que los necesite en el informe principal.

Si desea ver cómo es el XML, agregue un subinforme, ingrese valores para él en las propiedades del informe> parámetros, luego haga un código de vista.

<Subreport Name="subreport1"> <Parameters> <Parameter Name="StartDate"> <Value>=Parameters!StartDate.Value</Value> </Parameter> <Parameter Name="EndDate"> <Value>1/1/2009</Value> </Parameter>

¡En lugar de usar los = Parámetros! StartDate.Value Supongo que querrá poner un valor real como en EndDate.


Después de mirar y mirar, he llegado a la conclusión de que no es posible establecer los parámetros de un subinforme en código. A menos que haga algo que le guste, comience a editar el xml de la definición del informe antes de cargarlo o algo así.

(Pero si alguien más debe saber que estoy equivocado, por favor responda, ¡porque todavía tengo mucha curiosidad por saberlo!)


Funciona, pero seguro es persistente.

Lo primero que recomiendo es desarrollar sus informes como .rdl. Mucho más fácil probar los informes de esta manera. También puede configurar los parámetros del subinforme y probarlos como rdl, asegurándose de que cada parámetro del informe integrado también se defina como un parámetro del informe principal. Una vez que obtenga los informes, incluidos los subinformes, trabajando de esa manera, puede cambiar el nombre de .rdl a rdlc y agregar los archivos rdlc a su proyecto de ReportViewer. No se requieren más cambios. Utilice los nombres de las fuentes de datos rdl como nombres de fuente de datos en su código para proporcionar datos al informe en el controlador de eventos SubreportProcessing.

No asigna valores al parámetro pasado. El subinforme los usará como está. (Parece que el paso que le falta es agregar los parámetros al informe principal y al subinforme como se mencionó anteriormente). Puede evaluar los parámetros y usarlos como parámetros de consulta para obtener el origen de datos que agregará. Debe pensar en la fuente de datos como en una dimensión no descubierta para un subinforme. Tendrás que hurgar mientras depuramos en el controlador de eventos para ver a qué me refiero. Algunos de los valores en su aplicación estarán fácilmente disponibles, otros que use fácilmente en cualquier otro lugar arrojarán excepciones de objetos no encontrados. Por ejemplo, creo un conjunto de datos en una instancia de una clase creada en el formulario principal de mi aplicación. Uso el conjunto de datos en mi aplicación. En el controlador de eventos SubreportProcessing no puedo usar el conjunto de datos común, por lo que debo crear una nueva instancia de la tabla que necesito para el informe y llenarlo. En el informe principal, podría acceder al conjunto de datos común. Hay otras limitaciones como esta. Sólo tienes que abrirse camino.

Aquí está el controlador de eventos SubreportProcessing de una aplicación VB.NET ReportViewer en funcionamiento. Muestra algunas formas diferentes de obtener el origen de datos para un subinforme. subinforme1 crea una tabla de datos de una fila desde los objetos comerciales de la aplicación, el subinforme2 proporciona los datos que el informe requiere sin un parámetro, subinforme3 es el subinforme de mentira2 pero evalúa uno de los parámetros pasados ​​alinforme para su uso en el valor de fecha requerido por la consulta que crea ReportDataSource.

Public Sub SubreportProcessingEventHandler(ByVal sender As Object, _ ByVal e As SubreportProcessingEventArgs) Select Case e.ReportPath Case "subreport1" Dim tbl As DataTable = New DataTable("TableName") Dim Status As DataColumn = New DataColumn Status.DataType = System.Type.GetType("System.String") Status.ColumnName = "Status" tbl.Columns.Add(Status) Dim Account As DataColumn = New DataColumn Account.DataType = System.Type.GetType("System.String") Account.ColumnName = "Account" tbl.Columns.Add(Account) Dim rw As DataRow = tbl.NewRow() rw("Status") = core.GetStatus rw("Account") = core.Account tbl.Rows.Add(rw) e.DataSources.Add(New ReportDataSource("ReportDatasourceName", tbl)) Case "subreport2" core.DAL.cnStr = My.Settings.cnStr core.DAL.LoadSchedule() e.DataSources.Add(New ReportDataSource("ScheduledTasks", _ My.Forms.Mother.DAL.dsSQLCfg.tSchedule)) Case "subreport3" core.DAL.cnStr = My.Settings.cnStr Dim dt As DataTable = core.DAL.GetNodesForDateRange(DateAdd("d", _ -1 * CInt(e.Parameters("NumberOfDays").Values(0)), _ Today), _ Now) e.DataSources.Add(New ReportDataSource("Summary", dt)) End Select End Sub


Svish: no estoy seguro de qué lado de la tubería está teniendo problemas.

Para agregar parámetros al informe principal, ábralo y luego haga clic derecho en el subinforme y seleccione Propiedades> Parámetros.

A continuación, puede definir nombres de parámetros y asignarles un valor, por ejemplo

Parameter Name | Parameter Value ---------------+--------------------- MyParameter | =Fields!Params.Value

Entonces, en este lado de la tubería, los parámetros obtienen su valor del origen de datos del informe principal.

Para agregar parámetros a un subinforme, abra el subinforme y, en la barra de herramientas, seleccione Informe> Parámetros del informe

Aquí define un parámetro para recibir el parámetro del informe principal, por ejemplo

Name | myParameter ----------+--------------------- Data Type | String

Por lo que parece que quieres hacer, ¿no puedes eliminar un informe integrado y solo tener el informe de todos modos? La información que está intentando incluir en el informe parece ideal para incluirla en los encabezados y pies de página del informe.


Tuve un problema similar en el sentido de que necesitaba pasar un valor de Properties.Settings .... antes de la ruta en la base de datos. Para hacer esto, tuve que establecer una propiedad en el informe principal y usar esa propiedad para establecer la segunda propiedad en el subinforme. Establecer la propiedad principal, a su vez, establece la propiedad del subinforme. PUEDE establecer la propiedad principal en el código de la siguiente manera:

Supongamos que tiene un nombre de ReportViewer rv, luego codificaríamos:

var rp = new ReportParameter("MainReportParamName", Properties.Settings....); rv.LocalReport.SetParameters(new ReportParameters[] { rp });


Recientemente tuve el mismo problema y con toda la búsqueda no encontré nada útil, pero finalmente llegué a una solución para esto.

Creé una clase con todos los parámetros en el subinforme como sus propiedades (podemos llamarlo DTO)

public class MyDto { public string EmployeeFirstName{get; set;} public string EmployeeLastName{get; set;} // and so on }

Luego usó una lista de este tipo como otra fuente de datos en el informe principal y luego en ''Propiedades de subinforme'' agregó un parámetro para cada parámetro en el subinforme real y eligió los campos correspondientes de la fuente de datos como sus valores.

luego, al cargar el informe, convierta la entrada (lista de Empleados) a una lista de MyDto y configúrelo como el origen de datos de los informes:

private void LoadReport(List<Employee> employees) { reportviewerMain.ProcessingMode = ProcessingMode.Local; reportviewerMain.LocalReport.ReportPath = Application.StartupPath + "//Reports//PayChecksReport.rdlc"; List<MyDto> employeesDataSource = employees.ConvertAll<MyDto>(emp => new MyDto { EmployeeFirstName = emp.FirstName, EmployeeLastName = emp.LastName}).ToList(); reportviewerMain.LocalReport.DataSources.Add(new ReportDataSource("EmployeesDataSet", employeesDataSource)); Organization myOrganization = new OranizationFacade().GetOrganizationInfo(); reportviewerMain.LocalReport.SetParameters(new ReportParameter("OrganizationName", myOrganization.Name)); this.reportviewerMain.RefreshReport(); }

Y...

Me funcionó a mí :) Espero que ayude a alguien.


Sé que esta es una vieja pregunta que ha sido marcada como respondida, pero como estaba buscando esto hoy y vi que se había comentado en los últimos meses, pensé que podría enviar una respuesta de seguimiento en.

Para representar el subinforme en el contexto de cada registro en el informe principal, debe declarar un SubreportProcessingEventHandler y luego dentro de ese manejador cargar el DataSet para cada instancia del subinforme a medida que se produce. SubreportProcessingEventArgs tiene una colección de parámetros que se pasa desde el informe principal cuando se desencadena el evento.

Por lo tanto, si ha configurado los parámetros del informe integrado en el informe principal con parámetros nombrados vinculados a los campos en el informe principal, los valores estarán accesibles a medida que se genere el informe integrado.

Aquí hay una muy buena redacción que explica mucho más claramente.