reporting-services - expresiones - round reporting services
Código personalizado en el informe de Reporting Services (7)
En Reporting Services, me gustaría agregar un parámetro que contenga datos de un bloque de código personalizado. Idealmente, podría ejecutar el siguiente código (este es un ejemplo de prueba simple):
Function GetPeriods() As String()
Dim values As System.Collections.ArrayList =
New System.Collections.ArrayList()
For i as integer = 1 to 24
values.Add(i)
Next
Return values.ToArray()
End Function
y ponga lo siguiente en el "Campo de texto" del parámetro:
=Code.GetPeriods()
Sin embargo, cuando ejecuto el informe, el parámetro al que aplico esto está deshabilitado y vacío. ¿Hay alguna técnica diferente que deba usarse? ¿O estoy haciendo algo mal?
Todo lo que he visto requiere parámetros y sus respectivas configuraciones para ser parte del RDL.
Dicho esto, si va a "codificar" los valores, puede crear un conjunto de datos solo para el informe, tal vez en XML, o si necesita ser controlado por programación, hágalo en un servicio web.
Si está utilizando SQL 2008 Reporting Services, puede echarle un vistazo a esta página que presenta el concepto de usar conjuntos personalizados.
Si está utilizando SQL 2005 Reporting Services, este enlace es el que desea.
Es algo básicamente trivial, simplemente compila tu código en una biblioteca de clases y sigue las instrucciones provistas para permitir que tu informe lo haga referencia.
Está devolviendo un elemento de matriz (una matriz de cadenas) en un campo de texto. En cambio, intente devolver una cadena simple. Eso debería funcionar. Si aún desea devolver una lista de matriz, básicamente debe vincularla a un control de lista en su RDL. Definitivamente puede hacer eso con las extensiones del conjunto de datos. Sin embargo, no estoy seguro si hay alguna otra manera fácil. Compruebe las propiedades del control de lista y vea si le permite vincular directamente a una lista de matriz.
Puede crear el mismo procedimiento almacenado en SQL Server y cargar valores de parámetros desde ese procedimiento.
Para acceder a sus miembros / funciones implementadas en el código personalizado del informe de SSRS, debe establecer el modificador de acceso como "Público":
Public Function GetPeriods() As String
...
ver artículo Escribir código personalizado en SQL Server Reporting Services
He intentado hacer lo mismo, establecer una lista simple de valores de parámetros del código del informe. Ninguno de los enlaces en ninguna de estas respuestas muestra cómo hacer esto y después de investigarlo un poco, no creo que sea posible. Sí, es posible obtener los valores de una consulta de base de datos, de un servicio web o de un ensamblaje personalizado, pero cada uno de estos crea una gran cantidad de gastos generales en comparación con obtener la lista de una llamada a función simple como = Code.GetValues () , donde la función usa un bucle For para crear los valores.
msvcyc está correcto al señalar que el parámetro espera un valor de cadena, pero la función devuelve una matriz. Cambié el tipo de devolución a Matriz según lo sugerido por prashant sable, pero la lista de selección todavía está atenuada, no funciona. Y Coldice está en lo cierto al decir que el modificador de acceso debe ser público.
En mi búsqueda descubrí un artículo de James Kovac de 2005 que señalaba por qué esto no era posible. La clase Parameters tiene un método get, pero no un método set. En el navegador de objetos VS 2008 para SSRS 2008, el nombre del objeto ha cambiado, pero todavía no contiene un método set (vea Microsoft.ReportingServices.Interfaces.IParameter.Name o .Value).
Mi solución actual es simplemente codificar la lista de valores, pero si su lista de valores debe ser dinámica, sus únicas opciones son consultas de bases de datos, servicios web o ensamblajes personalizados. Creo que la solución más fácil de estos tres es obtener los valores del motor de la base de datos, como lo sugiere oleksiy.t, siempre que pueda escribir una consulta para devolver la lista de valores que desee. Tu lista de enteros, o mi lista de intervalos de tiempo, serían consultas fáciles de escribir. De lo contrario, deberá usar una de las otras dos soluciones.
Revisé tu código. Lo único que está mal es que tu función devuelve String()
. Cuando cambié la firma de su método para devolver Array
, funcionó bien, en mi informe.
Cambiar la firma a la Function GetPeriods() As Array