2009-05-20 31 views
8

Estoy trabajando en un informe bastante complejo en Sql Server Reporting Services. Mi SP devuelve un número dinámico de columnas, cada una de las cuales recibe un nombre dinámico.¿Cómo puedo representar un número desconocido de columnas en SSRS?

Básicamente, piense en una aplicación de mantenimiento de tiempo. Cada columna que es dinámica representa un intervalo de tiempo en el que se cargó el tiempo para ese equipo. Si no se le cobró un tiempo a ese depósito durante el período de tiempo que cubre el informe, no se muestra. Cada cubo tiene su propio identificador que necesito que sean los encabezados de las columnas.

Tengo un SP que devuelve todo esto. Lo hace haciendo un poco de SQL dinámico con una declaración ejecutiva (fea, pero sé que estoy en SQL 2000 para que una opción PIVOT no funcione)

Puedo tener un número indefinido de cubos y cualquiera podría mostrar.

Encontré esto - http://www.codeproject.com/KB/reporting-services/DynamicReport.aspx - que es útil pero en el ejemplo tiene un número finito de columnas y simplemente las oculta o las muestra según cuáles tienen valores. En mi caso, tengo un número variable de columnas, así que de alguna manera necesito el informe para agregar columnas.

¿Alguna idea?

+0

podríamos ver un ejemplo o dos de su ¿datos? es probable que lo que está haciendo con las columnas dinámicas podría convertirse en columnas permanentes o en filas de datos. – DForck42

+0

No estoy en el trabajo por el momento, pero tenía dos versiones de este elaborado. Uno usa columnas dinámicas, el otro es la versión más "relacional" en la que hago retroceder cada uno en su propio conjunto de datos y se relacionan con otro. Eso es muy posible, pero parece que no puedo encontrar una forma en SSRS para representar esas filas de datos como columnas (esencialmente pivotarlas) – JoshReedSchramm

Respuesta

9

Siempre que conozca un número máximo de columnas, es posible hacerlo de una manera.

Primero, nombre las columnas con un resultado de su consulta, para que pueda pasarlas a la consulta o derivarlas allí. En segundo lugar, simplemente construya el informe como si tuviera el número máximo de columnas, y escóndalas si están vacías.

Por ejemplo, tuve que crear un informe que informara los números de ventas mensuales por hasta un año, pero los meses no necesariamente comenzaban en enero. Le pasé el nombre del mes en una columna, seguido de los números de mi informe. En .rdl, construí 12 conjuntos de columnas, una para cada mes posible, y acabo de utilizar una expresión para ocultar la columna si estaba vacía. El resultado es que el informe parece expandirse al número de columnas necesarias.

Por supuesto, no es realmente dinámico en el sentido de que puede expandirse tanto como lo necesite sin conocer el límite superior.

+0

esto es exactamente lo que terminé haciendo. Lamentablemente, el proyecto se eliminó, por lo que nunca actualicé esta respuesta y olvidé lo que hice. Gracias. – JoshReedSchramm

0

He tenido la necesidad de hacer esto en el pasado y la conclusión a la que llegué es "no se puede", sin embargo, no estoy seguro de eso. Si encuentra una solución, me gustaría amor para enterarse.

Un problema que viene a la mente es que debe definir el informe utilizando los nombres de las columnas que va a recuperar del proceso almacenado, y si no conoce esos nombres o cuántos hay allí son, ¿cómo se puede definir el informe?

La única idea que tenía sobre cómo hacer esto es crear dinámicamente la definición del informe (archivo .rdl) a través de C#, pero en ese momento, no pude encontrar una API de MS para hacerlo, y duda uno existe ahora. Encontré uno de código abierto, pero no seguí esa ruta.

+0

Marcar como la respuesta correcta porque, bueno, nunca terminamos resolviendo esta dada la plataforma estábamos encendidos y limitaciones. Terminamos cambiando el requisito. – JoshReedSchramm

4

Cree 2 conjuntos de datos relacionados, el primero para el contenido del informe y el segundo para la lista de sus etiquetas de columna.

El conjunto de datos del contenido del informe debe tener un número fijo de columnas y un nombre. Puede asignar un número máximo de columnas.

En este ejemplo tengo las primeras 2 columnas como fijas, o siempre visibles, y un máximo de 4 columnas para mostrarse por elección a través de un parámetro multivalor, o depende de las condiciones de la consulta. Y como siempre, podemos tener un total también. Por lo tanto, puede tener este aspecto:

Fixed01, Fixed02, Dyna01, Dyna02, Dyna03, Dyna04, Total 

El segundo conjunto de datos con sus valores se verá así:

Name Label 
---- ----- 
Dyna01 Label01 
Dyna02 Label02 
Dyna03 Label03 

He omitido la cuarta etiqueta para demostrar que no todas las columnas están siendo utilizados por una cierta condición de consulta. Recuerde que ambos conjuntos de datos están destinados a estar relacionados con la misma consulta.

Ahora crea un parámetro llamado, por ejemplo, @columns; llene sus valores disponibles y valores predeterminados con el segundo conjunto de datos.

Para cada uno de esos 4 columnas dinámicas, establezca la visibilidad de la columna con la siguiente expresión:

=IIf(InStr(join(Parameters!columns.Value,","),"Dyna01"),false,true) 

Y para cada uno de sus cuadros de texto de encabezado de columna, utilice la siguiente expresión:

=Lookup("Dyna01", Fields!Name.Value, Fields!Label.Value, "dsColumns") 

En cuanto al Total, esta es la expresión de su visibilidad:

=  IIf(InStr(join(Parameters!columns.Value, ","), "Dyna01"), false, true) 
AndAlso IIf(InStr(join(Parameters!columns.Value, ","), "Dyna02"), false, true) 
AndAlso IIf(InStr(join(Parameters!columns.Value, ","), "Dyna03"), false, true) 
AndAlso IIf(InStr(join(Parameters!columns.Value, ","), "Dyna04"), false, true) 

Y aquí está para sus valores:

= IIf(InStr(join(Parameters!columns.Value, ","), "Dyna01"), Fields!C01.Value, 0) 
+ IIf(InStr(join(Parameters!columns.Value, ","), "Dyna02"), Fields!C02.Value, 0) 
+ IIf(InStr(join(Parameters!columns.Value, ","), "Dyna03"), Fields!C03.Value, 0) 
+ IIf(InStr(join(Parameters!columns.Value, ","), "Dyna04"), Fields!C04.Value, 0) 

Eso es todo, espero que ayude.

Bono, que el segundo conjunto de datos, dsColumns, también puede contener otros atributos de la columna, tales como: color, ancho, fuentes, etc.

4

Creo que la mejor manera de hacerlo es añadir todas las columnas de la tabla y edite la propiedad de visibilidad de la misma con la ayuda de los argumentos que obtiene de su SP ... esto resolverá el propósito de la columna dinámica, pero al ver el informe obtendrá una gran cantidad de espacio en blanco que puede resolver con SSRS - Keep a table the same width when hiding columns dynamically? y su informe estará listo

0

ahora qué pasa si hay un número incierto de columnas, digamos si tengo fechas como nombres de columna que pueden muy según los criterios de selección del informe, por ejemplo, columnas pueden ser como: nombre, [2013-05-03], [2013-05-04], [2013-05-05] .....

Cuestiones relacionadas